minicrispie: Datenbank mit C benutzen

Hallo,

ich hab mal wieder eine Frage an die C-Programmierer hier ;)

in meinem Programm habe ich vor, eine "Datenbank" (CSV-Datei) auszulesen. Dabei ist folgender Aufbau gegeben:

--> long int;char;float;int[Zeilenumbruch]

Dabei bestimme ich vorher die größe der Datei(da alle Felder eine feste länge haben)...

long      *Datenbank_EAN;  
char     **Datenbank_ArtikelName;  
float     *Datenbank_Preis;  
int       *Datenbank_Steuersatz;  
  
[...]  
  
 fseek(datei, 0L, SEEK_END);  
 groesse = ftell(datei);

... und erzeuge dementsprechend die Arrays:

 Datenbank_EAN = (long *) malloc(AnzahlDatensaetze * sizeof(long));  
 Datenbank_ArtikelName = (char **) malloc(AnzahlDatensaetze * sizeof(char));  
 for(i=0; i<AnzahlDatensaetze; i++) //Zweidimensionales char-Array erzeugen  
 {  
  Datenbank_ArtikelName[i] = (char *) malloc(21 * sizeof(char));  
 }  
 Datenbank_Preis = (float *) malloc(AnzahlDatensaetze * sizeof(float));  
 Datenbank_Steuersatz = (int *) malloc(AnzahlDatensaetze * sizeof(int));

Danach will ich die Datei auslesen und alles zusammen in Arrays speichern:

  
 fseek(datei, 0L, SEEK_SET);  
 i=0;  
 while((fscanf(datei, "%d;%s;%f;%i", &Datenbank_EAN[i], &Datenbank_ArtikelName[i], &Datenbank_Preis[i], &Datenbank_Steuersatz[i]) != EOF))  
 {  
  i++;  
 }

Nur an der Stelle, an welcher ich auslese hängt sich das Programm auf. Könnt ihr mir sagen, was ich falsch mache?
Ich bin echt langsam am verzweifeln...

MfG. Christoph Ludwig

