siegfried Geschrieben 21. Mai 2005 Geschrieben 21. Mai 2005 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 Zitieren
nic_power Geschrieben 21. Mai 2005 Geschrieben 21. Mai 2005 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 Zitieren
siegfried Geschrieben 24. Mai 2005 Autor Geschrieben 24. Mai 2005 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); Zitieren
Klotzkopp Geschrieben 24. Mai 2005 Geschrieben 24. Mai 2005 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. Zitieren
siegfried Geschrieben 29. Mai 2005 Autor Geschrieben 29. Mai 2005 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 Zitieren
Klotzkopp Geschrieben 29. Mai 2005 Geschrieben 29. Mai 2005 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. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.