[C/C++] Zeiger auf Struktur/Funktionen

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von blackworker, 24. November 2011 .

Schlagworte:
  1. 24. November 2011
    Zeiger auf Struktur/Funktionen

    Servus, ich sitz grad seit 2 Stunden an einem Problem und komm nicht weiter.

    Ich möchte innerhalb einer Funktion verschiedener Variablen einer Struktur Werte zuweisen.

    Die Struktur ist folgendermaßen definiert:
    Code:
    typedef struct
    {
     int Nummer; //Fester Wert, Bezugsgröße zur anderen Struktur
     char Interpret[MAX]; //Name des Interpreten, MAX = 40 Nutzzeichen
     char AlbumTitel[MAX]; //Albumtitel, MAX = 40 Nutzzeichen
     int AnzahlLieder; //Wieviele Lieder enthält das Album?
    }Künstler;
    Die Funktion, welche auf die Struktur zugreift und die Variablen füllen soll:
    Code:
    void f_DatenEingabe(Künstler *Stelle)
    {
     int AnzahlLieder;
     fflush(stdin);
     printf("\nBitte den Interpret eingeben: ");
     scanf("%s", Stelle->Interpret);
     fflush(stdin);
     printf("\nBitte den Albumtitel eingeben: ");
     scanf("%s", Stelle->AlbumTitel);
     fflush(stdin);
     printf("\nBitte die Anzahl der Lieder eingeben: ");
     scanf("%d", Stelle->AnzahlLieder);
     return;
    }
    meine void main()
    Code:
    void main()
    {
     Künstler Sammlung[10];
    
     printf("Und jetzt erste Eingabe");
     f_DatenEingabe(&Sammlung[0]);
    
     system("pause");
    }
    Ich habe mir das so vorgestellt das ich die Adresse von der 1. Struktur meiner Funktion übergebe und diese dann die eingegebenen Daten abspeichert.
    Das funktioniert auch für den Interpreten und den Albumtitel, aber leider nicht für die Anzahl der Lieder.

    Es kommt bei Ausführen eine Speicherzugriffsverletzung, und wenn ich mir den Inhalt von "AnzahlLieder" (von Sammlung[0]) anschaue, dann steht meine eingegbene Zahl erst an 3. Stelle.
    Keine Ahnung wie das möglich ist, aber irgendwie schreibt der in die falsche Speicherzelle...

    Seht ihr den Fehler, könnt ihr mir weiterhelfen?
    Viele Grüße
     
  2. 24. November 2011
    AW: Zeiger auf Struktur/Funktionen

    Du brauchst einen int Pointer bei scanf.


    üäöß im Quellcode?
     
  3. 24. November 2011
    AW: Zeiger auf Struktur/Funktionen

    Ja, das mit dem Umlauten ist uncool merk ich grad :angry:

    Einen Int-Pointer bei scanf...? Wie meinst du das?
    Soll ich in meiner Funktion einen Zeiger deklarieren der auf meine int-Variable zeigt und diesen bei scanf nutzen?

    Übergebe ich nicht meiner Funktion die Adresse von meiner Struktur?
     
  4. 24. November 2011
    AW: Zeiger auf Struktur/Funktionen

    Code:
    scanf("%d", &(Stelle->AnzahlLieder));
    Zum Lernen wäre das sicherlich nicht schlecht, wenn du sowieso weißt das man bei scanf immer Pointer braucht.

    ja schon, aber in deiner struct ist ja ein "int" Wert und kein "int *", deswegen musst du dir den Pointer extra besorgen.

    alternative:

    Code:
    scanf("%d", (int *)((DWORD)Stelle + sizeof(int)+sizeof(Interpret)+sizeof(AlbumTitel)));
     
  5. 24. November 2011
    AW: Zeiger auf Struktur/Funktionen

    Ich glaub ich weiß jetzt was du meinst, ich seh grad das eine Zeile Code, von meinen vorherigen Versuchen, welche ich übersehen hab zu löschen.
    Code:
    void f_DatenEingabe(Künstler *Stelle) 
    { 
     int AnzahlLieder;
     fflush(stdin);
     printf("\nBitte den Interpret eingeben: ");
     scanf("%s", Stelle->Interpret);
     fflush(stdin);
     printf("\nBitte den Albumtitel eingeben: ");
     scanf("%s", Stelle->AlbumTitel);
     fflush(stdin);
     printf("\nBitte die Anzahl der Lieder eingeben: ");
     scanf("%d", Stelle->AnzahlLieder);
     return; 
    }
    
    Beziehst du dich auf die 3. Zeile? "int AnzahlLieder;"

    Falls ja, das war ein Fehler von mir das hier zu pasten, kommentiers dir in Gedanken aus

    Ich hab mittlerweile diesen Link hier gefunden, bei dem jemand exakt dasselbe Problem hat/hatte:
    Re: scanf in Verbindung mit Pointer auf struct

    Die Lösung von denen wäre ein "&" vor dem Zeiger. Also:
    Code:
    scanf("%d", &Stelle->AnzahlLieder);
    Damit funktionierts auch. Begründet wirds dadurch:
    Du beschreibst oben, dassdas scanf einen Pointer vom Typ int verlangt, widerspricht sich aber das nicht mit der gequoteten Aussage?

    Der Adressoperator "&" macht doch aus meiner übergebenen Adresse keinen Pointer vom Typ int - oder doch?

    Ich möcht das Ganze grundlegend begreifen, damit sowas nicht nochmal vorkommt, deswegen frag ich nochmal nach. Danke schonmal :]
     
  6. 24. November 2011
    AW: Zeiger auf Struktur/Funktionen

    Nein..
    Durch das & machst du daraus einen Zeiger..
    Du übergibst somit halt nicht den Wert an sich bzw. die Variable an sich, sondern den Speicherbereich der dafür reserviert ist...

    Dein Objekt vom Typ Künstler ist zwar ein Pointer.. Aber die darin enthaltenen Variablen sind keine Pointer...

    Hoffe das ist richtig

    Mal noch eine Zwischenfrage an N0S oder andere programmiertechnisch-begabte..
    Warum muss das nur beim Integer und nicht beim Char sein?

    MfG
     
  7. 24. November 2011
    AW: Zeiger auf Struktur/Funktionen

    Weil in der struct schon ein char * gespeichert ist.

    char name[] ist das gleiche wie char * name.

    Nein, die Zeile hab ich gar nicht bemerkt.

    das ist ein int pointer: &(Stelle->AnzahlLieder)
    das ist ein int: Stelle->AnzahlLieder und das ist das gleiche wie Sammlung[0].AnzahlLieder

    probiers so:

    Künstler test;
    Künstler * pTest = &test;

    if (test.AnzahlLieder == pTest->AnzahlLieder)
    {printf("success");}
     
  8. 24. November 2011
    AW: Zeiger auf Struktur/Funktionen

    Bei einer char-Variable hab ich das Problem auch.

    Ich denke das liegt daran, dass wenn du "normal" etwas mit scanf einliest und abspeicherst du immer ein "&" brauchst (beim Speicherort) außer bei Arrays. (da wird sehr warscheinlich schon mit Zeigern gearbeitet, damit der 2. Char auch ins 2. Feld kommt, usw...)

    Mal abwarten was die Profis sagen :]

    Edit:

    Damit hab ichs gecheckt! Scanf verlangt nämlich immer eine Adresse (soweit ich weiß), deshalb gabs Probleme wenn ich mit Stelle->AnzahlLieder auf eine int-Variable zugreifen wollte! Damit liefer ich sozusagen den Inhalt und nicht die Adresse zu scanf. Deshalb gehts auch bei Stelle->Interpret , weil Interpret ein char-array ist.

    Ist meine Schlussfolgerung so richtig?

    Code:
    Künstler test;
    Künstler * pTest = &test;
    
    if (test.AnzahlLieder == pTest->AnzahlLieder)
    {printf("success");}
    
    success!
    Das ist klar, aber hierbei wird ja der Inhalt von AnzahlLieder zugegriffen und verglichen, scanf braucht aber die Adresse

    Danke NOS, wenn das jetzt stimmt was ich geschrieben hab... dann hab ichs kapiert
     
  9. 24. November 2011
    AW: Zeiger auf Struktur/Funktionen


    Genau das meinte ich, nochmal kurz und bündig zusammengefasst von dir

    Dankeschön an alle, Bewertungen sind raus!
     
  10. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.