--
Wo die Sprache aufhört, fängt die Musik an...
Selfcode:  ie:( fl:| br:^ va:| ls:/ fo:| rl:? n4:) ss:) de:] js:) ch:{ sh:) mo:) zu:)
Go to this
  1. Hi, und womit "hängt" sich das Programm an genau welcher Stelle auf?

    Woher kommt den "AnzahlDatensaetze"? Und warum verwendest du bei
    Datenbank_Artikelname auf einmal 21?

    Und warum so kompliziert mit 4 Arrays? Kannst du nicht ein Objekt mit den vier Eigenschaften erzeugen und dann ein Array von/mit diesen Objekten füllen?

    Ciao, Frank

    1. Hallo,

      Hi, und womit "hängt" sich das Programm an genau welcher Stelle auf?

      bei dem Lesen der Datei hängt sich das Programm auf.

      Woher kommt den "AnzahlDatensaetze"? Und warum verwendest du bei
      Datenbank_Artikelname auf einmal 21?

      alle Felder haben eine Feste länge und deswegen ist
      anzahlDatensaetze = groesse / [länge von einem Datensatz]

      Und warum so kompliziert mit 4 Arrays? Kannst du nicht ein Objekt mit den vier Eigenschaften erzeugen und dann ein Array von/mit diesen Objekten füllen?

      ich programmiere in C ... da gibts keine Objekte ;)

      MfG. Christoph Ludwig

      --
      Wo die Sprache aufhört, fängt die Musik an...
      Selfcode:  ie:( fl:| br:^ va:| ls:/ fo:| rl:? n4:) ss:) de:] js:) ch:{ sh:) mo:) zu:)
      Go to this
      1. Ah, okay, dann halt keine Objekte. ;)

        Und "hängt" auf äussert sich wie genau? Es wird einfach nicht fertig und tut gar nichts, es bricht mit einer Fehlermeldung ab, es konsumiert alle CPU Resourcen?

        Hast du mal probiert das Problem zu isolieren? Sprich einfach nur, Datei auf, alles auslesen, raus and Konsole/stdout, Datei wieder zu? fscanf liefert vielleicht irgendwas zurück und liefert nie EOF? keine ahnung?? ;(

        Ciao, Frank

        1. Hallo,

          Ah, okay, dann halt keine Objekte. ;)

          Und "hängt" auf äussert sich wie genau? Es wird einfach nicht fertig und tut gar nichts, es bricht mit einer Fehlermeldung ab, es konsumiert alle CPU Resourcen?

          es reagiert auf gar nichts mehr ... nach einigen mausklicken erscheint ein Dialog, wo ich auf "Sofort beenden" drücke und danach ist schluss ...

          Hast du mal probiert das Problem zu isolieren? Sprich einfach nur, Datei auf, alles auslesen, raus and Konsole/stdout, Datei wieder zu?

          nee... kann ich nicht, da ich nicht die größe des Text-files weis(anzahl der Datensätze) ... noch dazu arbeite ich in WinApi :)

          fscanf liefert vielleicht irgendwas zurück und liefert nie EOF?
          hmmm ... ok .. ich hab mir mal den rückgabewert ausgeben lassen:

           fseek(datei, 0L, SEEK_SET);  
           int dings = 0;  
           i=0;  
           do  
           {  
            dings = fscanf(datei, "%d;%s;%f;%i\n", &Datenbank_EAN[i], &Datenbank_ArtikelName[i][0], &Datenbank_Preis[i], &Datenbank_Steuersatz[i]);  
            strcpy(str, "");  
            sprintf(str, "%i", dings);  
            MessageBox(hWnd, str, "...", MB_OK);  
            i++;  
           }  
           while(!feof(datei));
          

          ergebnis:
          2
          0
          0
          0
          0
          .
          .
          .

          was soll das bedeuten?

          MfG. Christoph Ludwig

          --
          Wo die Sprache aufhört, fängt die Musik an...
          Selfcode:  ie:( fl:| br:^ va:| ls:/ fo:| rl:? n4:) ss:) de:] js:) ch:{ sh:) mo:) zu:)
          Go to this
          1. Hallo,

            noch ein Problem:

            Das hier ist der Inhalt der Text-Datei:
            1234567891234;Birne               ;0000.95;07
            9465732864513;Apfel               ;0000.56;07
            1678432976452;Johannisbeere       ;0000.68;07
            7964351687431;Staubsauger         ;0089.99;19
            4653791584678;Erdbeere            ;0000.64;07
            4387691234395;Notebook            ;0449.99;19
            4324829243582;Chocolate Republic  ;0002.55;19

            Diesen Gebe ich so wieder:

              
             for(i=0; i<AnzahlDatensaetze; i++)  
             {  
              strcpy(str, "");  
              //EAN ARTIKEL PREIS(mit MwSt.)  
              sprintf(str, "%d %s %f\r\n", Datenbank_EAN[i], Datenbank_ArtikelName[i], (Datenbank_Preis[i]/100/(100+(float)Datenbank_Steuersatz[i])));  
              //Ausgabe in die Liste  
              SetDlgItemText(hWnd, 1401, str);  
             }
            

            als Ausgabetext steht danach aber im Textfeld:
            1128088908 x|| 0.000000

            also jetzt bin ich echt ratlos ;)

            MfG. Christoph Ludwig

            MfG. Christoph Ludwig

            --
            Wo die Sprache aufhört, fängt die Musik an...
            Selfcode:  ie:( fl:| br:^ va:| ls:/ fo:| rl:? n4:) ss:) de:] js:) ch:{ sh:) mo:) zu:)
            Go to this
            1. Hallo,

              strcpy(str, "");

              das ist schön, aber überflüssig, wenn du den String gleich in der nächsten Anweisung sowieso mit sprintf() füllst. Außerdem wäre, wenn nötig, ein simples
                str[0] = 0;
              einfacher und "billiger" als der Aufruf einer Stringfunktion.

              sprintf(str, "%d %s %f\r\n", Datenbank_EAN[i], Datenbank_ArtikelName[i], (Datenbank_Preis[i]/100/(100+(float)Datenbank_Steuersatz[i])));
              als Ausgabetext steht danach aber im Textfeld:
              1128088908 x|| 0.000000

              Dann hattest du schon vorher ein Problem mit Datenbank_ArtikelName[i]. Hast du den Wert vorher mal überprüft?

              So long,
               Martin

              --
              Du kannst dem Leben nicht mehr Tage geben.
              Aber dem Tag mehr Leben.
              1. Hallo,

                Hallo,

                strcpy(str, "");

                das ist schön, aber überflüssig, wenn du den String gleich in der nächsten Anweisung sowieso mit sprintf() füllst. Außerdem wäre, wenn nötig, ein simples
                  str[0] = 0;
                einfacher und "billiger" als der Aufruf einer Stringfunktion.

                ja, ok ... das ist nur eine Frage von Codingstyle --> den muss ich sowieso noch mal überarbeiten weil ich jetz so viel in der funktion rumgepfuscht hab ;)

                sprintf(str, "%d %s %f\r\n", Datenbank_EAN[i], Datenbank_ArtikelName[i], (Datenbank_Preis[i]/100/(100+(float)Datenbank_Steuersatz[i])));
                als Ausgabetext steht danach aber im Textfeld:
                1128088908 x|| 0.000000

                Dann hattest du schon vorher ein Problem mit Datenbank_ArtikelName[i]. Hast du den Wert vorher mal überprüft?

                wie und an welcher stelle soll ich den überprüfen?
                ich les den wert aus, schreibe ihn in den Array und dazwischen mache ich nichts ...

                MfG. Christoph Ludwig

                --
                Wo die Sprache aufhört, fängt die Musik an...
                Selfcode:  ie:( fl:| br:^ va:| ls:/ fo:| rl:? n4:) ss:) de:] js:) ch:{ sh:) mo:) zu:)
                Go to this
            2. Hallo Ludwig,

              zu den structs und den globalen Parametern:

              C ist eine mächtige Sprache, und man darf als Entwickler einfach nicht alles machen, was sie einem erlaubt. So sollte man auf globale Variablen weitestgehend verzichten, weil sie fehlerträchtig sind und die Fehler sich auch noch schwer finden lassen. Du musst Dich dringend mit Zeigern und mit Parameterübergabe beschäftigen, sonst kommst Du in C nicht weit.

              Eine Struktur, genauso wie ein Array machst Du in einer Funktion nutzbar, in dem Du einen Zeiger darauf als Parameter überträgst. Den Zeiger erhälst Du über & also z.B. beim Funktionsaufruf Funktionsname(&meineStruktur). Innerhalb der Funktion referenzierst Du den Inhalt eines Zeigers über *. Also z.B. *pMeineStruktur.elementname (da der Übergabeparameter ein Zeiger ist, ist es sinnvoll, seinen Namen mit p (wie Pointer) auch so zu kennzeichnen). Oder bei Strukturen kannst Du auf die Elemente einer verzeigerten Struktur bequem so zugreifen: pMeineStruktur->elementname.

              Zu Deinem Problem:

              Bei Deinem Fehler tippe ich auf einen Buffer-Überlauf. Das Einlesen der Daten mittels scanf ist prädestiniert für so etwas, da scanf ja die Länge der gelesenen Daten nicht überprüft, sondern gnadenlos in den angegebenen Speicherbereich schreibt, auch wenn der reservierte Buffer dafür zu klein ist. Wieviel Byte stehen auf Deinem System für long-Variablen zur Verfügung? Du bräuchtes sechs.

              Steigt Dein REchner schon nach einem Lesevorgang (einem Schleifendurchlauf) aus? Lies doch jeweils erstmal nur die einzelnen Zeilen mit einem zeilenorientierten Lesebefehl. Und dann parst Du die einzelnen Zeilen in Deine Struktur. Du kannst sie auch erst noch in einzelne Strings für jeden Parameter zerlegen. So kannst Du Schritt für Schritt heraus finden, wo der Fehler liegt. Denkst Du bei Deinen Strings dran, dass sie immer ein Byte mehr für die Ende-Kennung brauchen?

              Ciao, Stefanie

              1. Hallo,

                Hallo Ludwig,

                nee ... Christoph. Ludwig ist nur der Nachname ;)

                zu den structs und den globalen Parametern:

                C ist eine mächtige Sprache, und man darf als Entwickler einfach nicht alles machen, was sie einem erlaubt. So sollte man auf globale Variablen weitestgehend verzichten, weil sie fehlerträchtig sind und die Fehler sich auch noch schwer finden lassen.

                Ja ok. außer das Fenster-Handle(HWND hWnd) habe ich keine Globalen Variablen und ich bin mir bewusst, das es besser ist, Zeiger zu verwenden und auf Globale Variablen zu verzichten.
                (Coding-Style)

                Du musst Dich dringend mit Zeigern und mit Parameterübergabe beschäftigen, sonst kommst Du in C nicht weit.

                das wird nicht einfach, da ich diese Funktionen, die auf die struktur zufgreifen als Prozedur eines Dialoges aufrufe. Somit kann ich der Funktion keine Parameter übergeben.
                die Zeiger an sich wären kein Problem, da ich mich weitestgehend damit auskenne.

                Bei Deinem Fehler tippe ich auf einen Buffer-Überlauf. Das Einlesen der Daten mittels scanf ist prädestiniert für so etwas, da scanf ja die Länge der gelesenen Daten nicht überprüft, sondern gnadenlos in den angegebenen Speicherbereich schreibt, auch wenn der reservierte Buffer dafür zu klein ist. Wieviel Byte stehen auf Deinem System für long-Variablen zur Verfügung? Du bräuchtes sechs.

                Buffer-überlauf? Glaube ich nicht, da alle Felder in der Datei eine Feste länge haben und ich demnach nur die arrays entsprechend der Anzahl dynamisch erzeuge(malloc).
                oder welche Datentypen schlägst du bei
                   EAN          -> 13 Zahlen       -> long array[AnzahlDatensätze]
                   Artikel-Name -> max. 20 Zeichen -> char array[AnzahlDatensätze][21]
                   Preis        -> max. 999,99€    -> float array[AnzahlDatensätze]
                   Steuersatz:  -> 7% bzw. 19%     -> int array[AnzahlDatensätze]
                vor? (Dahinter stehen meine Datentypen. Sind diese zu klein?)

                Steigt Dein REchner schon nach einem Lesevorgang (einem Schleifendurchlauf) aus?

                nein, jetzt hängt er sich gar nicht mehr auf. Jetzt ist nur das Problem, das er mir sch*** ... suboptimale ergebnisse ausgibt.

                Lies doch jeweils erstmal nur die einzelnen Zeilen mit einem zeilenorientierten Lesebefehl. Und dann parst Du die einzelnen Zeilen in Deine Struktur. Du kannst sie auch erst noch in einzelne Strings für jeden Parameter zerlegen. So kannst Du Schritt für Schritt heraus finden, wo der Fehler liegt.

                ok. Ich werds mal versuchen.

                Denkst Du bei Deinen Strings dran, dass sie immer ein Byte mehr für die Ende-Kennung brauchen?

                ja, deswegen die zeile (char*) malloc(21 * sizeof(char));

                MfG. Christoph Ludwig

                --
                Wo die Sprache aufhört, fängt die Musik an...
                Selfcode:  ie:( fl:| br:^ va:| ls:/ fo:| rl:? n4:) ss:) de:] js:) ch:{ sh:) mo:) zu:)
                Go to this
                1. Hi Christoph,

                  nee ... Christoph. Ludwig ist nur der Nachname ;)

                  sorry - finde ich aber auch irgendwie witzig ;-)

                  Somit kann ich der Funktion keine Parameter übergeben.

                  Aha. Naja gut, funktionieren muss es ja trotzdem.

                  oder welche Datentypen schlägst du bei
                     EAN          -> 13 Zahlen       -> long array[AnzahlDatensätze]
                     Artikel-Name -> max. 20 Zeichen -> char array[AnzahlDatensätze][21]
                     Preis        -> max. 999,99€    -> float array[AnzahlDatensätze]
                     Steuersatz:  -> 7% bzw. 19%     -> int array[AnzahlDatensätze]
                  vor? (Dahinter stehen meine Datentypen. Sind diese zu klein?)

                  Lass Dir mal mit sizeof(long) anzeigen, wieviele Bytes Dir für ein long zur Verfügung gestellt werden. Üblicherweise sind das vier, und somit tatsächlich zu wenig für eine Zahl bestehend aus 13 Ziffern (9999999999999 braucht 6 Byte). Mit einer float-Zahl klappt es bei mir leider auch nicht richtig; es wird dann zwar ein Wert gelesen, der ist aber nicht korrekt (ich arbeite selten mit float-Zahlen, vielleicht weiss ein anderer da mehr). Aber brauchst Du hier überhaupt eine Zahl, tut es ev. auch ein String?

                  Ich habe das jetzt mal probiert, also einen Deiner Beispielstrings mit sscanf geparst folgendermaßen funktioniert das bei mir:

                  char  zeile[]    = "1234567891234;Birne               ;0000.95;07";
                  float fEan       = 0;
                  char  name[200]  = "";
                  float fPreis     = 0;
                  int   steuersatz = 0;

                  sscanf(zeile, "%f;%s ;%f;%d", &fEan, name, &fPreis, &steuersatz);

                  printf("fEan:%f name:%s preis:%f steuersatz:%d\n\n",
                         fEan, name, preis, steuersatz);

                  ergibt als Ausgabe:

                  fEan:1234567954432.000000 name:Birne preis:0.950000 steuersatz:7

                  Das Trennzeichen im Preis muss ein Punkt sein (kein Komma). Hinter dem %s muss vor dem ; noch ein Leerzeichen stehen, sonst liest er den Preis nicht richtig.

                  Ich glaube, Du hattest im sscanf-Aufruf auch die Namen-Variable falsch adressiert. Da ein string bereits ein Pointer auf einen Datenbereich ist, darf dort kein & mehr davor.

                  Vielleicht hilft Dir das schon mal weiter, ich muss gleich nach Hause und da habe ich derzeit keinen C-Compiler.

                  Ciao, Stefanie

                  1. PS: Mit einem long hast Du noch nicht mal die vollen vier Byte zur Verfügung.   Dafür müsstest Du zumindest ein unsigned long benutzen.

                    1. Hallo,

                      PS: Mit einem long hast Du noch nicht mal die vollen vier Byte zur Verfügung.   Dafür müsstest Du zumindest ein unsigned long benutzen.

                      nicht nötig ... ich hab float verwendet

                      MfG. Christoph Ludwig

                      --
                      Wo die Sprache aufhört, fängt die Musik an...
                      Selfcode:  ie:( fl:| br:^ va:| ls:/ fo:| rl:? n4:) ss:) de:] js:) ch:{ sh:) mo:) zu:)
                      Go to this
                  2. Hallo,

                    Hi Christoph,

                    nee ... Christoph. Ludwig ist nur der Nachname ;)

                    sorry - finde ich aber auch irgendwie witzig ;-)

                    häää?? *dumm tu* was jetz genau? :)

                    Das Trennzeichen im Preis muss ein Punkt sein (kein Komma). Hinter dem %s muss vor dem ; noch ein Leerzeichen stehen, sonst liest er den Preis nicht richtig.

                    DAAAASSSSSSS war der Fehler!!!!!!!
                    nur, weil ich dieses Leerzeichen nicht gesetzt habe ging das nicht. Jetzt gehts *juhuhhhhh*

                    Ich glaube, Du hattest im sscanf-Aufruf auch die Namen-Variable falsch adressiert. Da ein string bereits ein Pointer auf einen Datenbereich ist, darf dort kein & mehr davor.

                    das ist schon geändert.
                    Nur noch eine Frage:

                    wie kann ich erreichen, das ein String (%s) mit exakt 20 Zeichen ausgeben wird(linksbündig)?
                    also so, das auf jeden Fall 20 Zeichen ausgeben werden, egal ob Erdbeere(beispiel) nur 8 Zeichen hat?
                    Müsste ich da noch mir einer Schleife fehlende lehrzeichen auffüllen oder gibts da etwas "besseres" ?

                    MfG. Christoph Ludwig

                    --
                    Wo die Sprache aufhört, fängt die Musik an...
                    Selfcode:  ie:( fl:| br:^ va:| ls:/ fo:| rl:? n4:) ss:) de:] js:) ch:{ sh:) mo:) zu:)
                    Go to this
                    1. Hi,

                      häää?? *dumm tu* was jetz genau? :)

                      Ludwig ist bei uns zu Hause so eine Art geflügeltes Wort. Ludwig ist immer gerade der, dem von den anderen ignoriert wird. Frag mich nicht, woher wir das haben, aber das "Ludwig" hat mich wohl so magisch angezogen, dass ich das "Christoph" übersehen habe ;-)

                      nur, weil ich dieses Leerzeichen nicht gesetzt habe ging das nicht. Jetzt gehts *juhuhhhhh*

                      Oh schön. Dann war das meine gute Tat für heute :-)

                      wie kann ich erreichen, das ein String (%s) mit exakt 20 Zeichen ausgeben wird(linksbündig)?
                      also so, das auf jeden Fall 20 Zeichen ausgeben werden, egal ob Erdbeere(beispiel) nur 8 Zeichen hat?

                      Das müsste mit der ganz normalen Formatierungsvorschrift gehen. Also %-20s statt %s.

                      Ciao, Stefanie

                      PS: Muss jetzt zur Weihnachtsfeier, die erste von 4(!) in dieser Woche.

      2. Hi,

        Und warum so kompliziert mit 4 Arrays? Kannst du nicht ein Objekt mit den vier Eigenschaften erzeugen und dann ein Array von/mit diesen Objekten füllen?
        ich programmiere in C ... da gibts keine Objekte ;)

        aber structs, das ist dasselbe in grün. Und das fiel mir beim Lesen deines Beitrags auch auf: Warum definiert er sich nicht eine Struktur, die einem einzelnen Datensatz entspricht, und arbeitet mit einem Array dieser Strukturen?

        So long,
         Martin

        --
        Paradox ist, wenn der Innenminister sich äußert und der Außenminister sich erinnert.
        1. Hallo,

          aber structs, das ist dasselbe in grün. Und das fiel mir beim Lesen deines Beitrags auch auf: Warum definiert er sich nicht eine Struktur, die einem einzelnen Datensatz entspricht, und arbeitet mit einem Array dieser Strukturen?

          Das wäre eine Möglichkeit die gar nicht so dumm wäre ... nur mit structs kenne ich mich nicht so richtig aus un so entsteht erst einmal das Problem: wie kann ich mit unterschiedlichen Funktionen auf ein und denselben Datensatz
          zugreifen?

          MfG. Christoph Ludwig

          --
          Wo die Sprache aufhört, fängt die Musik an...
          Selfcode:  ie:( fl:| br:^ va:| ls:/ fo:| rl:? n4:) ss:) de:] js:) ch:{ sh:) mo:) zu:)
          Go to this
          1. Hallo Christoph,

            aber structs, das ist dasselbe in grün. Und das fiel mir beim Lesen deines Beitrags auch auf: Warum definiert er sich nicht eine Struktur, die einem einzelnen Datensatz entspricht, und arbeitet mit einem Array dieser Strukturen?

            Das wäre eine Möglichkeit die gar nicht so dumm wäre ... nur mit structs kenne ich mich nicht so richtig aus

            es ist keine gute Idee, geeignete Features einer Programmiersprache nicht zu nutzen. Mach Dich mit struct vertraut.

            un so entsteht erst einmal das Problem: wie kann ich mit unterschiedlichen Funktionen auf ein und denselben Datensatz
            zugreifen?

            Was hat das mit structs zu tun?

            Freundliche Grüße

            Vinzenz

            1. Hallo,

              Hallo Christoph,

              aber structs, das ist dasselbe in grün. Und das fiel mir beim Lesen deines Beitrags auch auf: Warum definiert er sich nicht eine Struktur, die einem einzelnen Datensatz entspricht, und arbeitet mit einem Array dieser Strukturen?

              Das wäre eine Möglichkeit die gar nicht so dumm wäre ... nur mit structs kenne ich mich nicht so richtig aus

              es ist keine gute Idee, geeignete Features einer Programmiersprache nicht zu nutzen. Mach Dich mit struct vertraut.

              un so entsteht erst einmal das Problem: wie kann ich mit unterschiedlichen Funktionen auf ein und denselben Datensatz
              zugreifen?

              Was hat das mit structs zu tun?

              weil ich (noch) nicht weis wie man da auf die Datensätze zugreifen kann, da ich die structs mit verschiedenen Funktionen nutze...

              struct Datenspeicher{
                 long  EAN;
                 char  ArtikelName[21];
                 float Preis;
                 int   Steuersatz;
              }DS;

                
              int funktion()  
              {  
                 DS datensatz_1;  
                 datensatz_1.EAN = 13;  
                 andrer_funktion();  
              }  
              int andrer_funktion()  
              {  
                 DS datensatz_1;  
                 printf("%d", datensatz_1.EAN); //Ist der Datensatz hier 13?  
              }  
              int main()  
              {  
                 funktion();  
                 getch();  
                 return 0;  
              }
              

              sollte so etwas jetzt funktionieren?

              MfG. Christoph Ludwig

              --
              Wo die Sprache aufhört, fängt die Musik an...
              Selfcode:  ie:( fl:| br:^ va:| ls:/ fo:| rl:? n4:) ss:) de:] js:) ch:{ sh:) mo:) zu:)
              Go to this
              1. sollte so etwas jetzt funktionieren?

                wahrscheinlich eher nicht.

                Woher sollte "andrer_funktion()" wissen, dass die Eigenschaft EAN die du irgendeiner Instanz von Datenspeicher in irgendeiner Funktion zugewiesen hast?

                Von wegen Gültigkeitsbereich und so.

                Frank

                1. Hallo,

                  wahrscheinlich eher nicht.

                  Woher sollte "andrer_funktion()" wissen, dass die Eigenschaft EAN die du irgendeiner Instanz von Datenspeicher in irgendeiner Funktion zugewiesen hast?

                  Von wegen Gültigkeitsbereich und so.

                  eben. Das ist das Problem, da die Datensätze von mehrern Funktionen zu unterschiedlichen Zeitpunkten verwendet werden ...

                  MfG. Christoph Ludwig

                  --
                  Wo die Sprache aufhört, fängt die Musik an...
                  Selfcode:  ie:( fl:| br:^ va:| ls:/ fo:| rl:? n4:) ss:) de:] js:) ch:{ sh:) mo:) zu:)
                  Go to this
                  1. Hallo,

                    Woher sollte "andrer_funktion()" wissen, dass die Eigenschaft EAN die du irgendeiner Instanz von Datenspeicher in irgendeiner Funktion zugewiesen hast?

                    Von wegen Gültigkeitsbereich und so.

                    eben. Das ist das Problem, da die Datensätze von mehrern Funktionen zu unterschiedlichen Zeitpunkten verwendet werden ...

                    wo ist das Problem? Warum hast Du es nicht, wenn Du statt in ein eindimensionales Array von structs Deine Daten in x Arrays einliest?

                    Freundliche Grüße

                    Vinzenz

                  2. Wieso hast du dann Zugriff auf irgendein dahergelaufenes Array? Und irgendwie schrieb ich ja auch davon, die erzeugten Objekte/struct instanzen zu Elementen eines Arrays zu machen. Ansonsten kann man Variablen doch auch als Referenz zwischen Funktionen übergeben, dachte ich zumindest mal.

                    Und Probleme sollte man immer versuchen so gut wie möglich zu isolieren, d.h. notfalls ein anderes kleines Programm schreiben, was "nicht funzende" Teile des eigentlichen Programms nachbildet. In deinem Falle wäre das:

                    • Datei öffnen
                    • Inhalt komplett auslesen
                    • Datei zumachen
                    • Irgendwie darstellen (Textbox, MessageBox, Konsole - vollkommen wurst)

                    Und dann davon ausgehend den Umfang der Funktion erweitern, bis es nicht mehr funktioniert und es den ursprünglichen Zweck erfüllt, dann kannst du es zurückpacken in den anderen Code.

                    Mit was entwickelst du denn eigentlich, Notepad und Compiler?

                    Frank

                    1. Hallo,

                      Wieso hast du dann Zugriff auf irgendein dahergelaufenes Array? Und irgendwie schrieb ich ja auch davon, die erzeugten Objekte/struct instanzen zu Elementen eines Arrays zu machen. Ansonsten kann man Variablen doch auch als Referenz zwischen Funktionen übergeben, dachte ich zumindest mal.

                      weil mein array global gesetzt ist.

                      Und Probleme sollte man immer versuchen so gut wie möglich zu isolieren,

                      ist nicht nötig, da davor nur ein Fenster erzeugt wird ... also kann ich gleich in der funktion rumpfuschen ;)

                      Mit was entwickelst du denn eigentlich, Notepad und Compiler?

                      notepad++ und Dev C++ 4.9.9.2

                      MfG. Christoph Ludwig

                      --
                      Wo die Sprache aufhört, fängt die Musik an...
                      Selfcode:  ie:( fl:| br:^ va:| ls:/ fo:| rl:? n4:) ss:) de:] js:) ch:{ sh:) mo:) zu:)
                      Go to this
                      1. weil mein array global gesetzt ist.

                        Na da hast du ja die Antwort.

                        FF

                        1. Hallo,

                          weil mein array global gesetzt ist.
                          Na da hast du ja die Antwort.

                          was soll daran falsch sein ein Array global zu setzen?
                          das ist das gleiche als wenn ich es lokal setze, nur das ich mit mehreren funktionen zugreifen kann ... das hat nix damit zu tun, das die werte nicht richtig eingelesen werden oder falsch ausgegeben werden ...

                          MfG. Christoph Ludwig

                          --
                          Wo die Sprache aufhört, fängt die Musik an...
                          Selfcode:  ie:( fl:| br:^ va:| ls:/ fo:| rl:? n4:) ss:) de:] js:) ch:{ sh:) mo:) zu:)
                          Go to this
                          1. Habe ich irgendwas davon geschrieben, dass es falsch sein, ein Array global zu deklarieren?

                            Nochmal für dich zum mitmeisseln:

                            • du setzt x Arrays global, damit du mit mehreren Funktionen von unterschiedlichen Ecken drauf zugreifen kannst
                            • dir wurde empfohlen, ein struct zu verwenden (und auch dessen Instanzen in einem Array zu halten)
                            • du hast irgendwas versucht, ein solches struct im Gültigkeitsbereich einer Funktion "sowieso" zu instanzieren und mit Werten zu bestücken und dann anzunehmen in irgendeiner anderen Funktion mit einem anderen Gültigkeitsbereich auf dieselbe Instanz von deinem struct wieder zugreifen zu können
                            • es wurde dir gesagt/geschrieben, dass dies aufgrund von "Gültigkeitsbereichen" nicht so gehen kann
                            • es wurde dir die Frage gestellt, warum du denn dann auf deine Arrays von überall Zugriff hast

                            Wie gross muss den der Zaunspfahl sein mit dem man dir winkt?

                            Und ja richtig, wie du deine Daten verwaltest hat nicht direkt damit etwas zu tun, welche Fehler du beim "einlesen/auslesen" machst. shit-in, shit-out. Deswegen habe ich dich darauf (sogar wohl schon vorher) hingewiesen, dein Problem mit dem Datei-Lesen zu isolieren. Aber das hältst du wohl nicht für nötig. Bist ja schon zu gut und kannst gleich an der Funktion "herumpfuschen"?

                            Also: Gehe zurück zu Start, ziehe nicht DM 4000 ein.

                            Übrigens: Ich habe absolut keinen blassen Schimmer von C/C++.

                            Ciao, Frank

                            1. Hallo,

                              Habe ich irgendwas davon geschrieben, dass es falsch sein, ein Array global zu deklarieren?

                              nein, nur hast du zu meiner aussage("ich habe meine arrays global") geschrieben: "Da hast du die antwort" ... <für dein problem>
                              was sollte ich andres daraus schliessen?

                              Nochmal für dich zum mitmeisseln:

                              • du setzt x Arrays global, damit du mit mehreren Funktionen von unterschiedlichen Ecken drauf zugreifen kannst

                              richtig

                              • dir wurde empfohlen, ein struct zu verwenden (und auch dessen Instanzen in einem Array zu halten)

                              habe ich versucht, jedoch muss ich mich in diese thematik erst einlesen

                              • du hast irgendwas versucht, ein solches struct im Gültigkeitsbereich einer Funktion "sowieso" zu instanzieren und mit Werten zu bestücken und dann anzunehmen in irgendeiner anderen Funktion mit einem anderen Gültigkeitsbereich auf dieselbe Instanz von deinem struct wieder zugreifen zu können

                              richtig. Nur mir der Vorannahme das es sowieso nicht funktioniert. Soweit konnte ich noch denken.

                              • es wurde dir gesagt/geschrieben, dass dies aufgrund von "Gültigkeitsbereichen" nicht so gehen kann

                              dachte ich mir.

                              • es wurde dir die Frage gestellt, warum du denn dann auf deine Arrays von überall Zugriff hast

                              weil sie global sind

                              Wie gross muss den der Zaunspfahl sein mit dem man dir winkt?

                              also schliess ich jetz daraus, das ich die arrays "wegschmeiße" und alles in structs "auslagere". nur habe ich (noch) keinen plan wie ich außerhalb einer Funktion auf eben diese Werte zugreife.
                              Deswgen dachte ich, irgendjemand, der Ahnung von der ganzen Thematik hat(nicht du, weil siehe unten) kann mir bei meinem Problem _präzise_ helfen.
                              ALSO:
                              meine erneute frage:
                              wie kann ich diese Daten in ein struct speichern, und mit anderen funktionen darauf zugreifen?
                              meine überlegung:
                              alle arrays werden als zeiger irgendwo gespeichert(wie weis ich nicht), somit kann ich problemlos(?) darauf zugreifen.

                              richtig?

                              Und ja richtig, wie du deine Daten verwaltest hat nicht direkt damit etwas zu tun, welche Fehler du beim "einlesen/auslesen" machst. shit-in, shit-out. Deswegen habe ich dich darauf (sogar wohl schon vorher) hingewiesen, dein Problem mit dem Datei-Lesen zu isolieren. Aber das hältst du wohl nicht für nötig. Bist ja schon zu gut und kannst gleich an der Funktion "herumpfuschen"?

                              und die begründung habe ich auch schon gesagt ... ob ich mir ein kleines extra-übungs-programm für das Datei-Lesen schreibe, oder in der Funktion schreibe, die sowieso als zweites im Programm(nachdem fenster erstellen) aufgerufen wird kommt aufs selbe. Ich benutze den selben code und die Übersicht wird auch nicht übersichlicher als sie jetzt schon ist. Das würde mir keine Vor- und Nachteile bringen.
                              Aber trotzdem auf wunsch eines einzelnen herren(du) habe ich es gemacht und es bringt mir genauso wenig.

                              Übrigens: Ich habe absolut keinen blassen Schimmer von C/C++.

                              und warum schreibst du dann in diesem thread?

                              MfG. Christoph Ludwig

                              --
                              Wo die Sprache aufhört, fängt die Musik an...
                              Selfcode:  ie:( fl:| br:^ va:| ls:/ fo:| rl:? n4:) ss:) de:] js:) ch:{ sh:) mo:) zu:)
                              Go to this
                              1. Yerf!

                                meine erneute frage:
                                wie kann ich diese Daten in ein struct speichern, und mit anderen funktionen darauf zugreifen?

                                Vermutlich liegt das ganze an einem immer noch fehlenden Verständnis von Structs. Wenn dies einmal gelöst ist wird es dir wie selbstverständlich vorkommen, anstelle deiner globalen Einzelarrays ein globales Array von Structs zu verwenden...

                                Gruß,

                                Harlequin

                                --
                                <!--[if IE]>This page is best viewed with a webbrowser. Get one today!<![endif]-->
              2. Hallo,

                weil ich (noch) nicht weis wie man da auf die Datensätze zugreifen kann, da ich die structs mit verschiedenen Funktionen nutze...

                Objekte in Strukturen zu packen ist eine gute Idee, so ist es wesnetlich einfacher den Überblick zu behalten. Und du sparst dir irgendwelchen Speichergrößenberechnungen.

                Globale Variablen die kreuz und quer im Programm verändert werden sind hingegen nicht so gut. Bei kleineren Programmen mag das ja noch angehen, aber du verlierst sehr schnell den Überblick welche Funktion wo etwas geändert hat.

                Guck dir das nachfolgende Beispiel an, es sollte den Vorteil der Datenhaltung in einer Struktur deutlich zeigen. Und du hast keine globalen Variablen sondern übergibst nur einen Zeiger auf die Struktur.

                HTH

                Jochen (der C liebt und sich gerade mit so neumodischem C# Mist rumärgert)

                  
                typedef struct  
                {  
                  int  test;  
                  char name[20];  
                }Datensatz;  
                  
                int Machwas(Datensatz *zeiger);  
                  
                int main(int argc, char* argv[])  
                {  
                  Datensatz *ptr;  
                  Datensatz *p;  
                  
                  // Anzahl bestimmen  
                  int Anzahl=13;  
                  int i;  
                  
                  // Speicherplatz für Datensatz * Anzahl  
                  ptr = (Datensatz*)malloc(sizeof(Datensatz)*Anzahl);  
                  p=ptr;                    // Zeiger auf den Beginn für später merken  
                  
                  ptr->test=10;             // ptr zeigt auf ersten Datensatz  
                  ptr[1].test=20;           // ptr[1] das zweite Element  
                  ptr += 2;                 // Zeigerarithmetik  
                  ptr->test=30;             // zeigt jetzt auf den dritten Datensatz  
                  
                  Machwas(++ptr);  
                  
                  for(i=0; i<4; i++)        // Kontrollausgabe  
                    printf("%i  ",p[i].test);  
                  
                 free(p);  
                 return 0;  
                }  
                  
                int Machwas(Datensatz *zeiger)  
                {  
                  zeiger->test=40;  
                  return true;  
                }  
                
                
                --
                Kritzeln statt texten: Scribbleboard