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++; }