Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Apophis Mini JLI'ler

Anmeldedatum: 28.08.2004 Beiträge: 28 Wohnort: Harz Medaillen: Keine
|
Verfasst am: 08.09.2004, 19:28 Titel: Listen für DOS Programm |
|
|
Ich habe jetzt alles Probiert.
Alle Beispiele aus dem Buch und eigene.
Aber ALLE Listen ob nun mit class oder struct schreiben in den stack und nicht, so wie im buch geschrieben, in den heap.
Hat jemand von euch ein Listen Programm/Beispiel das im Heap arbeitet?
Ich brache das dringend. _________________ Guckst du hier! |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 08.09.2004, 19:49 Titel: |
|
|
Code: | {
CTest testklasse1; //Stack
CTest *testklasse2=new CTest(); //Heap
} |
_________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
 |
Apophis Mini JLI'ler

Anmeldedatum: 28.08.2004 Beiträge: 28 Wohnort: Harz Medaillen: Keine
|
Verfasst am: 08.09.2004, 20:15 Titel: |
|
|
Ich währe ja schon dankbar, wenn Ihr mir sagen könntet, was am volgendem code falsch ist.
Code: | #include <stdio.h>
#include <conio.h>
struct Knoten {
unsigned char Zeichen;
Knoten* Vorgaenger;
Knoten* Nachfolger;
};
Knoten* AktuellerKnoten = NULL;
Knoten* Listenkopf = NULL;
Knoten* Listenende = NULL;
void NeuesElement(Knoten* NeuerKnoten, char Zeichen) {
if(Listenkopf == 0) {
Listenkopf = NeuerKnoten;
NeuerKnoten->Vorgaenger = NULL;
} else {
Listenende->Nachfolger = NeuerKnoten;
NeuerKnoten->Vorgaenger = Listenende;
}
AktuellerKnoten = NeuerKnoten;
NeuerKnoten->Zeichen = Zeichen;
NeuerKnoten->Nachfolger = NULL;
Listenende = NeuerKnoten;
}
void ListeAusgeben(void) {
Knoten* p;
p = Listenkopf;
while(p) {
printf("%2c 0x%08x\n", p->Zeichen, p);
p = p->Nachfolger;
}
}
void ListeLoeschen(void) {
while(AktuellerKnoten) {
Listenende = Listenende->Vorgaenger;
AktuellerKnoten = Listenende;
delete Listenende->Nachfolger;
Listenende->Nachfolger = NULL;
}
}
void main(void) {
for(int j = 0; j < 10000; j ++) {
for(int i = 32; i < 255; i++) {
Knoten *k = new Knoten;
NeuesElement(k, i);
}
}
printf("Liste:\n\n");
ListeAusgeben();
printf("\n\nTaste Drcken!");
ListeLoeschen();
getch();
} |
_________________ Guckst du hier! |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 08.09.2004, 20:29 Titel: |
|
|
Was genau funktioniert denn nicht ? Dein Code schaut soweit ok aus auch wenn das löschen sehr seltsam ist. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
 |
Apophis Mini JLI'ler

Anmeldedatum: 28.08.2004 Beiträge: 28 Wohnort: Harz Medaillen: Keine
|
Verfasst am: 08.09.2004, 20:40 Titel: |
|
|
Zitat: | Was genau funktioniert denn nicht ? Dein Code schaut soweit ok aus |
Das Programm arbeitet im Stack und nicht im heap!
Zitat: | auch wenn das löschen sehr seltsam ist. |
Ich weiß, hab aber keine bessere lösung.
Hast du was besseres? _________________ Guckst du hier! |
|
Nach oben |
|
 |
fowly JLI'ler

Anmeldedatum: 25.01.2004 Beiträge: 196 Wohnort: Detmold - NRW Medaillen: Keine
|
Verfasst am: 08.09.2004, 20:44 Titel: |
|
|
wieso sollte das denn nicht im heap sein? alle elemente die du mit new anlegst kommen in den heap, dafür ist er schließlich da... oder hab ich jetzt was verpasst? _________________ <-- Noch in der Entwicklungsphase: http://www.uranus-entertainment.de -->
Das Spiel zu unserer Schule:
http://www.grabbe-game.de |
|
Nach oben |
|
 |
Apophis Mini JLI'ler

Anmeldedatum: 28.08.2004 Beiträge: 28 Wohnort: Harz Medaillen: Keine
|
Verfasst am: 08.09.2004, 20:52 Titel: |
|
|
Zitat: | wieso sollte das denn nicht im heap sein? alle elemente die du mit new anlegst kommen in den heap, dafür ist er schließlich da... oder hab ich jetzt was verpasst? |
Das ist es ja, es kommt alles in den stack. _________________ Guckst du hier! |
|
Nach oben |
|
 |
fowly JLI'ler

Anmeldedatum: 25.01.2004 Beiträge: 196 Wohnort: Detmold - NRW Medaillen: Keine
|
Verfasst am: 08.09.2004, 21:10 Titel: |
|
|
und woran genau erkennst du das? ich hab nie gemerkt ob etwas im stack oder im heap ist, alles was mit new erzeugt wird ist im heap... und der rest nicht, das geht doch gar nicht anders... oder? _________________ <-- Noch in der Entwicklungsphase: http://www.uranus-entertainment.de -->
Das Spiel zu unserer Schule:
http://www.grabbe-game.de |
|
Nach oben |
|
 |
Zyrian Super JLI'ler

Anmeldedatum: 30.08.2003 Beiträge: 321 Wohnort: Essen Medaillen: Keine
|
|
Nach oben |
|
 |
