direkte Übergabe in struct



  • Ah nee, ist Blödsinn. Nur bei globalen und statischen Arrays (letztere in Funktionen). Völliger Schwachsinn. Hatte ich falsch in Erinnerung. Und x="" ist äquivalent zu x={0} .

    #include <stdio.h>
    
    int main(void)
    {
            char x[10]="";/*{0}*/
            int i;
            for(i=0;i<10;i++)
            {
                    printf("%i\n",x[i]);
            }
            return 0;
    }
    

    Kann aber auch am Compiler liegen, weil schon eine Zuweisung von "foo" die restlichen Elemente 0 setzt.



  • OkkaPapa schrieb:

    Und ja, der Input ist spaltenorientiert, d.h. es kann vorkommen, daß es kein Trennzeichen zwischen den einträgen gibt.

    Geht auch mit sscanf:

    int Read_NODE(
    char* Line,
    int* ID,
    double* X,
    double* Y,
    double* Z,
    int Debug
    ){ int err = 4;  
    
      err -= sscanf(Line+9,  "%8i",   ID);
      err -= sscanf(Line+17, "%16lf", X);
      err -= sscanf(Line+33, "%16lf", Y);
      err -= sscanf(Line+49, "%16lf", Z);
    
      return err  // 0 im Erfolgsfall sonst Fehler;
    }
    


  • DirkB schrieb:

    OkkaPapa schrieb:

    Und ja, der Input ist spaltenorientiert, d.h. es kann vorkommen, daß es kein Trennzeichen zwischen den einträgen gibt.

    Geht auch mit sscanf:

    int Read_NODE(
    char* Line,
    int* ID,
    double* X,
    double* Y,
    double* Z,
    int Debug
    ){ int err = 4;  
      
      err -= sscanf(Line+9,  "%8i",   ID);
      err -= sscanf(Line+17, "%16lf", X);
      err -= sscanf(Line+33, "%16lf", Y);
      err -= sscanf(Line+49, "%16lf", Z);
    
      return err  // 0 im Erfolgsfall sonst Fehler;
    }
    

    ... und ist viiiiieeeeeell eleganter! Thanx! 😋



  • Noch ne Frage dazu: wie mache ich das, wenn ich strings übergeben will?

    Bsp.:

    typedef struct{
      int ID;
      int Include;
      int Module;
      char Type[9];
      int MatID;
    } Type_Part;
    
    Type_Part* Part;
    
    void Read_PART(
    char* Line, 
    int* ID,
    char* Type,
    int* MechMatID
    ){
    
    int  Error=3;
    
      Error -= sscanf(Line+9,  "%8i" , ID );
      Error -= sscanf(Line+17, "%8s" , Type);
      Error -= sscanf(Line+25, "%8i" , MechMatID );
    
      if (Error != 0) printf("Error %i in %s\n Line: %s\n", Error,__FUNCTION__,Line); 
    
      return;
    
    }
    
    Read_PART(Line,
                &Part[(*AnzPart)].ID,
                &Part[(*AnzPart)].Type,
                &Part[(*AnzPart)].MatID
                );
    

    Der Compiler "sagt" expected »char « but argument is of type »char ()[9]«

    Ciao

    OkkaPapa



  • Read_PART(Line,
                &Part[(*AnzPart)].ID,
                 Part[(*AnzPart)].Type,
                &Part[(*AnzPart)].MatID
                );
    


  • Wutz schrieb:

    Read_PART(Line,
                &Part[(*AnzPart)].ID,
                 Part[(*AnzPart)].Type,
                &Part[(*AnzPart)].MatID
                );
    

    Ich muß mal ein WE in pointer investieren... auf youtube soll es ja was dazu geben...

    Danke und Schönes WE!



  • OkkaPapa schrieb:

    void Read_PART(
    

    Du solltest der rufenden Funktion auch die Chance geben, auf den Fehler zu reagieren.
    Sei es durch eine Meldung, verwerfen der Daten oder Programmende.

    Mit void als Rückgabetyp klappt das aber nicht.

    Im Augenblick hast du eine Textausgabe (die wohl nicht gelesen wird) und arbeitest mit fehlerhaften Daten weiter.



  • OkkaPapa schrieb:

    Ich muß mal ein WE in pointer investieren...

    Du hast da aber ein Array.

    Ok, in diesem Fall macht es beim Funktionsaufruf keinen Unterschied.
    Trotzdem sind Pointer und Arrays verschiedene Sachen.



  • DirkB schrieb:

    OkkaPapa schrieb:

    Und ja, der Input ist spaltenorientiert, d.h. es kann vorkommen, daß es kein Trennzeichen zwischen den einträgen gibt.

    Geht auch mit sscanf:

    int Read_NODE(
    char* Line,
    int* ID,
    double* X,
    double* Y,
    double* Z,
    int Debug
    ){ int err = 4;  
      
      err -= sscanf(Line+9,  "%8i",   ID);
      err -= sscanf(Line+17, "%16lf", X);
      err -= sscanf(Line+33, "%16lf", Y);
      err -= sscanf(Line+49, "%16lf", Z);
    
      return err  // 0 im Erfolgsfall sonst Fehler;
    }
    

    Nun gibt es aber leider doch einen Fehler...

    Die Zeile lautet
    NODE / 5000497875.694688229174-707.84635224314 552.44729377789

    Die ID des Knotens ist laut "spaltenzählen" 5000497.
    Meine Funktion mit oben liest aber 50004978 und schon gibts Probleme...

    auch mit

    err -= sscanf(Line+8,  "%8i",   ID);
    

    ist das Ergebnis identisch... wo habe ich den Knoten (im code)?



  • Dein Problem ist, dass du nicht richtig zählen kannst, der Compiler jedenfalls verzählt sich nie.



  • Wutz schrieb:

    Dein Problem ist, dass du nicht richtig zählen kannst, der Compiler jedenfalls verzählt sich nie.

    Weiterhelfen tut mir Dein Kommentar nicht... Das ich da falsch zähle weiß ich, aber wo zähl' ich falsch und warum?

    Wie mans dreht und wendet: die ID ist eine max. 8stellige Integer-Zahl, die von der 9. bis zu 16. Spalte reicht, daher sollte i8 korrekt sein.

    Zweite Fehlerquelle: Ich fange an der der falschen Stelle an zu zählen.

    Daher habe ich mal folgendes gemacht:

    printf("1234567812345678123456781234567812345678123456781234567812345678\n");
      printf("< KEY  >< ID   ><      X       ><      Y       ><      Z       >\n");
      printf("%s\n",Line);
      Error -= sscanf(Line+9,  "%8i",   ID);
      printf("ID 9     %i\n",(*ID));
      Error -= sscanf(Line+8,  "%8i",   ID);
      printf("ID 8     %i\n",(*ID));
      Error -= sscanf(Line+7,  "%8i",   ID);
      printf("ID 7     %i\n",(*ID));
    

    ... und das kommt raus:

    1234567812345678123456781234567812345678123456781234567812345678
    < KEY  >< ID   ><      X       ><      Y       ><      Z       >
    NODE  /  5000506881.315141569998-708.93758905492546.939696295506
    ID 9     50005068
    ID 8     50005068
    ID 7     50005068
    1234567812345678123456781234567812345678123456781234567812345678
    < KEY  >< ID   ><      X       ><      Y       ><      Z       >
    NODE  /  5000507        875.7085        -709.828        543.9399
    ID 9     5000507
    ID 8     5000507
    ID 7     5000507
    1234567812345678123456781234567812345678123456781234567812345678
    < KEY  >< ID   ><      X       ><      Y       ><      Z       >
    NODE  /  5000508875.696021113641-710.03140979639541.451424039574
    ID 9     50005088
    ID 8     50005088
    ID 7     50005088
    1234567812345678123456781234567812345678123456781234567812345678
    < KEY  >< ID   ><      X       ><      Y       ><      Z       >
    NODE  /  5000509875.697204436492-711.94436679355541.817120829625
    ID 9     50005098
    ID 8     50005098
    ID 7     50005098
    1234567812345678123456781234567812345678123456781234567812345678
    < KEY  >< ID   ><      X       ><      Y       ><      Z       >
    NODE  /  5000510875.819979032197-711.56479395172 543.90863009065
    ID 9     50005108
    ID 8     50005108
    ID 7     50005108
    

    Egal, ob ich 7, 8 oder 9 auf Line addiere, die ID ist falsch, wenn kein Leerzeichen als Trenner drin ist.
    Das peil' ich nicht, denn eigentlich sollte das so nicht sein

    Habe den alten Code rekativiert, der zählt korrekt und das Ergebnis stimmt...



  • ** Input white-space characters (as specified by the isspace function) are skipped, unless the specification includes a [, c, or n specifier. **



  • Angesichts der Leerzeichen würde ich ganz stumpf chars einlesen.

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    const char *test[] = {
      "NODE  /  5000506881.315141569998-708.93758905492546.939696295506",
      "NODE  /  5000507        875.7085        -709.828        543.9399",
      "NODE  /  5000508875.696021113641-710.03140979639541.451424039574",
      "NODE  /  5000509875.697204436492-711.94436679355541.817120829625",
      "NODE  /  5000510875.819979032197-711.56479395172 543.90863009065",
      ""
      };
    
    int main(void){
      const char **t=test;
      char id[9]={0};
      char x[17]={0}, y[17]={0}, z[17]={0};
      while(**t) {
        if(sscanf(*t, "%*8c%8c%16c%16c%16c", id, x, y, z)==4)
          printf("%d: (%.12f, %.12f, %.12f)\n", atoi(id), atof(x), atof(y), atof(z)); 
        ++t;
      }
    }
    

Anmelden zum Antworten