Veröffentlicht 21. Mai 200520 j Hallo Leute, mein C-99 Programm liest eine Datei zeilenweise ein. Eine dieser Zeilen enthält folgende Informationen: °C rF pa mm ... Eine andere Zeile enthält verschiedene Offsetangaben wie: -1.3 0.45 1 1.735 ... Insgesamt finden sich immer i=12 Häppchen mit Leerzeichen getrennt in den Zeilen. Diese Häppchen sollen nun an den Leerzeichen getrennt werden und an char *einheit [] und float offset[] übergeben werden. Als erstes setze ich strtok(DATEILZEILE|NULL, " ") zur Häppchenbildung ein - was auch prima funktioniert. Dann versuche ich diese Häppchen meinen Arrays zuzuordnen - was nicht funktioniert. char *einheit[]; float offset[]; int i; ... offset[0]= strtof(strtok(DATEIZEIGER, " ")); for(i=1; i<=11; i++){ offset= strof(strok(NULL, " ")); } ... einheit[0]= strtok(DATEIZEIGER, " "); for(i=1; i<=11; i++){ einheit= strok(NULL, " "); } Das Ergebnis für offset[] ist: Keine Fehlermeldung des Kompilers aber auch immer nur 0.000 als Offsetangabe. Für einheit[] meint der Kompiler, das die Variablentypen unverträglich sind. Weiß jemand Rat wie die Umwandlungen klappen könnten? - Danke Siegfried
21. Mai 200520 j Hallo, poste doch bitte mal den gesamten Code. Es ist beispielsweise nicht zu erkennen, ob Du Speicher allokiert hast. Du zählst von 1 bis 11. Ein beliebter Fehler ist malloc(11) zu verwenden, die gültigen Indizes liegen dann jedoch nur bei 0..10. Nic
24. Mai 200520 j Hallo nic nein, ich allokiere nicht. Der gesamte Code wäre sicher etwas zu labg, deshalb habe ich mich auf die fraglichen Teile beschränkt. In der If-Kaskade und der Case Abfrage kann man sehen, das ich auch noch weitere Parameter einlese, dort funktioniert alles einwandfrei - weil es nur einer Umwandlung von atoi bedarf... Zum Code: Mir ist es noch nicht gelungen es überlsichtlicher zu posten - ich arbeite daran! #include <stdio.h> #include <string.h> #define MAX_ZEILENLAENGE 200 char *einheit[ ] = {"DIGITS", "DIGITS", "DIGITS", "DIGITS", "DIGITS", "DIGITS", "DIGITS", "DIGITS", "DIGITS", "DIGITS", "DIGITS", "DIGITS"}; float offset[ ] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; char zeile[MAX_ZEILENLAENGE]; int label = 0; int akt_laenge_zeile = 0; char akt_parameter_name[] = ""; int main(void){ fz_parameter = fopen("parameter.txt", "r"); if(fz_parameter == NULL){ printf("\nDatei parameter.txt konnte nicht geöfnet werden!\n"); return; } while(fgets(zeile, MAX_ZEILENLAENGE, fz_parameter) != NULL){ if( strlen(zeile) > 1){ // Alle Zeilen ignorieren die kürzer als 1 Zeichen sind. if(strchr(zeile, '#') == NULL){ // Alle Auskommentierten Zeilen ignorieren. if(label == 0){ // 0=Ja!: Parameter suchen. (<>0=Nein!: Parameterreihe bearbeiten) if(strstr(zeile, "---") != NULL){ // Alle Parameterüberschriften, beginnend mit `’---‚ finden akt_laenge_zeile = strlen(zeile); j=0; // Herausschneiden der ... for(i=3; i<=akt_laenge_zeile-5; i++){ // ... Parameternamen ... akt_parameter_name[j]= zeile[i]; // ... aus den mit ... j++; // --- beginnenden und --- } // ... abschließenden Zeilen, sowie Stringabschluß ... akt_parameter_name[j]='\0'; // ... mit '\0'. if(strcmp(akt_parameter_name, "einheit") == 0){ // --- 3 Einheiten --- printf("Name: %s\n",akt_parameter_name); label = 3; } if(strcmp(akt_parameter_name,"offset") == 0){ // --- 5 Offset b --- printf("Name: %s\n",akt_parameter_name); label = 5; } } } else{ // <>=Nein!: Parameterreihe jetzt bearbeiten. switch(label){ case 3: // --- 3 Einheiten --- printf("Reihe: %s\n", zeile); /*einheit[0]= strtok(zeile," "); for(i=1; i<=11; i++){ einheit[i] = strtok(NULL, " "); }*/ label=0; break; case 5: // --- 5 Offset b n.i.o. --- printf("Reihe: %s\n", zeile); printf(">>> %f <<<",strtof(strtok(zeile, " "))); label=0; break; default: // --- F E H L E R --- printf("Programminterner Fehler (bei switch-Marke)\n"); label=0; break; } } } } } fclose(fz_parameter);
24. Mai 200520 j nein, ich allokiere nicht. ... char akt_parameter_name[] = ""; Das ist das Problem. akt_parameter_name ist ein Array mit einem Element, und zwar dem Stringende-Zeichen. Jeder Zugriff mit einem anderen Index als 0 bewirkt undefiniertes Verhalten.
29. Mai 200520 j Hoppla, ich dachte ich hätte dort eine "Stringvariable" mit nicht festgelegter Länge definiert!? Ich lese aus einer Datei unterschiedlich lange Namen und speichere die jeweils zum einmaligen Gebrauch in akt_parametername. Danke - Ich versuche mal meine Definition zu korrigieren. Siegfried
29. Mai 200520 j Hoppla, ich dachte ich hätte dort eine "Stringvariable" mit nicht festgelegter Länge definiert!?Nicht ganz. Wenn du ein char-Array ohne Längenangabe mit einem Literal initialisierst, wird die Länge des Literals benutzt, in deinem Fall 1.
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.