Apophis Mini JLI'ler

Anmeldedatum: 28.08.2004 Beiträge: 28 Wohnort: Harz Medaillen: Keine
|
Verfasst am: 08.09.2004, 21:17 Titel: |
|
|
Zitat: | #include <stdio.h>
#include <conio.h>
struct Knoten {
unsigned char Zeichen;
Knoten* Vorgaenger;
Knoten* Nachfolger;
};
Knoten* AktuellerKnoten = NULL;
Knoten* Listenkopf = NULL;
Knoten* Listenende = NULL;
void NeuesElement(Knoten* NeuerKnoten, char Zeichen) {
if(Listenkopf == 0) {
Listenkopf = NeuerKnoten;
NeuerKnoten->Vorgaenger = NULL;
} else {
Listenende->Nachfolger = NeuerKnoten;
NeuerKnoten->Vorgaenger = Listenende;
}
AktuellerKnoten = NeuerKnoten;
NeuerKnoten->Zeichen = Zeichen;
NeuerKnoten->Nachfolger = NULL;
Listenende = NeuerKnoten;
}
void ListeAusgeben(void) {
unsigned long in = 0;
Knoten* p;
p = Listenkopf;
while(p) {
in++;
printf("%2c => 0x%08x => %8d\n", p->Zeichen, p, in);
p = p->Nachfolger;
}
}
void ListeLoeschen(void) {
while(AktuellerKnoten) {
Listenende = Listenende->Vorgaenger;
AktuellerKnoten = Listenende;
delete Listenende->Nachfolger;
Listenende->Nachfolger = NULL;
}
}
void main(void) {
for(int j = 0; j < 10000; j ++) { //<---------------------
//for(int i = 32; i < 255; i++) {
Knoten *k = new Knoten;
NeuesElement(k, 49);
//}
}
printf("Liste:\n\n");
ListeAusgeben();
printf("\n\nTaste Drcken!");
ListeLoeschen();
getch();
} |
Normalerweise sollte er 10000 "Knoten" erzeugen.
Wie man aber auf dem Bild erkennen kann, tut er das nicht.
Und Komischerweise sind die adressen im stack bereich.
[EDIT] Ich benutze für dieses Programm nicht VC++ !!! Sondern "Turbo C++" weil wir das in der Schule auch benutzen. Und das Prog ist für die Schule. _________________ Guckst du hier! |
|
Nach oben |
|
 |
Zyrian Super JLI'ler

Anmeldedatum: 30.08.2003 Beiträge: 321 Wohnort: Essen Medaillen: Keine
|
Verfasst am: 08.09.2004, 22:17 Titel: |
|
|
tja, VC++ erzeugt bei mir 10000 knoten, worauf dann ne fehlermeldung kommt^^
Code: |
1 => 0x008ff960 => 9979
1 => 0x008ff920 => 9980
1 => 0x008ff8e0 => 9981
1 => 0x008ff8a0 => 9982
1 => 0x008ff860 => 9983
1 => 0x008ff820 => 9984
1 => 0x008ff7e0 => 9985
1 => 0x008ff7a0 => 9986
1 => 0x008ff760 => 9987
1 => 0x008ff720 => 9988
1 => 0x008ff6e0 => 9989
1 => 0x008ff6a0 => 9990
1 => 0x008ff660 => 9991
1 => 0x008ff620 => 9992
1 => 0x008ff5e0 => 9993
1 => 0x008ff5a0 => 9994
1 => 0x008ff560 => 9995
1 => 0x008ff520 => 9996
1 => 0x008ff4e0 => 9997
1 => 0x008ff4a0 => 9998
1 => 0x008ff460 => 9999
1 => 0x008ff420 => 10000
|
_________________ Schau mir in die Augen, Kleines. |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 08.09.2004, 22:23 Titel: |
|
|
Du solltest mal prüfen was new Knoten zurück gibt. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
 |
Apophis Mini JLI'ler

Anmeldedatum: 28.08.2004 Beiträge: 28 Wohnort: Harz Medaillen: Keine
|
Verfasst am: 08.09.2004, 22:25 Titel: |
|
|
@Zyrian
Ja, Habe jetzt aber noch was verändert.
Code: | void ListeLoeschen(void) {
while(Listenende->Vorgaenger) {
Listenende = Listenende->Vorgaenger;
AktuellerKnoten = Listenende;
delete Listenende->Nachfolger;
Listenende->Nachfolger = NULL;
}
delete Listenkopf;
AktuellerKnoten = NULL;
Listenkopf = NULL;
Listenende = NULL;
} |
Damit kommt die Fehlermeldung nicht mher.
Und das es mit VC++ (WIN) geht weiß ich.
Es soll aber mit Turbo C++ (DOS) auch laufen.
@FallenAngel84
Bis zum Knoten 6349 wird die Adresse zurückgegeben.
Dann nur Nullen. Also Fehler. _________________ Guckst du hier! |
|
Nach oben |
|
 |
Zyrian Super JLI'ler

Anmeldedatum: 30.08.2003 Beiträge: 321 Wohnort: Essen Medaillen: Keine
|
|
Nach oben |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 08.09.2004, 22:35 Titel: |
|
|
Ja, dein Turbo C++ arbeitet mit 64k großen Segmenten (das dürfen viele gar nicht mehr erlebt haben ). Das kommt mit den Adressen auch gut hin 63XX * 10 sind ja ungefähr 64k, dann noch der Code usw. Ich denke das könnte passen. Was für ein Speichermodell nutzt du denn? (Tiny, Small, Big, usw.)
C. |
|
Nach oben |
|
 |
|