Problem mit dem befehl strct{};



  • Also ich habe folgendes Programm geschrieben:

    #include<stdio.h>
    #include<conio.h>
    
    #define ANZ 2
    
    struct Platte
    {
      long nr;
      int anzahl;
      char titel[30];
      float preis;
    };
    
    int einlesen( Platte &p);
    void ausgeben( Platte p);
    
    void main()
    {
    
      Platte p[ANZ];
      int i;
    
      for ( i = 0; i < ANZ; i++ )
        einlesen( p[i]);
      for ( i = 0; i < ANZ; i++ )
        ausgeben( p[i] );
      getch();
    
    }
    
    int einlesen( Platte &p)
    {
    
      printf( "\nBitte geben Sie die Artikelnummer der Platte ein:" );
      fflush( stdin );
      scanf( "%ld", p.nr );
      printf( "\nBitte geben Sie die Stück ein:" );
      fflush( stdin );
      scanf( "%d", p.anzahl );
      printf( "\nBitte geben Sie den Titel der Platte ein:" );
      fflush( stdin );
      scanf( "%s", p.titel );
      printf( "\nBitte geben Sie den Preis der Platte ein:" );
      fflush( stdin );
      scanf( "%f", p.preis );
      return 0;
    }
    
    void ausgeben( Platte p)
    {
    
      printf( "\nArtikelnummer: %2l", p.nr );
      printf( "\nAnzahl:        %2d", p.anzahl );
      printf( "\nTitel:         %s ", p.titel );
      printf( "\nPreis:         %2.2f", p.preis );
    
    }
    

    Das Programm selber funktioniert auch soweit, jedoch bekomm ich immer nach der Eingabe der Artikelnummer einen Speicherfehler, weiß vielleicht jemand woran das liegt????

    mfg



  • Hallo, also zunächst einmal wundert es mich, dass das Programm ohne Probleme
    kompiliert wird. Da du deine Struktur nur mit "struct Platte" deklarierst.
    Ich würde es mal versuchen, deine Struktur so zu deklarieren:

    typedef struct {
    long nr;
    int anzahl;
    char titel[30];
    float preis;
    }Platte;

    Wenn du dann noch das &-Zeichen im Prototypen und im Kopf der "einlesen" gegen ein * tauscht, müßte das Prog eigentlich laufen. Hoffe ich zumindest.



  • Das ist kein C, das ist C++. Bitte verschieben.



  • main sollte mal so aussehen

    int main(int argc, char *argv[])
    

    hat aber nix mit dem problem zu tun. es fehlt der adressoperator bei allen scanf's

    scanf( "%ld", &p.nr );
    


  • @basher 🤡 da is ja einer witzig 🤡

    typedef deshalb nicht weil es die c++ schreibeweise einer struktur ist, der rest ist jedoch c 😉 gell basher

    @johnny x

    ich habs jetzt mal so gemacht

    #include<stdio.h>
    #include<conio.h>
    
    #define ANZ 2
    
    struct Platte
    {
      long nr;
      int anzahl;
      char titel[30];
      float preis;
    };
    
    int einlesen( Platte *p);
    void ausgeben( Platte *p);
    
    void main()
    {
    
      Platte p[ANZ];
      int i;
    
      for ( i = 0; i < ANZ; i++ )
        einlesen( &p[i]);
      for ( i = 0; i < ANZ; i++ )
        ausgeben( &p[i] );
      getch();
    
    }
    
    int einlesen( Platte *p)
    {
    
      printf( "\nBitte geben Sie die Artikelnummer der Platte ein:" );
      fflush( stdin );
      scanf( "%l", p->nr );
      printf( "\nBitte geben Sie die Stück ein:" );
      fflush( stdin );
      scanf( "%d", p->anzahl );
      printf( "\nBitte geben Sie den Titel der Platte ein:" );
      fflush( stdin );
      scanf( "%s", p->titel );
      printf( "\nBitte geben Sie den Preis der Platte ein:" );
      fflush( stdin );
      scanf( "%f", p->preis );
      return 0;
    }
    
    void ausgeben( Platte *p)
    {
    
      printf( "\nArtikelnummer: %2l", p->nr );
      printf( "\nAnzahl:        %2d", p->anzahl );
      printf( "\nTitel:         %s ", p->titel );
      printf( "\nPreis:         %2.2f", p->preis );
    
    }
    

    leider funktioniert es immer noch nicht, ich bekomm immer noch nach der ersten eingabe einen speicher fehler 😞



  • miller_m schrieb:

    main sollte mal so aussehen

    int main(int argc, char *argv[])
    

    hat aber nix mit dem problem zu tun. es fehlt der adressoperator bei allen scanf's

    scanf( "%ld", &p.nr );
    

    wieder einmal, jedesmal passiert mir das

    danke

    jetzt funzt es 🙂

    #include<stdio.h>
    #include<conio.h>
    
    #define ANZ 2
    
    struct Platte
    {
      long nr;
      int anzahl;
      char titel[30];
      float preis;
    };
    
    int einlesen( Platte *p);
    void ausgeben( Platte *p);
    
    void main()
    {
    
      Platte p[ANZ];
      int i;
    
      for ( i = 0; i < ANZ; i++ )
        einlesen( &p[i]);
      for ( i = 0; i < ANZ; i++ )
        ausgeben( &p[i] );
      getch();
    
    }
    
    int einlesen( Platte *p)
    {
    
      printf( "\nBitte geben Sie die Artikelnummer der Platte ein:" );
      fflush( stdin );
      scanf( "%l", &p->nr );
      printf( "\nBitte geben Sie die Stück ein:" );
      fflush( stdin );
      scanf( "%d", &p->anzahl );
      printf( "\nBitte geben Sie den Titel der Platte ein:" );
      fflush( stdin );
      scanf( "%s", &p->titel );
      printf( "\nBitte geben Sie den Preis der Platte ein:" );
      fflush( stdin );
      scanf( "%f", &p->preis );
      return 0;
    }
    
    void ausgeben( Platte *p)
    {
    
      printf( "\nArtikelnummer: %2l", p->nr );
      printf( "\nAnzahl:        %2d", p->anzahl );
      printf( "\nTitel:         %s ", p->titel );
      printf( "\nPreis:         %2.2f", p->preis );
    
    }
    


  • Hirogen(CD) schrieb:

    jetzt funzt es 🙂

    scanf( "%s", &p->titel );
    

    Ganz sicher? 😉



  • miller_m schrieb:

    main sollte mal so aussehen

    int main(int argc, char *argv[])
    

    warum sollte main eigentlich so aussehen ??



  • MFK schrieb:

    Hirogen(CD) schrieb:

    jetzt funzt es 🙂

    scanf( "%s", &p->titel );
    

    Ganz sicher? 😉

    ja warum??

    ist ja nix falsches?? Ich kann zwar auch Zahlen einlesen, aber ich wollte nur mal die Eingabe hinbekommen.



  • Hirogen(CD) schrieb:

    miller_m schrieb:

    main sollte mal so aussehen

    int main(int argc, char *argv[])
    

    warum sollte main eigentlich so aussehen ??

    siehe http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=main#Answ

    int einlesen( Platte &p)
    {
      printf( "\nBitte geben Sie die Artikelnummer der Platte ein:" );
      fflush( stdin );
      scanf( "%l", &p.nr );
      printf( "\nBitte geben Sie die Stück ein:" );
      fflush( stdin );
      scanf( "%d", &p.anzahl );
      printf( "\nBitte geben Sie den Titel der Platte ein:" );
      fflush( stdin );
      scanf( "%s", &p.titel );
      printf( "\nBitte geben Sie den Preis der Platte ein:" );
      fflush( stdin );
      scanf( "%f", &p.preis );
      return 0;
    }
    
    void ausgeben( Platte &p)
    {
    
      printf( "\nArtikelnummer: %2l", p.nr );
      printf( "\nAnzahl:        %2d", p.anzahl );
      printf( "\nTitel:         %s ", p.titel );
      printf( "\nPreis:         %2.2f", p.preis );
    
    }
    

    so würde ich es machen 😉





  • CarstenJ schrieb:

    Hallo,

    Zu fflush(stdin):
    http://www.c-plusplus.net/forum/viewtopic.php?t=39349&highlight=fflush+undefiniert

    Aha, na das ist mir neu, ich habe in der schule gelernt, das fflush(stdin) bei einer eingabe, die adresswerte einer variable löscht, damit kein wires Zeug in dieser steht wenn man eine Variable einließt.

    Ich hab aber jetzt ein anderes problem 🙂

    das mit dem "&" war ein schlampigkeits fehler.

    Jedoch hab ich jetzt kurzerhand eine einfache Sicherheitsabfrage gemacht damit, bei Artikelnummer, Preis, und Anzahl keine Buchstaben eingelesen werden. Diese Sicherheitsabfrage funktioniert aber nur bei der Artikelnummer und ich weiß aber nicht warum ??? Beim Titel habe ich das deshalb nicht gemacht, weil es ja Titel gibt die Alphanumerische sind.

    hier der code

    void einlesen( Platte &p )
    {
      int rw;
      printf( "\nBitte geben Sie die Artikelnummer der Platte ein:" );
      fflush( stdin );
      rw = scanf( "%ld", & p.nr );
      /*rw kann nur 1 oder 0 sein, da der rückgabewert von scanf nur 1 oder 0 sein
      kann, wenn keine Zahl eingegeben wird ist es 0 bei einer Zahl ist es 1*/
      while ( rw != 1 )
      {
        printf( "Achtung Sie haben keinen Numerischen Wert eingegeben!\n" );
        printf( "Bitte geben Sie die Artikelnummer der Platte nochmals ein:\n" );
        fflush( stdin );
        rw = scanf( "%ld", & p.nr );
      } // ende while
    
      printf( "\nBitte geben Sie die Anzahl der Platten ein:" );
      fflush( stdin );
      scanf( "%d", & p.anzahl );
      while ( rw != 1 )
      {
        printf( "Achtung Sie haben keinen Numerischen Wert eingegeben!\n" );
        printf( "Bitte geben Sie die Anzahl der Platten nochmals ein:\n" );
        fflush( stdin );
        rw = scanf( "%d", & p.anzahl );
      } // ende while
    
      printf( "\nBitte geben Sie den Titel der Platte ein:" );
      fflush( stdin );
      scanf( "%s", & p.titel );
    
      printf( "\nBitte geben Sie den Preis der Platte ein:" );
      fflush( stdin );
      scanf( "%f", & p.preis );
      while ( rw != 1 )
      {
        printf( "Achtung Sie haben keinen Numerischen Wert eingegeben!\n" );
        printf( "Bitte geben Sie den Preis der Platte nochmals ein:\n" );
        fflush( stdin );
        rw = scanf( "%f", & p.preis );
      } // ende while
    }
    


  • Hirogen(CD) schrieb:

    @basher 🤡 da is ja einer witzig 🤡

    typedef deshalb nicht weil es die c++ schreibeweise einer struktur ist, der rest ist jedoch c 😉 gell basher

    Ein C++-Programm wird nicht automatisch C, nur weil man printf benutzt. Fakt ist, dass kein C-Compiler der Welt dir dieses Programm übersetzt. Weil C zum Beispiel keine Referenzen kennt. Hättest du im richtigen Forum gepostet, wär dir z.B. dieser unsinnige Ratschlag (sorry Johnny X, im lokalen Kontext hast du natürlich Recht, aber global gesehen bringt der ihm nichts), die Referenz durch einen Pointer zu ersetzen, erspart geblieben.

    BTW hast du meinen Namen falsch geschrieben.



  • ok der fehler hat sich erledigt, dumm wenn man das rw = vor dem scanf vergisst 😞



  • Fakt ist, dass kein C-Compiler der Welt
    dir dieses Programm übersetzt.

    falsch. Richtig wäre, kein "nur Standardcompiler".

    Der lccwin32 zb. kennt Referenzen als superduper only lccwin32 goodie unter den C Compilern. 🙂

    tschöö

    tt



  • Bashar schrieb:

    Hirogen(CD) schrieb:

    @basher 🤡 da is ja einer witzig 🤡

    typedef deshalb nicht weil es die c++ schreibeweise einer struktur ist, der rest ist jedoch c 😉 gell basher

    Ein C++-Programm wird nicht automatisch C, nur weil man printf benutzt. Fakt ist, dass kein C-Compiler der Welt dir dieses Programm übersetzt. Weil C zum Beispiel keine Referenzen kennt. Hättest du im richtigen Forum gepostet, wär dir z.B. dieser unsinnige Ratschlag (sorry Johnny X, im lokalen Kontext hast du natürlich Recht, aber global gesehen bringt der ihm nichts), die Referenz durch einen Pointer zu ersetzen, erspart geblieben.

    BTW hast du meinen Namen falsch geschrieben.

    sorry wegen dem Namen 😞

    Ich weiß schon das mir das kein C-Compiler übersetzen wird, weil die Struktur in C++ schreibweise geschrieben ist, und dieser dadurch gleich mal einen Aufschrei macht, jedoch hab ich daran nicht gedacht, als ich hier den Post gemacht habe, der rest bleibt aber trotzdem C schreibweise ;), auch wenn es in eigentlich Form (und da hast du Recht) ein C++ Programm ist.



  • weil die Struktur in C++ schreibweise geschrieben

    nein er meinte das glaube ich wegen dem & in der Funktionsparameterliste...

    Und das das C++ Schreibweise wäre ist nich richtig :).

    bye

    tt



  • TheTester schrieb:

    weil die Struktur in C++ schreibweise geschrieben

    nein er meinte das glaube ich wegen dem & in der Funktionsparameterliste...

    Und das das C++ Schreibweise wäre ist nich richtig :).

    bye

    tt

    warum nicht?

    das würde ich gern, wissen, weil uns unsere prof das so erklärt hat und wenn die nen stuß daherredet würde ich das gerne, wissen, also warum ist das nicht die c++ schreibweise???? 😕



  • Weil es typedef auch in C gibt??



  • AJ schrieb:

    Weil es typedef auch in C gibt??

    in c++ kann man das typdef jedoch weglassen, der compiler erkennt es automatisch



  • Soviel ich weiß, ist das in C nicht anders. Allerdings sollte man zur Sicherheit trotzdem das struct vor dem Strukturnamen angeben. Und wenn man es gleich richtig macht, dann macht man das sowieso mit typedef.


Anmelden zum Antworten