Zeiger auf Structur für Speicherreservierung (malloc)



  • Hallo
    Ich habe eine Struktur angelegt:

    struct kartei{
    char name [20];
    char status[1];
    int semester;
    datum d;
    kartei *next;
    };

    Nun möchte ich Speicher reservieren , ungefähr so:

    int *erster;
    erster=malloc(sizeof(kartei));

    Nur leider bekomm ich da ne fehlermeldung. was mache ich falsch??

    Anschleißend würde ich dem Speicher auch gerne was zuweisen, doch das klappt auch nicht:

    scanf("%s",(&erster.name));

    Kann mir vll jemand weiter helfen? das wäre super.

    Gruß

    Jaepen



  • als erstes

    schreib mal
    typedef struct kartei kartei_karte;

    kartei_karte *erste = malloc(sizeof(kartei_karte));

    Du kannst nämmlich nicht speicher so allokieren wie du das gemacht hast

    int * ist ein int zeiger hinter seiner Adresse sollte ein int sein
    kartei_karte * ist ein zeiger hinter seiner Adresse sollte kartei_karte sein



  • kartei_karte *erste = malloc(sizeof(kartei_karte));

    wenn ich das schreibe bring er mir folgende nachricht:

    C2676: Binaerer Operator '*' : 'struct kartei' definiert diesen Operator oder eine Konvertierung in einen fuer den vordefinier

    wie muss ich denn erster deklarieren?



  • jaepen schrieb:

    int *erster;
    erster=malloc(sizeof(kartei));

    struct kartei *erster;
    erster = malloc (sizeof(struct kartei));
    

    🙂



  • htte ich auch schon versucht, aber dann kommt folgender fehler:

    error C2440: '=' : 'void *' kann nicht in 'struct kartei *' konvertiert werden



  • jaepen schrieb:

    error C2440: '=' : 'void *' kann nicht in 'struct kartei *' konvertiert werden

    Da hast du wohl einen C++-Compiler am Start.



  • Ja, richtig.

    MS Visio C++.
    geht das damit nicht? bis jetzt konnte der sonst auch alles.
    Wie kann ich das Problem umgehen?

    gruß



  • sry, ich meinte MS Visual C++



  • struct kartei *erster = (struct kartei *) malloc (sizeof(struct kartei));
    

    oder gleich C++, also new verwenden.



  • feigling schrieb:

    oder gleich C++, also new verwenden.

    besser nicht, damit handelt man sich nur noch mehr stress ein.
    einfach die source code datei in .c umbenennen...
    🙂



  • Endlich......
    es funktioniert.

    Vielen vielen Dank



  • Hi
    Hab noch immer ein paar probleme. und zwar findet er jetzt das ende meiner liste nicht, also dieses NULL.
    woran liegt das?????

    temp=erster;
    while (temp->next!=NULL)
    {

    printf ("kontrolle");
    fprintf(fp1,"%s \t %d \t %s \t %d.%d.%d\n ",(*temp).name,(*temp).semester,(*temp).status,(*temp).d.tag,(*temp).d.monat,(*temp).d.jahr);
    temp=temp->next;
    }



  • kann keiner einen fehler entdecken? der will nicht mehr aus der schleife raus gehen???



  • steppe durch den code. deine schleifenbedingung ist im a.



  • c.rackwitz schrieb:

    steppe durch den code. deine schleifenbedingung ist im a.

    wie meinst du das?



  • do
    { 
        temp=temp->next;
    
    } while (temp != NULL);
    

    muss klappen, is ja egal wie rum man macht. übrignes crackwitz meint deine schleifenbedingung ist im a-r-s-c-h falls dir das a kopfzerbrechen bereitet hat 😉

    PS: der überischtlichkeit halber verwende doch generell "temp->element" und bitte [cpp] tags.



  • Ja, mit dem a. war mir schon klar, wusste (weiß) nur nicht warum.

    mit dem do while funktioniert leider auch nicht.

    temp ist ein zeiger auf ein element einer liste. warum findet der nicht wenn es das letzte element ist?? oder muss ich das letzte element schon vorher irgendwie bestimmen?



  • Jaepen schrieb:

    wie meinst du das?

    wie meinst du das?



  • c.rackwitz schrieb:

    Jaepen schrieb:

    wie meinst du das?

    wie meinst du das?

    Rekursion ist hier nicht das Thema 😉



  • kann ja wohl nicht angehen, dass hier einer "woran liegt das?????" schreit, sonst kein wort sagt was nicht verstanden wird, und dann auch noch hilfe bekommt!

    und klar gehts hier um rekursion! was ist denn wohl ne verkettete liste?
    im uebrigen ist ein do-while hier an sich falsch. warum?

    temp = erster;
    do... // crasht, wenn erster schon NULL ist, also ne leere liste vor einem liegt
    

    die while() bedingung ist einfach falsch. das ->next muss weg.
    warum macht nicht einfach mal einer nen eintrag in die FAQ "wie debugge ich richtig" und klatscht jedem das um die ohren, der denkt, sich die muehe nicht machen zu muessen?

    *mit-dem-krueckstock-fuchtel*



  • [quote="c.rackwitz"]kann ja wohl nicht angehen, dass hier einer "woran liegt das?????" schreit, sonst kein wort sagt was nicht verstanden wird, und dann auch noch hilfe bekommt!

    Hi
    Tut mir leid, aber ich dachte das wäre nur ein kleiner syntax fehler, den ein erfahrener Prigrammiere direkt sehen würde. Ich bin nämlich leider ein absoluter anfänger.

    Mitlerweile habe ich das Problem über Umwege gelöst. (ich zähle von anfang an immer meine Listen element mit, das ich immer weiß wie viele ich habe)

    Mein Problem ist also folgendes:

    Ich lege eine einfach verkettete liste an, mit einer variablen anzahl von Elementen, die ich aus einer Datei auslese.

    fp1=fopen ("stud.txt", "r");

    if (fp1 == NULL ) { printf ("\nDie Datei konnte nicht zum lesen geöffnet werden!\n");}
    else
    {

    akt=(struct kartei 😉 malloc (sizeof(struct kartei));
    erster=akt;

    while (!feof(fp1))
    {
    j++;
    fscanf(fp1,"%s \t %d \t %s \t %d.%d.%d\n", (*akt).name, &(*akt).semester, &(*akt).status, &(*akt).d.tag, &(*akt).d.monat, &(*akt).d.jahr);
    printf("Student: %s \t %d \t %s \t %d.%d.%d\n", (*akt).name, (*akt).semester, (*akt).status, (*akt).d.tag, (*akt).d.monat, (*akt).d.jahr);

    akt->next=(struct kartei 😉 malloc (sizeof(struct kartei));
    akt=akt->next;

    };

    Dann füge ich elemente zu oder lösche welche.
    Schließlich will ich alle Elemente auch wieder zurück schreiben.

    uebernehmen(int j)
    {
    fp1=fopen ("stud.txt", "w");
    if (fp1 == NULL ) { printf ("\nDie Datei konnte nicht zum schreiben geöffnet werden!\n");}
    else {

    temp=erster;

    while (j)
    {
    printf("z ");
    fprintf(fp1,"%s \t %d \t %s \t %d.%d.%d\n ",(*temp).name,(*temp).semester,(*temp).status,(*temp).d.tag,(*temp).d.monat,(*temp).d.jahr);
    temp=temp->next;
    j--;
    }
    }
    fclose (fp1);
    return(0);

    Mein Problem ist dabei das ich nicht weiß wie ich die Abfrage mache wann beim übernehmen das letzte Element erreicht ist. (Im übrigen habe ich keine Ahnung was das Wort debug auch nur ansatzweise bedeuten soll).

    mfg Jaepen


Anmelden zum Antworten