MatOCAD Logo

Main Page | Class Hierarchy | Class List | Directories | File List | Class Members | File Members | Related Pages

TParserScomponi.cpp

Go to the documentation of this file.
00001 #include "../../include/Parser/TParserScomponi.h"
00002 
00003 //**************************************************************************
00004 /*
00005   * Nome funzione:     Libera_Memoria
00006   * Parametri:         vettore_riferimenti:  struttura contenente il la funzione scomposta
00007                                              da deallocare
00008 
00009   * Valori di ritorno: nessuno
00010   * Descrizione:       quando richiamata libera la memoria precedentemente occupata
00011                        dalla struttura dati
00012 */
00013 //**************************************************************************
00014 
00015 void TParserScomponi::Libera_Memoria(rif* vettore_riferimenti)
00016  { int indice_rif,indice_scomp,i;
00017  for (indice_rif=1;indice_rif<=vettore_riferimenti->numero_scomposizioni;indice_rif++)
00018   {
00019     for (indice_scomp=1;indice_scomp<=(vettore_riferimenti+indice_rif-1)->lunghezza_scomp;indice_scomp++)
00020      {
00021        i=0;                     //Mi occupo di svuotare la matrice
00022       while(i<(((vettore_riferimenti+indice_rif-1)->scomposizioni)+indice_scomp-1)->n_colonne)
00023         {   free(*((((vettore_riferimenti+indice_rif-1)->scomposizioni)+indice_scomp-1)->scomposizione+i));
00024            i++;
00025         }
00026 
00027       free((((vettore_riferimenti+indice_rif-1)->scomposizioni)+indice_scomp-1)->scomposizione);
00028 
00029      }
00030 
00031       free((vettore_riferimenti+indice_rif-1)->scomposizioni);
00032       free((vettore_riferimenti+indice_rif-1)->descrizione);
00033   }
00034   free(vettore_riferimenti);
00035 }
00036 
00037 
00038 
00039 
00040 
00041 
00042  //--------------sub che gestisce un eventuale assegnazione------------------
00043 /*
00044   * Nome funzione:     Gestione_assegnazione
00045   * Parametri:         funzione   stringa che contiene l'espressione presa in
00046                                   input
00047                        errore    0  Š presente almeno 1 errore nella stringa
00048                                      di assegnazione
00049                                  1  non Š presente nessun errore nella stringa
00050                                     di assegnazione
00051   * Valori di ritorno:           1  Š stata effettuata un assegnazione
00052                                  0  non Š stata effettuata un assegnazione
00053   * Descrizione:      funzione che rileva all'interno dell'espressione
00054                       matematica un eventuale stringa di assegnazione
00055                       (f(x):=sin(x) la stringa di assegnazione Š = f(x)),
00056                       ne effettua ad un controllo della sintassi e salva le
00057                       variabili in una opportuna struttura dati
00058 */
00059 //**************************************************************************
00060 
00061 
00062 int TParserScomponi::Gestione_assegnazione(char* funzione,int* errore,int* n_variabili)
00063 {
00064    int posizione_assegnazione; //Individua se viene effettuata una assegnazione
00065    int i; //Variabile contatore
00066    int cont_variabili; //Conta il numero di variabili
00067    char str_assegnazione[150];//Stringa di assegnazione antecedente :=
00068    int parentesi_apri=0; //Contiene la posizione del carattere (
00069    int parentesi_chiudi=0;//Contiene la posizione del carattere )
00070    int posizione_virgola;//Contiene la posizione del carattere ,
00071    int posizione_start;//Posizione di partenza
00072    int len_assegn; //Contiene la lunghezza di str_assegnazione
00073 
00074 //Cerco il carattere che definisce un assegnazione
00075    posizione_assegnazione = Instr(1, funzione, ":=");
00076 //inizializzo le variabili (errore=1 nessun errore;errore=0 rilevato errore di sintassi)
00077    *errore = 1;
00078    i = 0;
00079  if (posizione_assegnazione > 0)//se esiste una stringa di assegnazione
00080 //controllo sulla sintassi dell'assegnazione
00081   { Mid(str_assegnazione,funzione, 1, posizione_assegnazione - 1); //TAGLIO VIA L'ASSEGNAZIONE
00082      len_assegn=Len(str_assegnazione);
00083 //Cicla finchŠ non trova errori e finchŠ i Š < della lunghezza della stringa)
00084    while ((*errore == 1)&&(i < len_assegn))
00085      {  //Controllo carattere per carattere di str_assegnazione
00086       if ((str_assegnazione[i] < 'A') || (str_assegnazione[i] > 'z'))
00087          {if ((str_assegnazione[i] != '(') && (str_assegnazione[i] != ')') && (str_assegnazione[i] != ','))
00088       // se non Š una lettere,una parentesi o una virgola (caratteri ammessi)
00089            errore = 0;//Š errore
00090           else //altrimenti
00091           { if (str_assegnazione[i] == '(')//se Š una apertura parentesi
00092              parentesi_apri++;
00093             else
00094              { if (str_assegnazione[i] == ')')//se Š una chiusura parentesi
00095                 parentesi_chiudi++;
00096                if (i > 1)//se mi trovo almeno sul secondo elemento della stringa
00097                 {       //controllo che non vi siano due virgole consecutive
00098                   if ((str_assegnazione[i-1]== ',') && (str_assegnazione[i] == ','))
00099                    errore = 0; //se si Š errore
00100                 }
00101              }
00102       //Nella stringa di assegnazione sono ammessi al massimo una ( e una )
00103              if ((parentesi_chiudi > 1) || (parentesi_apri > 1))
00104                errore = 0;
00105           }
00106          }
00107      //Incremento l'indice che rappresenta la posizione attuale nella stringa
00108       i = i + 1;
00109      }
00110  // --------------FINE CICLO CONTROLLO-------------
00111     if (parentesi_chiudi != parentesi_apri)
00112        errore = 0; //Se il numero di ( Š diverso dal numero di )
00113 
00114     if (*errore == 1)//Se per il momento non sono stati rilevati errori
00115   //SE SI TRATTA DI UNA FUNZIONE CONTROLLO CHE ) SIA EFFETTIVAMENTE L'ULTIMO CARATTERE
00116      {if (((Instr(1, str_assegnazione, "(")) > 1) && ((Instr(1, str_assegnazione, ")")) < Len(str_assegnazione)))
00117        errore = 0;
00118      }
00119 // Fine controllo sulla sintassi dell'assegnazione
00120 
00121     if (*errore == 1)
00122      {    cont_variabili = 0;
00123       if (Instr(1, str_assegnazione, "(") > 1)
00124          { //Se si tratta di funzione allora devo ottenerne le variabili
00125            posizione_virgola = Instr(1, str_assegnazione, ",");
00126            posizione_start = Instr(1, str_assegnazione, "(");
00127            cont_variabili = 1; //Di sicuro a questo punto vi Š almeno una variabile
00128           while (posizione_virgola > 0)//Conto il numero di variabili per il cast
00129            { //Sfrutto il numero di virgole per contare le variabili
00130              posizione_start = posizione_virgola;
00131             //Cerco la virgola nella stringa
00132              posizione_virgola = Instr(posizione_virgola + 1, str_assegnazione, ",");
00133            //Incremento il numero di variabili
00134              cont_variabili = cont_variabili + 1;
00135            }
00136      //Eseguo il cast del puntatore variabili in relazione al numero di variabili
00137              variabili=(variab*)malloc(sizeof(variab)*cont_variabili);
00138              posizione_virgola = Instr(1, str_assegnazione, ",");
00139              posizione_start = Instr(1, str_assegnazione, "(");
00140         //Salvo le variabili nella struttura
00141           for (i=0;i<cont_variabili-1;i++)
00142            {
00143          //copio dalla funzione di assegnazione la variabile nella struttura
00144             (variabili+i)->variabile=(char*)malloc(sizeof(char)*(posizione_virgola - posizione_start ));
00145             Mid((variabili+i)->variabile,str_assegnazione, posizione_start+1 , posizione_virgola - posizione_start - 1);
00146             posizione_start = posizione_virgola;
00147             posizione_virgola = Instr(posizione_virgola + 1, str_assegnazione, ",");
00148            }
00149             (variabili+i)->variabile=(char*)malloc(sizeof(char)*(Len(str_assegnazione) - posizione_start ));
00150             Mid((variabili+i)->variabile,str_assegnazione, posizione_start + 1, Len(str_assegnazione) - posizione_start - 1);
00151 
00152          }
00153           //Salvo il numero di variabili in una variabile globale
00154             *n_variabili = cont_variabili;
00155             return(1);
00156      }
00157   }
00158 
00159  return(0);
00160 }
00161 //**************************************************************************
00162 
00163 /*
00164   * Nome funzione:     Lcase
00165   * Parametri:         funzione   stringa che contiene l'espressione presa in
00166                                   input
00167 
00168   * Valori di ritorno: void (nessuno)
00169   * Descrizione:questa funzione interpreta le funzioni matematiche
00170                 fondamentali(sin,cos,ecc) e semplicemente le riscrive
00171                 con una sintassi corretta(sin diventa Sin,cos diventa Cos,ecc)
00172 */
00173 
00174 //**************************************************************************
00175 
00176 void TParserScomponi::Lcase(char* funzione) //Riscrive adeguatamente alcune parti della
00177 {                          //funzione
00178 
00179   int lunghezza,i,j;
00180   lunghezza=Len(funzione);
00181   char funzione_temp[3];
00182  for(i=0;i<lunghezza;i++)//Cicla per tutta la stringa
00183   {
00184   //se Š presente sin scritto come sin oppure sIn oppure sIN,ecc lo reimposta
00185  //adeguatemente cioŠ Sin
00186     Mid(funzione_temp,funzione,i+2,2);
00187     if(((funzione[i]=='s')||(funzione[i]=='S')) && ((strcmp(funzione_temp,"in")==0)||(strcmp(funzione_temp,"In")==0)||(strcmp(funzione_temp,"iN")==0)||(strcmp(funzione_temp,"IN")==0)))
00188      {
00189       if(funzione[i]>'Z')   //Se il primo carattere Š minuscolo
00190          funzione[i]=funzione[i]-32; //ne modifico il cod Ascii per ottenerlo maiuscolo
00191        for(j=1;j<=2;j++)//Se gli altri due caratteri sono maiuscoli allora
00192         {if(funzione[i+j]<'a')//gli imposto minuscoli
00193          funzione[i+j]=funzione[i+j]+32;
00194         }
00195         i=i+2;
00196            Mid(funzione_temp,funzione,i+2,2);
00197 
00198      }
00199 //Medesima descrizione vista per il seno applicata al coseno
00200     if(((funzione[i]=='c')||(funzione[i]=='C')) && ((strcmp(funzione_temp,"os")==0)||(strcmp(funzione_temp,"Os")==0)||(strcmp(funzione_temp,"oS")==0)||(strcmp(funzione_temp,"OS")==0)))
00201      {
00202       if(funzione[i]>'Z')
00203          funzione[i]=funzione[i]-32;
00204        for(j=1;j<=2;j++)
00205         {if(funzione[i+j]<'a')
00206          funzione[i+j]=funzione[i+j]+32;
00207         }
00208         i=i+2;
00209            Mid(funzione_temp,funzione,i+2,2);
00210 
00211      }
00212 //Medesima descrizione vista per il seno applicata all'abs
00213     if(((funzione[i]=='a')||(funzione[i]=='A')) && ((strcmp(funzione_temp,"bs")==0)||(strcmp(funzione_temp,"Bs")==0)||(strcmp(funzione_temp,"bS")==0)||(strcmp(funzione_temp,"BS")==0)))
00214      {
00215       if(funzione[i]>'Z')
00216          funzione[i]=funzione[i]-32;
00217        for(j=1;j<=2;j++)
00218         {if(funzione[i+j]<'a')
00219          funzione[i+j]=funzione[i+j]+32;
00220         }
00221         i=i+2;
00222            Mid(funzione_temp,funzione,i+2,2);
00223 
00224      }
00225 
00226         //Medesima descrizione vista per il seno applicata alla tangente
00227     if(((funzione[i]=='t')||(funzione[i]=='T')) && ((strcmp(funzione_temp,"an")==0)||(strcmp(funzione_temp,"An")==0)||(strcmp(funzione_temp,"aN")==0)||(strcmp(funzione_temp,"AN")==0)))
00228      {
00229       if(funzione[i]>'Z')
00230          funzione[i]=funzione[i]-32;
00231        for(j=1;j<=2;j++)
00232         {if(funzione[i+j]<'a')
00233          funzione[i+j]=funzione[i+j]+32;
00234         }
00235         i=i+2;
00236         Mid(funzione_temp,funzione,i+2,2);
00237 
00238      }
00239  //Medesima descrizione vista per il seno applicata al log
00240     if(((funzione[i]=='l')||(funzione[i]=='L')) && ((strcmp(funzione_temp,"og")==0)||(strcmp(funzione_temp,"Og")==0)||(strcmp(funzione_temp,"oG")==0)||(strcmp(funzione_temp,"OG")==0)))
00241      {
00242       if(funzione[i]>'Z')
00243          funzione[i]=funzione[i]-32;
00244        for(j=1;j<=2;j++)
00245         {if(funzione[i+j]<'a')
00246          funzione[i+j]=funzione[i+j]+32;
00247         }
00248         i=i+2;
00249            Mid(funzione_temp,funzione,i+2,2);
00250 
00251      }
00252  //Medesima descrizione vista per il seno applicata all'esponenziale
00253     if(((funzione[i]=='e')||(funzione[i]=='E')) && ((strcmp(funzione_temp,"xp")==0)||(strcmp(funzione_temp,"Xp")==0)||(strcmp(funzione_temp,"xP")==0)||(strcmp(funzione_temp,"XP")==0)))
00254      {
00255       if(funzione[i]>'Z')
00256          funzione[i]=funzione[i]-32;
00257        for(j=1;j<=2;j++)
00258         {if(funzione[i+j]<'a')
00259          funzione[i+j]=funzione[i+j]+32;
00260         }
00261         i=i+2;
00262      }
00263  //Medesima descrizione vista per il seno applicata al logaritmo naturale
00264      if(((funzione[i]=='l')||(funzione[i]=='L')) && ((funzione[i+1]=='n')||(funzione[i+1]=='N')))
00265      {
00266       if(funzione[i]>'Z')
00267          funzione[i]=funzione[i]-32;
00268 
00269         if(funzione[i+1]<'a')
00270          funzione[i+1]=funzione[i+j]+32;
00271 
00272         i=i+1;
00273      }
00274 
00275 
00276   }
00277 }
00278 //**************************************************************************
00279 
00280 /*
00281   * Nome funzione:     Gestione_assegnazione
00282   * Parametri:         funzione   stringa che contiene l'espressione presa in
00283                                   input
00284   * Valori di ritorno:           1  non Š presente nessun errore di sintassi
00285                                     nell'espressione
00286                                  0  Š presente almeno un errore
00287   * Descrizione:      funzione che esegue un controllo della sintassi della
00288                       espressione presa in input
00289 */
00290 //**************************************************************************
00291 
00292 int TParserScomponi::Controllo_sintassi(char* funzione)
00293 {
00294  int i;
00295  int parentesi_apri=0;
00296  int  parentesi_chiudi=0;
00297  int var_ok;
00298  int lunghezza=Len(funzione);
00299  char funzione_temp[5];
00300   if(lunghezza==0)//Se l'utente non inserisce niente è errore
00301    return(0);
00302   for (i=0;i<lunghezza;i++)   //ciclo che conta il numero di parentesi aperte e chiuse
00303    { if (funzione[i]=='(')
00304       parentesi_apri++;
00305      else
00306      {if (funzione[i]==')')
00307        parentesi_chiudi++;
00308      }
00309    }
00310   if(parentesi_chiudi!=parentesi_apri)
00311    return(0);
00312              i=0;
00313     while (i < lunghezza)  //CONTROLLO DEGLI OPERATORI ARITMETICI
00314      { if ((funzione[i] == '+') || (funzione[i] == '-') || (funzione[i] ==  '*') || (funzione[i] == '/') || (funzione[i] == '^'))
00315         { if (i > 1)
00316            { switch (funzione[i])
00317              { case '-':
00318                 {if ( (funzione[i-1] == '+')||(funzione[i-1] == '-'))
00319                   return(0);
00320                   break;
00321                 }
00322                case '+':
00323                 {if  ((funzione[i-1] == '+')||(funzione[i-1] == '-'))
00324                   return(0);
00325                   break;
00326                 }
00327                case '*':
00328                 {if  ((funzione[i-1] == '+') || (funzione[i-1] == '-') || (funzione[i-1] == '*') || (funzione[i-1] == '/') || (funzione[i-1] == '^'))
00329                   return(0);
00330                   break;
00331                 }
00332                case '/':
00333                 {if  ((funzione[i-1] == '+') || (funzione[i-1] == '-') || (funzione[i-1] == '*') || (funzione[i-1] == '/') || (funzione[i-1] == '^'))
00334                   return(0);
00335                   break;
00336                 }
00337                case '^':
00338                 {if  ((funzione[i-1] == '+') || (funzione[i-1] == '-') || (funzione[i-1] == '*') || (funzione[i-1] == '/') || (funzione[i-1] == '^'))
00339                   return(0);
00340                   break;
00341                 }
00342              }
00343                  if ((funzione[i-1] == '(') && ((funzione[i] == '*') || (funzione[i] == '/') || (funzione[i] =='^')))
00344                   return(0);
00345            }
00346           if (i < lunghezza-1)
00347            { switch (funzione[i])
00348              { case '-':
00349                 { if ((funzione[i+1]== '+') || (funzione[i+1]== '-') || (funzione[i+1]== '*') || (funzione[i+1]== '/'))
00350                     return(0);
00351                     break;
00352                 }
00353                case '+':
00354                 { if ((funzione[i+1]== '+') || (funzione[i+1]== '-') || (funzione[i+1]== '*') || (funzione[i+1]== '/'))
00355                     return(0);
00356                     break;
00357                 }
00358                case '*':
00359                 { if ((funzione[i+1] == '*') || (funzione[i+1] == '/') || (funzione[i+1] == '^'))
00360                    return(0);
00361                    break;
00362                 }
00363                case '/':
00364                 { if ((funzione[i+1] == '*') || (funzione[i+1] == '/') || (funzione[i+1] == '^'))
00365                    return(0);
00366                    break;
00367                 }
00368                case '^':
00369                 { if ((funzione[i+1] == '*') || (funzione[i+1] == '/') || (funzione[i+1] == '^'))
00370                    return(0);
00371                    break;
00372                 }
00373              }
00374             if (funzione[i+1] == ')')  //controllo se davanti ad un segno vi è )
00375               return(0);
00376            } else
00377               return(0);//se l'ultimo carattere Š un segno Š errore
00378         } else
00379            { if ((funzione[i] >= 'A') && (funzione[i] <= 'z'))
00380               {   var_ok = 0;
00381                  if(funzione[i]=='[')
00382                   var_ok=1;
00383                switch(funzione[i])  //CONTROLLO LA CORRETTA SINTASSI DELLE VARIE FUNZIONI ESEMPIO FUNZIONANTE
00384                   {  case 'A':
00385                    { Mid(funzione_temp,funzione, i+2, 2);
00386                     if ((strcmp(funzione_temp, "bs")!=0) && (var_ok == 0))
00387                       return(0);
00388                     else
00389                      { if (strcmp(funzione_temp,"bs")==0)
00390                         i = i + 3;
00391                        else
00392                         { if (var_ok == 1)
00393                            i = Instr(i+1,funzione,"]") - 1;
00394                         }
00395                      }
00396                     break;
00397                    }
00398                    case 'S':
00399                    { Mid(funzione_temp,funzione, i+2, 3);
00400                     if ((strcmp(funzione_temp, "in(")!=0) && (var_ok == 0))
00401                       return(0);
00402                     else
00403                      { if (strcmp(funzione_temp,"in(")==0)
00404                         i = i + 3;
00405                        else
00406                         { if (var_ok == 1)
00407                            i = Instr(i+1,funzione,"]") - 1;
00408                         }
00409                      }
00410                     break;
00411                    }
00412                                   //CONTROLLO SE E' UN COS
00413 
00414                   case 'C':
00415                    {Mid(funzione_temp,funzione, i+2, 3);
00416                     if ((strcmp(funzione_temp, "os(")!=0) && (var_ok == 0))
00417                       return(0);
00418                     else
00419                      { if (strcmp(funzione_temp,"os(")==0)
00420                         i = i + 3;
00421                        else
00422                         { if (var_ok == 1)
00423                            i =Instr(i+1,funzione,"]") - 1;
00424                         }
00425                      }
00426                     break;
00427                    }
00428 
00429      //CONTROLLO SE E' UNA TAN
00430                   case 'T':
00431                    {Mid(funzione_temp,funzione, i+2, 3);
00432                     if ((strcmp(funzione_temp, "an(")!=0) && (var_ok == 0))
00433                       return(0);
00434                     else
00435                      { if (strcmp(funzione_temp,"an(")==0)
00436                         i = i + 3;
00437                        else
00438                         { if (var_ok == 1)
00439                            i = Instr(i+1,funzione,"]") - 1;
00440                         }
00441                      }
00442                     break;
00443                    }
00444 
00445                  case 'L':
00446                  {    Mid(funzione_temp,funzione, i+2, 3);
00447                    if ((strcmp(funzione_temp, "og(")!=0)&&(var_ok == 0)&&(funzione_temp[0]!='n')&&(funzione_temp[1]!='('))
00448                       return(0);
00449                    else
00450                     { if (strcmp(funzione_temp, "og(")==0) //se è log incremento i di 3 altrimenti se ln di 2
00451                        i = i + 3;
00452                       else
00453                        {if ((funzione_temp[0]=='n')&&(funzione_temp[1]=='('))
00454                          i = i + 2;
00455                         else
00456                          {if (var_ok == 1)
00457                            i = Instr(i+1,funzione,"]") - 1;
00458                          }
00459                        }
00460                     }
00461                     break;
00462                    }
00463                  case 'E':
00464                    {Mid(funzione_temp,funzione, i+2, 3);
00465                    if ((strcmp(funzione_temp, "xp(")!=0) && (var_ok == 0))
00466                       return(0);
00467                     else
00468                      { if (strcmp(funzione_temp,"xp(")==0)
00469                         i = i + 3;
00470                        else
00471                         { if (var_ok == 1)
00472                            i = Instr(i+1,funzione,"]") - 1;
00473                         }
00474                      }
00475                     break;
00476                    }
00477 
00478                 default: //SE E' PRESENTE LA VARIABILE ALLORA LA GESTISCO ALTRIMENTI E' ERRORE
00479                  {if (var_ok == 0)  //se trova un carattere non identificato allora è errore
00480                    return(0);
00481                   else
00482                    i = Instr(i+1,funzione,"]") - 1;
00483                  }
00484                }
00485               }else
00486                 {if((funzione[i]!='(')&&(funzione[i]!=')')&&(funzione[i]<48)&&(funzione[i]>57))
00487                   return(0);// si tratta di caratteri non ammessi
00488                 }
00489            }
00490       i++;
00491     }
00492 
00493  return(1);   //Se non trova errori restituisco 1
00494 
00495 }
00496 //**************************************************************************
00497 /*
00498   * Nome funzione:     MettiPer
00499   * Parametri:         funzione    stringa che contiene l'espressione presa in
00500                                    input
00501   * Valori di ritorno: funzione -> stringa passata come parametro con
00502                                    l'aggiunta dei * dove necessario
00503   * Descrizione:       aggiunge alla stringa di parametro
00504                        il carattere * dove vi Š un prodotto e non Š stato
00505                        specificato dall'utente
00506                        es (f(x):=2x ->f(x):=2*x)
00507 
00508 */
00509 //**************************************************************************
00510 
00511 void TParserScomponi::MettiPer(char* funzione)
00512  {
00513    int indice=0;
00514    char* funzione_temp;
00515    char* funzione_temp2;
00516  while (indice < Len(funzione))
00517   {
00518   if(funzione[indice]=='[')
00519    {if (indice > 0)
00520      { if ((funzione[indice-1] != '*')&&(funzione[indice-1] != '^') && (funzione[indice-1]!= '+')&&(funzione[indice-1] !='-') && (funzione[indice-1]!= '/') && (funzione[indice-1]!=' ')&&(funzione[indice-1]!= '('))
00521         { funzione_temp=(char*)malloc(sizeof(char)*(Len(funzione)+2));
00522           Mid(funzione_temp,funzione, 1, indice-1);
00523           Concatena(funzione_temp,"*");
00524           funzione_temp2=(char*)malloc(sizeof(char)*(Len(funzione)-indice+1));
00525           Mid(funzione_temp2,funzione, indice, Len(funzione) - indice );
00526           Concatena(funzione_temp,funzione_temp2);
00527           strcpy(funzione,funzione_temp);
00528           free(funzione_temp);
00529           free(funzione_temp2);
00530         }
00531      }
00532         indice = Instr(indice+1, funzione, "]");
00533     if ((Len(funzione) > indice + 1) && (funzione[indice]!='*')&&(funzione[indice]!='^')&&(funzione[indice]!='+')&&(funzione[indice]!='-')&&(funzione[indice]!='/')&&(funzione[indice]!=' ')&&(funzione[indice]!=')'))
00534      {  funzione_temp=(char*)malloc(sizeof(char)*(Len(funzione)+2));
00535         Mid(funzione_temp,funzione, 1, indice);
00536         Concatena(funzione_temp,"*");
00537         funzione_temp2=(char*)malloc(sizeof(char)*(Len(funzione)-indice+2));
00538         Mid(funzione_temp2,funzione, indice + 1, Len(funzione) - indice+1 );
00539         Concatena(funzione_temp,funzione_temp2);
00540         strcpy(funzione,funzione_temp);
00541         free(funzione_temp);
00542         free(funzione_temp2);
00543      }
00544    }
00545    if (funzione[indice] == '(')
00546     {if (indice > 0)
00547      {if (funzione[indice-1] == ')')
00548       {
00549        funzione_temp=(char*)malloc(sizeof(char)*(Len(funzione)+2));
00550        Mid(funzione_temp,funzione, 1, indice-1);
00551        Concatena(funzione_temp,"*");
00552        funzione_temp2=(char*)malloc(sizeof(char)*(Len(funzione)-indice+1));
00553        Mid(funzione_temp2,funzione, indice,Len(funzione) - indice );
00554        Concatena(funzione_temp,funzione_temp2);
00555        strcpy(funzione,funzione_temp);
00556        indice++;
00557        free(funzione_temp);
00558        free(funzione_temp2);
00559       }
00560      }
00561     }
00562 
00563   if (funzione[indice] == ')')
00564    {if ((Len(funzione) > indice + 1) && (funzione[indice+1] !='*') && (funzione[indice+1]!= '^')&&(funzione[indice+1]!= '+')&&(funzione[indice+1]!= '-')&&(funzione[indice+1]!= '/')&&(funzione[indice+1]!= ' ')&&(funzione[indice+1]!= ')'))
00565     {   funzione_temp=(char*)malloc(sizeof(char)*(Len(funzione)+2));
00566         Mid(funzione_temp,funzione, 1, indice+1);
00567         Concatena(funzione_temp,"*");
00568         funzione_temp2=(char*)malloc(sizeof(char)*(Len(funzione)-indice+3));
00569         Mid(funzione_temp2,funzione, indice + 2, Len(funzione) - indice+2 );
00570         Concatena(funzione_temp,funzione_temp2);
00571         strcpy(funzione,funzione_temp);
00572         indice++;
00573         free(funzione_temp);
00574         free(funzione_temp2);
00575     }
00576    }
00577  //Controllo se Š un numero
00578   if ((funzione[indice]>=48)&&(funzione[indice]<=57))
00579    {if (indice > 0)
00580      {if ((funzione[indice-1]!='*') && (funzione[indice-1]!=',') && (funzione[indice-1]!='(') && (funzione[indice-1]!='^') && (funzione[indice-1]!='+') && (funzione[indice-1]!='-') && (funzione[indice-1]!='/') && (funzione[indice-1]!=' ')&&(funzione[indice-1]!='[') && ((funzione[indice-1]<48) || (funzione[indice-1]>57)))
00581       {
00582        funzione_temp=(char*)malloc(sizeof(char)*(Len(funzione)+2));
00583        Mid(funzione_temp,funzione, 1, indice-1);
00584        Concatena(funzione_temp,"*");
00585        funzione_temp2=(char*)malloc(sizeof(char)*(Len(funzione)-indice+1));
00586        Mid(funzione_temp2,funzione, indice, Len(funzione) - indice );
00587        Concatena(funzione_temp,funzione_temp2);
00588        strcpy(funzione,funzione_temp);
00589        indice++;
00590        free(funzione_temp);
00591        free(funzione_temp2);
00592       }
00593      }
00594     if ((Len(funzione) > indice + 1)&&(funzione[indice+1] !='*')&&(funzione[indice+1] !=',')&&(funzione[indice+1] !=')')&&(funzione[indice+1] !='^')&&(funzione[indice+1] !='+')&&(funzione[indice+1] !=';')&&(funzione[indice+1] !='-')&&(funzione[indice+1] !='/')&&(funzione[indice+1] !=' ')&&((funzione[indice+1]<48) || (funzione[indice+1]>57)))
00595      {  funzione_temp=(char*)malloc(sizeof(char)*(Len(funzione)+2));
00596         Mid(funzione_temp,funzione, 1, indice+1);
00597         Concatena(funzione_temp,"*");
00598         funzione_temp2=(char*)malloc(sizeof(char)*(Len(funzione)-indice+3));
00599         Mid(funzione_temp2,funzione, indice + 2, Len(funzione) - indice +2);
00600         Concatena(funzione_temp,funzione_temp2);
00601         strcpy(funzione,funzione_temp);
00602         indice++;
00603         free(funzione_temp);
00604         free(funzione_temp2);
00605      }
00606    }
00607      indice++;
00608 }
00609 }
00610 
00611 //************************************************************************
00612 /*
00613   * Nome funzione:     ParentesiElevati
00614   * Parametri:         funzione   stringa che contiene l'espressione presa in
00615                                input ed elaborata parzialmente precedentemente
00616   * Valori di ritorno: la stringa passata come parametro con l'aggiunta di
00617                        alcune parentesi
00618                        es (f(x):=3x^2 ->f(x):=3(x^2))
00619   * Descrizione:       questa funzione ha il compito di inserire nella
00620                        stringa parentesi  per stabilire, successivamente,
00621                        la priorit…,
00622                        rispetto agli altri operatori,dell'elevamento a potenza
00623 
00624 */
00625 //**************************************************************************
00626 
00627 
00628  void TParserScomponi::ParentesiElevati(char* funzione)
00629  {
00630    int posizione_elevato;
00631    int numero_parentesi;
00632    int posizione_scorr;
00633    int flag;
00634    char* funzione_temp;
00635    char* funzione_temp2;
00636      posizione_elevato=Instr(1,funzione,"^")-1;
00637 
00638      while (posizione_elevato > 0)
00639       {  posizione_scorr = posizione_elevato-1;
00640        if (funzione[posizione_scorr]!= ')')
00641         {while ((posizione_scorr > 0)&&(funzione[posizione_scorr]!= '^')&&(funzione[posizione_scorr]!= '*')&&(funzione[posizione_scorr]!= '/')&&(funzione[posizione_scorr]!= '+')&&(funzione[posizione_scorr]!= '-')&&(funzione[posizione_scorr]!= '('))
00642          {  posizione_scorr--;
00643          }
00644          if (posizione_scorr > 0)
00645             posizione_scorr++;
00646         }
00647        else
00648         {   numero_parentesi = 1;
00649          while (numero_parentesi > 0)
00650           { posizione_scorr--;
00651            if (funzione[posizione_scorr] == ')')
00652             numero_parentesi++;
00653            else
00654             {if (funzione[posizione_scorr] == '(')
00655               numero_parentesi--;
00656             }
00657           }
00658         }
00659            funzione_temp=(char*)malloc(sizeof(char)*(Len(funzione)+5));
00660            Mid(funzione_temp,funzione, 1, posizione_scorr );
00661            Concatena(funzione_temp,"(");
00662            funzione_temp2=(char*)malloc(sizeof(char)*(posizione_elevato - posizione_scorr + 2));
00663            Mid(funzione_temp2,funzione, posizione_scorr+1, posizione_elevato - posizione_scorr + 1);
00664            Concatena(funzione_temp, funzione_temp2);
00665            free(funzione_temp2);
00666            funzione_temp2=(char*)malloc(sizeof(char)*(Len(funzione) - posizione_elevato));
00667            Mid(funzione_temp2,funzione, posizione_elevato+2 , Len(funzione) - posizione_elevato);
00668            Concatena(funzione_temp,funzione_temp2);
00669            free(funzione_temp2);
00670            strcpy(funzione,funzione_temp);
00671            free(funzione_temp);
00672            posizione_elevato = Instr(posizione_elevato + 1, funzione, "^")-1;
00673            posizione_scorr = posizione_elevato + 1;
00674          if (funzione[posizione_scorr]!='(')
00675           { flag = 1;
00676            while ((flag == 1)&&(posizione_scorr < Len(funzione)-1)&&(funzione[posizione_scorr]!='*')&&(funzione[posizione_scorr]!='^')&&(funzione[posizione_scorr]!='/'))
00677            { if ((posizione_scorr > posizione_elevato + 1)&&((funzione[posizione_scorr]=='+')||(funzione[posizione_scorr]=='-')))
00678               flag = 0;
00679              else
00680               posizione_scorr++;
00681            }
00682           if (posizione_scorr < Len(funzione)-1)
00683           posizione_scorr--;
00684 
00685     }else
00686      {     numero_parentesi = 1;
00687         while (numero_parentesi > 0)
00688          {  posizione_scorr++;
00689           if (funzione[posizione_scorr] == ')')
00690            numero_parentesi--;
00691           else
00692           {if (funzione[posizione_scorr] == '(')
00693            numero_parentesi++;
00694           }
00695          }
00696 
00697     }
00698          funzione_temp=(char*)malloc(sizeof(char)*(Len(funzione)+5));
00699          Mid(funzione_temp,funzione,1,posizione_scorr+1);
00700          Concatena(funzione_temp,")");
00701          funzione_temp2=(char*)malloc(sizeof(char)*(Len(funzione)-posizione_scorr));
00702          Mid(funzione_temp2,funzione,posizione_scorr+2,Len(funzione)-posizione_scorr-1);
00703          Concatena(funzione_temp,funzione_temp2);
00704          strcpy(funzione,funzione_temp);
00705          posizione_elevato = Instr(posizione_elevato + 2, funzione, "^")-1;
00706          free(funzione_temp);
00707          free(funzione_temp2);
00708  }
00709 }
00710 
00711 //************************************************************************
00712 /*
00713   * Nome funzione:     GestioneMeno
00714   * Parametri:         funzione   stringa che contiene l'espressione presa in
00715                                   input
00716   * Valori di ritorno: la stringa presa come parametro con qualche piccolo
00717                        ritocco dove necessario
00718 
00719   * Descrizione: aggiunge uno 0 e toglie i + dove non sono necessari per
00720                  facilitarne l'interpretazione successiva
00721                  es f(x):=x*(+2*x)->x(2*x)
00722                     f(x):=-x^2->0-x^2
00723 */
00724 //**************************************************************************
00725 
00726 void TParserScomponi::GestioneMeno(char* funzione)
00727 { int posizione_parentesi;
00728   char* funzione_temp;
00729   char* funzione_temp2;
00730    posizione_parentesi = Instr(1, funzione, "(")-1;
00731 
00732  while (posizione_parentesi > -1)
00733  { if (funzione[posizione_parentesi+1] == '-')
00734    {  funzione_temp=(char*)malloc(sizeof(char)*(Len(funzione)+2));
00735       Mid(funzione_temp,funzione, 1, posizione_parentesi+1);
00736       Concatena(funzione_temp,"0");
00737       funzione_temp2=(char*)malloc(sizeof(char)*(Len(funzione) - posizione_parentesi));
00738       Mid(funzione_temp2,funzione, posizione_parentesi + 2, Len(funzione) - posizione_parentesi);
00739       Concatena(funzione_temp,funzione_temp2);
00740       strcpy(funzione,funzione_temp);
00741       free(funzione_temp);
00742       free(funzione_temp2);
00743     }
00744    else
00745    { if (funzione[posizione_parentesi+1] == '+')
00746      { funzione_temp=(char*)malloc(sizeof(char)*Len(funzione));
00747        Mid(funzione_temp,funzione, 1, posizione_parentesi+1);
00748        funzione_temp2=(char*)malloc(sizeof(char)*(Len(funzione) - 1 - posizione_parentesi));
00749        Mid(funzione_temp2,funzione, posizione_parentesi + 3, Len(funzione) - 1 - posizione_parentesi);
00750        Concatena(funzione_temp,funzione_temp2);
00751        strcpy(funzione,funzione_temp);
00752        free(funzione_temp);
00753        free(funzione_temp2);
00754 
00755      }
00756    }
00757      posizione_parentesi = Instr(posizione_parentesi + 2, funzione, "(")-1;
00758  }
00759 }
00760 
00761 //************************************************************************
00762 /*
00763   * Nome funzione:     Gestione Variabili
00764   * Parametri:         funzione    stringa che contiene l'espressione presa in
00765                                    input
00766                        n_variabili contiene il numero di variabili in funzione
00767 
00768   * Valori di ritorno:  nessuno
00769 
00770   * Descrizione:       sub che qualora rileva una variabile nella funzione,la sostituisca con
00771                        l'espressione  [nome variabile, indice], indice ha la funzione di numerare
00772                        ciascuna variabile
00773                        es f(a,b):=a^2+b^2+a  ->     [a,1]^2+[b,2]^2+[a,1]
00774 */
00775 
00776 void TParserScomponi::GestioneVariabili(char* funzione,int n_variabili)
00777 {
00778   variab* variabili_iniziali;
00779   int i,flag;
00780   variab temp_variabile;
00781   char variabile[20];
00782   int posizione_scorr;
00783   char funzione_temp[2000],funzione_temp2[2000],numstringa[20];
00784 
00785  if (n_variabili > 0)
00786    {
00787       variabili_iniziali=(variab*)malloc(sizeof(variab)*n_variabili);
00788   //Devo memorizzarmi una copia dell'ordine iniziale delle variabili
00789     for(i=0;i<n_variabili;i++)
00790     {
00791      (variabili_iniziali+i)->variabile=(char*)malloc(sizeof(char)*(Len((variabili+i)->variabile)));
00792      strcpy((variabili_iniziali+i)->variabile,(variabili+i)->variabile);
00793     }
00794     do               //Ordino le variabili decrescentemente
00795      { flag=0;
00796        i=0;
00797       while(i<n_variabili-1)
00798        {if(Len((variabili+i)->variabile)<Len((variabili+i+1)->variabile))
00799          {temp_variabile=*(variabili+i);
00800           *(variabili+i)=*(variabili+i+1);
00801           *(variabili+i+1)=temp_variabile;
00802           flag=1;
00803          }
00804           i++;
00805        }
00806      }while(flag==1);
00807 
00808      for (i = 1;i<=n_variabili;i++)
00809       {   strcpy(variabile,(variabili+i-1)->variabile);
00810           posizione_scorr = 0;
00811         while (posizione_scorr <= Len(funzione)) //SOSTIUISCO LE VARIABILI NELLA FUNZIONE CON [...,...]
00812         { posizione_scorr = posizione_scorr + 1;
00813  //Utilizzo funzione_temp per semplificare il successivo confronto
00814           Mid(funzione_temp,funzione, posizione_scorr, 3);
00815          if (funzione[posizione_scorr-1] == '[')
00816            posizione_scorr=Instr(posizione_scorr,funzione,"]")+1;
00817            Mid(funzione_temp2,funzione, posizione_scorr, Len(variabile));
00818          if ((strcmp(funzione_temp2,variabile)==0)&&(strcmp(funzione_temp,"Sin")!=0) && (strcmp(funzione_temp,"Cos")!=0) && (strcmp(funzione_temp,"Exp")!=0) && (strcmp(funzione_temp,"Log")!=0) && (strcmp(funzione_temp,"Tan")!=0) &&((funzione[posizione_scorr-1]!='L')||(funzione[posizione_scorr-1]!='n')))
00819           {
00820            Mid(funzione_temp,funzione, 1, posizione_scorr - 1) ;
00821            Concatena(funzione_temp,"[");
00822            Concatena(funzione_temp,variabile);
00823            Concatena(funzione_temp,"]");
00824            Mid(funzione_temp2,funzione, posizione_scorr + Len(variabile), Len(funzione) - posizione_scorr - Len(variabile)+1 );
00825            strcpy(funzione,funzione_temp2);
00826            Concatena(funzione_temp,funzione);
00827            strcpy(funzione,funzione_temp);
00828            posizione_scorr = Instr(posizione_scorr, funzione, "]");
00829           }else
00830           { Mid(funzione_temp,funzione, posizione_scorr, 2);
00831            if (strcmp(funzione_temp,"Ln")==0)
00832               posizione_scorr = posizione_scorr + 1;
00833              Mid(funzione_temp,funzione, posizione_scorr, 3);
00834             if ((strcmp(funzione_temp,"Abs")==0) ||(strcmp(funzione_temp,"Sin")==0) || (strcmp(funzione_temp,"Cos")==0) || (strcmp(funzione_temp,"Exp")==0) || (strcmp(funzione_temp,"Log")==0) || (strcmp(funzione_temp,"Tan")==0))
00835               posizione_scorr = posizione_scorr + 2;
00836 
00837          }
00838        }
00839      }
00840 
00841 
00842  //Dealloco la struttura temporanea
00843      for(i=0;i<n_variabili;i++)
00844      {
00845       free((variabili+i)->variabile);
00846      }
00847       free(variabili);
00848       variabili=variabili_iniziali;
00849 
00850 
00851     for(i=0;i<n_variabili;i++)
00852     {
00853       posizione_scorr=Instr(1,funzione,"[");
00854      while((posizione_scorr<Len(funzione))&&(posizione_scorr>0))
00855       {  Mid(funzione_temp,funzione,posizione_scorr+1,Instr(posizione_scorr,funzione,"]")-1-posizione_scorr);
00856        if(strcmp(funzione_temp,(variabili+i)->variabile)==0)
00857         { Mid(funzione_temp,funzione,1,posizione_scorr-1);
00858           Concatena(funzione_temp,"[");
00859           sprintf(numstringa,"%d",i);
00860       //NumStr(i,numstringa);
00861           Concatena(funzione_temp,numstringa);
00862           Concatena(funzione_temp,";");
00863           Concatena(funzione_temp,(variabili+i)->variabile);
00864           Mid(funzione_temp2,funzione,Instr(posizione_scorr,funzione,"]"),Len(funzione)-Instr(posizione_scorr,funzione,"]")+2);
00865           Concatena(funzione_temp,funzione_temp2);
00866           strcpy(funzione,funzione_temp);
00867         }
00868          posizione_scorr=Instr(posizione_scorr+1,funzione,"[");
00869 
00870       }
00871     }
00872    }
00873 
00874    for(i=0;i<n_variabili;i++)
00875      {
00876       free((variabili+i)->variabile);
00877      }
00878       free(variabili);
00879 
00880    //'----------------------FINE GESTIONE DELLE VARIBILI---------------------------------------
00881 
00882 }
00883 
00884 rif* TParserScomponi::Traduci_funzione(char* funzione)
00885 {
00886  int parentesi=0,posizione_scorr,posizione_meno,posizione_piu,indice;
00887  int errore;
00888  int xpos,ypos=0,posizione_parentapri,assegnato,posizione_parentchiudi,cont,var_ok;
00889  char *funzione_iniziale,variabile[30],funzione_temp[600],funzione_temp2[600];
00890  int codice_lettere;
00891  int temp=0;
00892  int esiste;
00893  char char_temp[2];
00894  int cont_operatori=0;
00895  int n_variabili=0;
00896  int numero_scomposizioni=0;
00897  int posizione_variabile;
00898  char strassegnazione[250];
00899 
00900 
00901 
00902     char_temp[1]='\0';
00903     strcpy(strassegnazione,"");
00904     assegnato=Gestione_assegnazione(funzione,&errore,&n_variabili);
00905  if(assegnato==1) //Se vi è stata una corretta assegnazione
00906   {
00907     Mid(strassegnazione,funzione,1,Instr(1,funzione,":=")+1);
00908     Mid(funzione_temp,funzione,Instr(1,funzione,":=")+2,Len(funzione)-Instr(1,funzione,":=")-1);
00909     strcpy(funzione,funzione_temp);
00910   }
00911     Lcase(funzione);//Funzione che riscrive appropriatamente parti della funzione
00912     GestioneVariabili(funzione, n_variabili);
00913 
00914  if((Controllo_sintassi(funzione)==1)&&(errore==1))
00915   {
00916     MettiPer(funzione);
00917     funzione_iniziale=(char*)malloc(sizeof(char)*(Len(funzione)+1));
00918     strcpy(funzione_iniziale,funzione);
00919     ParentesiElevati(funzione);
00920 //inizializzo il codice ascii delle lettere che utilizzero come riferimenti
00921     codice_lettere = 96;
00922 //aggiungo delle parentesi alla funzione iniziale
00923     strcpy(funzione_temp,"(");
00924     Concatena(funzione_temp,funzione);
00925     Concatena(funzione_temp,")");
00926     strcpy(funzione,funzione_temp);
00927     GestioneMeno(funzione);
00928     posizione_scorr = 1;
00929     posizione_parentapri=0;
00930     posizione_parentapri = Instr(posizione_parentapri+1 , funzione, "(");
00931 
00932 //Conto il numero di parentesi (
00933  while(posizione_parentapri>0)
00934   { parentesi++;
00935     posizione_parentapri = Instr(posizione_parentapri+1 , funzione, "(");
00936   }
00937 
00938 //alloco la struttura dati che conterr… la funzione scomposta
00939    vettore_riferimenti=(riferimenti*)malloc(sizeof(riferimenti)*parentesi);
00940    parentesi=0;
00941 
00942 //cerco la prima ( nella funzione
00943    posizione_parentapri = Instr(posizione_scorr , funzione, "(");
00944 //cerco ) nella funzione
00945    posizione_parentchiudi = Instr(posizione_scorr, funzione, ")");
00946 
00947  while (posizione_parentapri > 0) //se esistono nella funzione delle parentesi allora..
00948   {     //cerco sempre la coppia di parentesi (..) piu interna
00949     while ((posizione_parentapri < posizione_parentchiudi)&&(posizione_parentapri > 0))
00950      {temp = posizione_parentapri;
00951       posizione_scorr = posizione_parentapri + 1;
00952       posizione_parentapri = Instr(posizione_scorr, funzione, "(");
00953       parentesi++;
00954      }
00955      posizione_parentapri = temp; //se tra le 2 parentesi c'e solo un carattere o un numero allora non è il caso di semplificare
00956      esiste = 0;
00957      cont = 0;
00958 //cerco nel vettore riferimenti per evitare ridondanze
00959     while ((cont < ypos)&&(esiste == 0))
00960      {    //cerco nel vettore riferimenti per evitare ridondanze
00961         Mid(funzione_temp,funzione, posizione_parentapri + 1, posizione_parentchiudi - posizione_parentapri - 1);
00962        if (strcmp(funzione_temp,(vettore_riferimenti+cont)->descrizione)==0)
00963         esiste = 1;
00964 
00965         cont++;
00966       }
00967         var_ok = 0;
00968 //Se tra due parentesi c'e solo una variabile Š inutile scomporre
00969     if((funzione[posizione_parentapri]=='[')&&((Instr(posizione_parentapri+2,funzione,"[")==0)||(Instr(posizione_parentapri+2,funzione,"[")>posizione_parentchiudi))&&(funzione[posizione_parentchiudi-2]==']'))
00970         var_ok=1;
00971 
00972         Mid(funzione_temp,funzione, posizione_parentapri + 1, posizione_parentchiudi - posizione_parentapri - 1);
00973     if (((parentesi == 1)||((Isnumeric(funzione_temp)==0))&&(Len(funzione_temp) > 1))&&(var_ok==0) )
00974      { if(esiste==0)
00975         { codice_lettere++; //riscrivo la funzione inserirendo la lettera di riferimento invece della parentesi estratta
00976 //inserisco in un vettore un riferimento al contenuto della parentesi
00977           (vettore_riferimenti+ypos)->descrizione=(char*)malloc(sizeof(char)*(posizione_parentchiudi - posizione_parentapri));
00978           Mid((vettore_riferimenti+ypos)->descrizione,funzione, posizione_parentapri + 1, posizione_parentchiudi - posizione_parentapri - 1);
00979 
00980           char_temp[0]=codice_lettere;
00981           Mid(funzione_temp,funzione, 1, posizione_parentapri - 1);
00982           Concatena(funzione_temp,char_temp);
00983           Mid(funzione_temp2,funzione, posizione_parentchiudi + 1, Len(funzione) - posizione_parentchiudi);
00984           Concatena(funzione_temp,funzione_temp2);
00985           strcpy(funzione,funzione_temp);
00986            ypos++;
00987 
00988         }
00989        else
00990         { char_temp[0]=95 + cont+1;
00991           Mid(funzione_temp,funzione, 1, posizione_parentapri - 1);
00992           Concatena(funzione_temp,char_temp);
00993           Mid(funzione_temp2,funzione, posizione_parentchiudi + 1, Len(funzione) - posizione_parentchiudi);
00994           Concatena(funzione_temp,funzione_temp2);
00995           strcpy(funzione,funzione_temp);
00996         }
00997      }
00998     else
00999 
01000      { Mid(funzione_temp,funzione, 1, posizione_parentapri - 1);
01001        Mid(funzione_temp2,funzione, posizione_parentapri + 1, posizione_parentchiudi - posizione_parentapri - 1);
01002        Concatena(funzione_temp, funzione_temp2);
01003        Mid(funzione_temp2,funzione, posizione_parentchiudi + 1, Len(funzione) - posizione_parentchiudi);
01004        Concatena(funzione_temp,funzione_temp2);
01005        strcpy(funzione,funzione_temp);
01006      }
01007 
01008     posizione_scorr = 1;
01009     posizione_parentapri = Instr(posizione_scorr, funzione, "(");
01010     posizione_parentchiudi = Instr(posizione_scorr, funzione, ")");
01011   }
01012     numero_scomposizioni = ypos;
01013     ypos = 0;
01014    if(numero_scomposizioni==0) //Ci deve essere almeno una scomposizione
01015     { numero_scomposizioni=1;
01016       vettore_riferimenti->descrizione=funzione;
01017     }
01018 
01019 
01020     // ------------SCOMPOSIZIONE DELLE SOMME O E MEMORIZZAZIONE NELLA MATRICE_SCOMPOSIZIONE------------
01021 
01022 
01023     vettore_riferimenti->n_variabili=n_variabili;
01024     vettore_riferimenti->numero_scomposizioni=numero_scomposizioni;
01025 
01026   for (indice = 0;indice<numero_scomposizioni;indice++)
01027    { xpos = 0;
01028      posizione_scorr = 0;
01029      strcpy(funzione_temp,(vettore_riferimenti+indice)->descrizione);
01030      posizione_meno = Instr(posizione_scorr+1,funzione_temp, "-");
01031      posizione_piu = Instr(posizione_scorr+1,funzione_temp, "+");
01032   //Conto gli operatori + e - per la successiva allocazione
01033     while((posizione_meno>0)||(posizione_piu>0))
01034      {
01035      if((posizione_meno>0)&&(posizione_piu>0))
01036       cont_operatori=cont_operatori+2;
01037      else
01038       cont_operatori++;
01039 
01040       posizione_meno = Instr(posizione_meno+2,funzione_temp, "-");
01041       posizione_piu = Instr(posizione_piu+2,funzione_temp, "+");
01042      }
01043      posizione_meno = Instr(posizione_scorr+1,funzione_temp, "-");
01044      posizione_piu = Instr(posizione_scorr+1,funzione_temp, "+");
01045     if(posizione_meno>0) posizione_meno--;
01046     if(posizione_piu>0) posizione_piu--;
01047 
01048      (vettore_riferimenti+indice)->scomposizioni=(scompos*)malloc(sizeof(scompos)*(2*cont_operatori+1));
01049 
01050    while (((posizione_meno > 0)&&(posizione_meno < 250))||((posizione_piu > 0)&&(posizione_piu < 250)))
01051     { if (posizione_meno == 0)  posizione_meno = 250;
01052       if (posizione_piu == 0)  posizione_piu = 250;
01053 
01054      if (posizione_meno < posizione_piu)
01055      { if (posizione_meno > 0)
01056        { if ((funzione_temp[posizione_meno - 1] == '^')||(funzione_temp[posizione_meno - 1] == '*')||(funzione_temp[posizione_meno - 1] == '/'))
01057           posizione_meno = Instr(posizione_meno + 1,funzione_temp, "-");
01058        }
01059      }
01060 
01061      if (posizione_piu < posizione_meno)
01062       {if (posizione_piu >0)
01063        {if ((funzione_temp[posizione_piu - 1] == '^')||(funzione_temp[posizione_piu - 1] == '*')||(funzione_temp[posizione_piu - 1] == '/'))
01064          posizione_piu = Instr(posizione_piu + 1,funzione_temp, "+");
01065        }
01066       }
01067 
01068      if (posizione_meno == 0) posizione_meno = 250;
01069      if (posizione_piu == 0)  posizione_piu = 250;
01070 
01071      if ((posizione_meno < 250)||(posizione_piu < 250))
01072       {if (posizione_meno < posizione_piu)
01073         {Mid(funzione_temp2,funzione_temp, posizione_scorr+1, posizione_meno - posizione_scorr);
01074          ScomponiProdotti(funzione_temp2,(((vettore_riferimenti+indice)->scomposizioni)+xpos),posizione_meno - posizione_scorr);
01075          xpos++;
01076          (((vettore_riferimenti+indice)->scomposizioni)+xpos)->scomposizione=(char**)malloc(sizeof(char*));
01077          *((((vettore_riferimenti+indice)->scomposizioni)+xpos)->scomposizione)=(char*)malloc(sizeof(char));
01078          *((((vettore_riferimenti+indice)->scomposizioni)+xpos)->scomposizione)="-";
01079 
01080           posizione_scorr = posizione_meno + 1;
01081         }
01082         else
01083         {
01084          Mid(funzione_temp2,funzione_temp, posizione_scorr+1, posizione_piu - posizione_scorr);
01085          ScomponiProdotti(funzione_temp2,(((vettore_riferimenti+indice)->scomposizioni)+xpos),posizione_piu - posizione_scorr);
01086 
01087          xpos++;
01088         (((vettore_riferimenti+indice)->scomposizioni)+xpos)->scomposizione=(char**)malloc(sizeof(char*));
01089          *((((vettore_riferimenti+indice)->scomposizioni)+xpos)->scomposizione)=(char*)malloc(sizeof(char));
01090          *((((vettore_riferimenti+indice)->scomposizioni)+xpos)->scomposizione)="+";
01091          posizione_scorr = posizione_piu + 1;
01092         }
01093          (((vettore_riferimenti+indice)->scomposizioni)+xpos)->n_colonne=1;
01094          xpos++;
01095          posizione_meno = Instr(posizione_scorr+1,funzione_temp, "-");
01096          posizione_piu = Instr(posizione_scorr+1,funzione_temp, "+");
01097          if(posizione_meno>0) posizione_meno--;
01098          if(posizione_piu>0) posizione_piu--;
01099 
01100       }
01101 
01102    }
01103 
01104      Mid(funzione_temp2,funzione_temp, posizione_scorr+1, Len(funzione_temp) - posizione_scorr );
01105      ScomponiProdotti(funzione_temp2,(((vettore_riferimenti+indice)->scomposizioni)+xpos),  Len(funzione_temp) - posizione_scorr+1);
01106     (vettore_riferimenti+ypos)->lunghezza_scomp = xpos + 1;
01107 
01108     ypos++;
01109  }
01110  // RIPRISTINO I NOMI INIZIALI DELLE VARIABILI
01111 
01112     posizione_variabile = Instr(1, funzione_iniziale, "[");
01113    while (posizione_variabile > 0)
01114     {Mid(variabile,funzione_iniziale, Instr(posizione_variabile,funzione_iniziale,";")+1, Instr(posizione_variabile, funzione_iniziale, "]") - Instr(posizione_variabile,funzione_iniziale,";") - 1);
01115      Mid(funzione_temp,funzione_iniziale, 1, posizione_variabile - 1);
01116      Concatena(funzione_temp,variabile);
01117      Mid(funzione_temp2,funzione_iniziale, Instr(posizione_variabile, funzione_iniziale, "]") + 1, Len(funzione_iniziale) - Instr(posizione_variabile, funzione_iniziale, "]"));
01118      Concatena(funzione_temp,funzione_temp2);
01119      strcpy(funzione_iniziale,funzione_temp);
01120      posizione_variabile = Instr(1, funzione_iniziale, "[");
01121     }
01122     strcpy(funzione,funzione_iniziale);
01123    //queste operazioni sono legate al fatto che occorre restituire anche la stringa di connessione
01124     Concatena(strassegnazione,funzione);
01125     strcpy(funzione,strassegnazione);
01126     free(funzione_iniziale);
01127 
01128 
01129     return(vettore_riferimenti);
01130 
01131  }
01132   else
01133    strcpy(funzione,"err");
01134    return(0);
01135 }
01136 
01137 void TParserScomponi::ScomponiProdotti(char* spezzone,scomp* puntascomp,int lunghezzaspezzone)
01138 {   int i,numerooperatori=0,posizionepartenza=0,indice=0;
01139 
01140     for(i=0;i<lunghezzaspezzone;i++)
01141     {
01142       if((spezzone[i]=='*')||(spezzone[i]=='/')||( spezzone[i]=='^'))
01143        numerooperatori++;
01144     }
01145      (*puntascomp).n_colonne=numerooperatori*2+1;
01146      (*puntascomp).scomposizione=(char**)malloc(sizeof(char*)*((*puntascomp).n_colonne));
01147  for(i=0;i<=lunghezzaspezzone;i++)
01148     {
01149       if((spezzone[i]=='*')||(spezzone[i]=='/')||( spezzone[i]=='^')||(i==lunghezzaspezzone))
01150        {
01151           *((*puntascomp).scomposizione+indice)=(char*)malloc(sizeof(char)*(i-posizionepartenza+1));
01152           Mid(*((*puntascomp).scomposizione+indice),spezzone,posizionepartenza+1,i-posizionepartenza);
01153         if(i!=lunghezzaspezzone)
01154          { indice++;
01155            *((*puntascomp).scomposizione+indice)=(char*)malloc(sizeof(char));
01156            **((*puntascomp).scomposizione+indice)=spezzone[i];
01157            indice++;
01158            posizionepartenza=i+1;
01159          }
01160        }
01161 
01162     }
01163 
01164 }

 

SourceForge Logo