Array und StringGrid



  • Hallo,

    ich möchte für die unten genannte Funktion in das Array N_Arr Zahlen aus einen StingGrid einlesen.
    Ich bekomme immer eine Exception "ungültiger Gleitkommawert".
    Die Zellen wurden zuvor gefüllt durch
    StringGrid1->Cells[2][3] = Memo2->Lines->Strings[3];
    StringGrid1->Cells[2][4] = Memo2->Lines->Strings[11];
    usw.

    Warum kann ich die Zahlen aus dem Grid nicht iin das Array einlesen?

    double N_Arr[5];
    int size = 5;
    
    String Ratio(double N_Arr[])
    {
      double Ausgabe =  (StdDev(N_Arr, size)) / (Mean(N_Arr, size))*100;
      return FloatToStrF(Ausgabe, ffFixed, 7, 2) + "%";
    }
    
           N_Arr[1] =  StrToFloat(StringGrid1->Cells[2][3]);
           N_Arr[2] =  StrToFloat(StringGrid1->Cells[2][4]);
           N_Arr[3] =  StrToFloat(StringGrid1->Cells[2][5]);
           N_Arr[4] =  StrToFloat(StringGrid1->Cells[2][6]);
           N_Arr[5] =  StrToFloat(StringGrid1->Cells[2][7]);
    
       StringGrid1->Cells[1][14] = Ratio(N_Arr,size);
    


  • // so muss sie richtig heißen
    
          String Ratio(double N_Arr[],int size)
    {
      double Ausgabe =  (StdDev(N_Arr, size)) / (Mean(N_Arr, size))*100;
      return FloatToStrF(Ausgabe, ffFixed, 7, 2) + "%";
    }
    


  • Wie sehen die Werte im StringGrid denn aus?

    Wahrscheinlich hast du ein Problem mit dem DecimalSeparator, zu letzterem sollte dir die Suchfunktion einige Beiträge auflisten.



  • Also eigentlich steht in StringGrid1->Cells[2][3] die Zahl 7780 und mehr nicht.

    Was ist mit den Funktionen TrimLeft und TrimRight.
    Ich habe mir gedacht, wenn ich diese benutze, dann verschwinden alle eventl. enthaltenen Leer- und Steuerzeichen.
    Darf ich diese beiden Funktionen dann so zusammen schreiben?

    N_Arr[1] =  StrToFloat(TrimRight(TrimRight(StringGrid1->Cells[2][3])));
    

    Der Fehler bleibt aber.
    Werde jetzt mal Deinen Hinweis nachgehen.



  • Muss natürlich so heissen:

    N_Arr[1] = StrToFloat(TrimLeft(TrimRight(StringGrid1->Cells[2][3])));



  • statt TrimLeft und TrimRight kannste gleich Trim nehmen!

    wenn du eine Variablen-Umwandlung durchführst, solltest du das immer in einem try und catch Block machen, damit dein Programm im Fehlerfall nicht abschmiert!

    zum beispiel so:

    float CheckStrToFloat(AnsiString strValue)
    {
      float fValue;
    
      try
      {
        fValue = StrToFloat(strValue);
      }
    
      // konvertierungsfehler abfangen
      catch( EConvertError & E )
      { 
        fValue = 0.0;
    
        // bzw.
    
        ShowMessage(AnsiString("Fehler beim Konvertieren von [" + strValue + "]!"));
      }
    
      return fValue;
    }
    

    sowas brauchst du natürlich nur, wenn du nicht 100% weisst, ob der string auch ein gleitkommawert ist (z.b. korrekten DecimalSeparator enthält).

    [ Dieser Beitrag wurde am 21.02.2003 um 12:26 Uhr von Sunday editiert. ]



  • ok , danke euch,

    ich habs jetzt hinbekommen--> dank debuggen.
    Der Fehler lag in der Abfrage der Strings[].So sieht es jetzt aus.

    infile >> buff;
    while ( !infile.eof() )
      {
          Memo2->Lines->Add(buff);
           if( Memo2->Lines->Count == i)
           switch (i)
             {
             case 4:  N_Arr[0] = StrToFloat(Memo2->Lines->Strings[3]);
                      StringGrid1->Cells[1][14] = N_Arr[0];
                      break;
    
             case 12: N_Arr[1] = StrToFloat(Memo2->Lines->Strings[11]);
                      StringGrid1->Cells[1][15] = N_Arr[1];
                      break;
    
             case 20: N_Arr[2] = StrToFloat(Memo2->Lines->Strings[19]);
                      StringGrid1->Cells[1][16] = N_Arr[2];
                      break;
    
             case 28: N_Arr[3] = StrToFloat(Memo2->Lines->Strings[27]);
                      StringGrid1->Cells[1][17] = N_Arr[3];
                      break;
    
             case 36: N_Arr[4] = StrToFloat(Memo2->Lines->Strings[35]);
                      StringGrid1->Cells[1][18] = N_Arr[4];
                      break;
    
              }
        if ( i == 36)
            StringGrid1->Cells[1][19] = Ratio(N_Arr,size);
    
             StringGrid1->Cells[2][3] = "   " + Memo2->Lines->Strings[3];
             StringGrid1->Cells[3][3] = "   " + Memo2->Lines->Strings[4];
             StringGrid1->Cells[2][4] = "   " + Memo2->Lines->Strings[11];
             StringGrid1->Cells[3][4] = "   " + Memo2->Lines->Strings[12];
             StringGrid1->Cells[2][5] = "   " + Memo2->Lines->Strings[19];
             StringGrid1->Cells[3][5] = "   " + Memo2->Lines->Strings[20];
             StringGrid1->Cells[2][6] = "   " + Memo2->Lines->Strings[27];
             StringGrid1->Cells[3][6] = "   " + Memo2->Lines->Strings[28];
             StringGrid1->Cells[2][7] = "   " + Memo2->Lines->Strings[35];
             StringGrid1->Cells[3][7] = "   " + Memo2->Lines->Strings[36];
         //usw.
    
          infile >> buff;
          i++;
    
       }
    

Anmelden zum Antworten