Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben

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

Geschrieben

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);

Geschrieben
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.

Geschrieben

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

Geschrieben
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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...