Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Liste

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
14.04.2004, 00:29 Uhr
lookIN



Hi,
ich habe gerade versucht meine erste Liste zu schreiben(ich hab bis jetzt einen ziemlich großen Bogen drum gemacht).
Ich bekomm folgenden Speicherfehler:

Code:
Die Anweisung in "0x00401354" verweist auf Speicher in "0x02a1e000". Der Vorgang read konnte nicht auf dem Speicher durchgeführt werden.



Hier der Code:

C++:
struct liste
{
int zahl;
bool tf;
liste *next;
};
liste *pfirst=0;

liste *mache_eintrag(int zahl, bool tf)
{
liste *e;
e = (liste*)malloc(sizeof(liste));
e->zahl=zahl;
e->tf=tf;
return e;
}

void neuer_eintrag(liste *e)
{
e->next=pfirst;
pfirst = e;
}

int main(int argc, char *argv[])
{
  int n;
  liste *e;
  liste *i;

   for(n=2;n<1000000;n++)
  {
   e = mache_eintrag(n,true);
   neuer_eintrag(e);
  }

  for(e=pfirst;e;e=e->next)
  {
    if(e->tf==true)
    {
      for(i=pfirst;i;i=i->next)
      {
      i->tf=false;
      }
    }
  }

  for(e=pfirst;e;e=e->next)
  {
    if(e->tf==true)
    cout<<e->zahl<<" ";
    free(e);
  }
  getchar();
  return 0;
}


Es sind auch noch ein paar Logikfehler drinn, aber um die braucht ihr euch nicht zu kümmern...
--
--
lookIN
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
14.04.2004, 07:39 Uhr
Pablo
Supertux
(Operator)


wo ungefähr kommt der Fehler? Ich kann's nicht genau bestimmen. Deine neuer_eintrag(liste *e) Funktion verstehe ich gar nicht.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
14.04.2004, 09:16 Uhr
ao

(Operator)



Zitat:
lookIN postete

C++:
  for(e=pfirst;e;e=e->next)
  {
    if(e->tf==true)
    cout<<e->zahl<<" ";
    free(e);
  }
}




Du gibst im Schleifenkörper das aktuelle e frei und verwendest es danach noch im Schleifenkopf (für die Bedingung und das Inkrement), obwohl es schon freigegeben und damit ungültig ist.

Du darfst ein Listenelement nicht zerstören, während es noch in der Liste hängt, sondern musst es erst herauslösen.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
15.04.2004, 11:18 Uhr
lookIN



Wo muss ich es dann zerstören, bzw wie?
Und was heißt herauslösen?
--
--
lookIN
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
15.04.2004, 12:41 Uhr
ao

(Operator)


Die Funktion neuer_eintrag fügt ein Element in die Liste ein. Das rückgängig zu machen meine ich mit herauslösen.

Und zerstören (also free (e) aufrufen) musst du es, *nachdem* du es aus der Liste herausgeholt hast.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: