Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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

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

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

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.