Ignore:
Timestamp:
Feb 22, 2009, 11:55:30 AM (17 years ago)
Author:
cmv
Message:

un essai + raffine pour imprimer les variables: nouvelle routine cval_dble2str(double v). cmv 22/02/2009

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/SophyaLib/SysTools/commander.cc

    r3577 r3581  
    2121// Pour ecrire une valeur double sous forme de string
    2222// sans perte de precision, et si possible de maniere
    23 // lisible (%g, sinon %.17e) 
    24 static char cval_strbuff_[64];
     23// lisible (%g, sinon format adapte jusqu'a %.17e) 
     24static char cval_strbuff_[80];
     25////1er essai binaire: char * cval_dble2str(double v)
     26////1er essai binaire: {
     27////1er essai binaire:   char* str1 = cval_strbuff_; 
     28////1er essai binaire:   sprintf(str1,"%g",v);
     29////1er essai binaire:   char* str2 = cval_strbuff_+32;       
     30////1er essai binaire:   sprintf(str2,"%.17e",v);
     31////1er essai binaire:   double x1 = atof(str1);
     32////1er essai binaire:   double x2 = atof(str2);
     33////1er essai binaire:   double fx = fabs(v);
     34////1er essai binaire:   if (fx>0. && fabs(x2-x1)/fx>1e-12)  return str2;
     35////1er essai binaire:   else return str1;
     36////1er essai binaire: }
    2537char * cval_dble2str(double v)
    2638{
    27   char* str1 = cval_strbuff_; 
    28   sprintf(str1,"%g",v);
    29   char* str2 = cval_strbuff_+32;       
    30   sprintf(str2,"%.17e",v);
    31   double x1 = atof(str1);
    32   double x2 = atof(str2);
    33   double fx = fabs(v);
    34   if (fx>0. && fabs(x2-x1)/fx>1e-12)  return str2;
    35   else return str1;
     39 char* strgood = cval_strbuff_;        sprintf(strgood,"%g",v);
     40 char* strfull = cval_strbuff_+32;     sprintf(strfull,"%.17e",v);
     41 char* strform = cval_strbuff_+64;
     42 double x1 = atof(strfull), fx = fabs(x1);
     43 if(fx>0.) {
     44   for(int i=7;i<=17;i+=2) {  // increment de 2 pour aller + vite
     45     double x2 = atof(strgood);
     46     if(fabs(x2-x1)/fx<1.e-16) break;
     47     sprintf(strform,"%%.%de",i);
     48     sprintf(strgood,strform,v);
     49   }
     50 }
     51 return strgood;
    3652}
    3753//--------------------------------------------------
     
    121137  if ( (args[1] == "(") && (args[args.size()-1] == ")") ) {
    122138    // foreach varname ( w1 w2 w3 ... )
    123     for(int kk=2; kk<args.size()-1; kk++) strlist.push_back(args[kk]);
     139    for(unsigned int kk=2; kk<args.size()-1; kk++) strlist.push_back(args[kk]);
    124140  }
    125141  else {
     
    170186CommanderBloc::~CommanderBloc()
    171187{
    172 for(int k=0; k<blocs.size(); k++) delete blocs[k];
     188for(unsigned int k=0; k<blocs.size(); k++) delete blocs[k];
    173189}
    174190
     
    195211if (typ == BT_ForeachLineInFile) {  // foreach line in file loop
    196212  ifstream is(filename.c_str());
    197   char buff[256];
    198213  string line;
    199214  while (!is.eof()) {
    200     /* Reza, Juin 2005 : Remplace par getline(istream, string) - plus sur
    201        is.getline(buff, 256); line += buff;  */
    202215    rcc = 0;
    203216    line = "";
     
    211224}
    212225else if (typ == BT_ForeachList) {  // foreach string loop
    213   for(k=0; k<strlist.size(); k++) {
     226  for(unsigned int k=0; k<strlist.size(); k++) {
    214227    rcc = ExecuteOnce(strlist[k]);
    215228    if (rcc == CMD_BREAKEXE_RC)  return rcc;
     
    250263int CommanderBloc::ExecuteOnce(string& lvv)
    251264{
    252   int kj=0;
     265  unsigned int kj=0;
    253266  int kk=0;
    254267  int rcc = 0;
     
    341354int CommanderScript::Execute(vector<string>& args)
    342355{
    343   int rcc;
     356  int rcc=-2;
    344357  if (!CheckScript()) return(-1);
    345358  cout << " CommanderScript::Execute() - Executing script " << Name() << endl;
    346   for(int k=0; k<lines.size(); k++) {
     359  for(unsigned int k=0; k<lines.size(); k++) {
    347360    rcc = _commander->Interpret(lines[k]);
    348361    if ( (rcc == CMD_BREAKEXE_RC) || (rcc == CMD_RETURN_RC) ) break;
     
    10671080      if (tokens.size() > 2) {
    10681081        string sex = tokens[1];
    1069         for(int js=2; js<tokens.size(); js++)  sex += tokens[js];
     1082        for(unsigned int js=2; js<tokens.size(); js++)  sex += tokens[js];
    10701083        CExpressionEvaluator cex(sex);
    10711084        res = cex.Value();
     
    13311344  }
    13321345  vv = ArgsStack.top()[0];
    1333   for(int ssk=1; ssk<ArgsStack.top().size(); ssk++)  vv += ArgsStack.top()[ssk];
     1346  for(unsigned int ssk=1; ssk<ArgsStack.top().size(); ssk++)  vv += ArgsStack.top()[ssk];
    13341347  return(true);
    13351348}
     
    13401353    vv = ""; return(false);
    13411354  }
    1342   if ( (ka < 0) || (ka >= ArgsStack.top().size()) ) {
     1355  if ( (ka < 0) || (ka >= (int)ArgsStack.top().size()) ) {
    13431356    cerr << " Commander::Var2Str/Error: ArgsStack index <0 or >=args.size()  ! "
    13441357         << " ($" << vn << ")" << endl;
     
    14371450  vv = (*it).second[0];
    14381451  if ((*it).second.size() > 1) {   
    1439     for(int k=1; k<(*it).second.size(); k++) {
     1452    for(unsigned int k=1; k<(*it).second.size(); k++) {
    14401453      vv += ' ';  vv += (*it).second[k];
    14411454    }
     
    14501463  CmdVarList::iterator it = variables.find(vn);
    14511464  if (it == variables.end())  return false;
    1452   if ((idx < 0) || (idx > (*it).second.size()-1))
     1465  if ((idx < 0) || (idx > (int)(*it).second.size()-1))
    14531466    return false;
    14541467  vv = (*it).second[idx];
     
    15111524  }
    15121525  else {
    1513     if (idx >= (*it).second.size())
     1526    if (idx >= (int)(*it).second.size())
    15141527      for(int j=(*it).second.size(); j<=idx; j++)  (*it).second.push_back("");
    15151528    (*it).second[idx] = val;
     
    18051818  }
    18061819  string xx = tokens[1];
    1807   for (int kk=2; kk<tokens.size(); kk++)  xx += (' ' + tokens[kk]);
     1820  for (unsigned int kk=2; kk<tokens.size(); kk++)  xx += (' ' + tokens[kk]);
    18081821  mAliases[tokens[0]] = xx;
    18091822}
     
    18321845}
    18331846else if (kw == "echo") {
    1834   for (int ii=0; ii<tokens.size(); ii++)
     1847  for (unsigned int ii=0; ii<tokens.size(); ii++)
    18351848    cout << tokens[ii] << " " ;
    18361849  cout << endl;
     
    18421855  }
    18431856  ofstream ofs(tokens[0].c_str(), ios::app);
    1844   for (int ii=1; ii<tokens.size(); ii++)
     1857  for (unsigned int ii=1; ii<tokens.size(); ii++)
    18451858    ofs << tokens[ii] << " " ;
    18461859  ofs << endl;
     
    19481961  if (tokens.size() < 1) { cout << "Commander::Interpret() Usage: shell cmdline" << endl;  return(0); }
    19491962  string cmd;
    1950   for (int ii=0; ii<tokens.size(); ii++)
     1963  for (unsigned int ii=0; ii<tokens.size(); ii++)
    19511964    cmd += (tokens[ii] + ' ');
    19521965  system(cmd.c_str());
     
    19551968  if(tokens.size()<1) {cout<<"Commander::Interpret() Usage: cshell cmdline"<<endl; return(0);}
    19561969  string cmd="";
    1957   for(int ii=0;ii<tokens.size();ii++) cmd+=(tokens[ii]+' ');
     1970  for(unsigned int ii=0;ii<tokens.size();ii++) cmd+=(tokens[ii]+' ');
    19581971  CShellExecute(cmd);
    19591972  }
     
    22032216static void check_latex_reflabel(string & prl)
    22042217{
    2205   for(int k=0; k<prl.length(); k++)
     2218  for(unsigned int k=0; k<prl.length(); k++)
    22062219    if (! isalnum(prl[k]) )  prl[k] = 'Z';
    22072220}
     
    22112224{
    22122225  string rs;
    2213   for(int k=0; k<mot.length(); k++) {
     2226  for(unsigned int k=0; k<mot.length(); k++) {
    22142227    if (mot[k] == '_')  rs += "\\_";
    22152228    else rs += mot[k];
Note: See TracChangeset for help on using the changeset viewer.