c:stack Beispiel funktioniert nicht
c:stack Beispiel funktioniert nicht
Hallo,
ich arbeite mich gerade durch das C-Tutorial. Auch wenn es noch nicht ganz fertig ist war es doch schon ganz gut geschrieben.
Jetzt bin ich aber bei dem Stack-Beispiel hängen geblieben.
Und zwar kommen beim compilieren einige Fehlermeldungen.
Die ersten konnte ich noch beheben (Denke ich zumindest):
Zeile 16: Warnung: Implizite Deklaration der Funktion »malloc«|
habe ich behoben durch das einfügen von #include <stdlib.h>.
Zeile 40: Warnung: »return« ohne Wert in nicht-void zurückgebender Funktion
da hab ich einfach hinter das return eine 0 geschrieben damit der Rückgabewert vom Typ int ist.
Das letzte Problem wo ich allerdings noch nicht weiter weiß, bzw. gar nicht weiß was der Compiler da von mir will:
Zeile 55 (Code: stack = (unsigned int *)0;): Warnung: Zuweisung von inkompatiblem Zeigertyp|
Vielleicht könnte mir da jemand weiterhelfen (und das Tutorial korrigieren wenn es sich um wirkliche Fehler handelt)?
Danke schon mal!
gruß stampuhh
ich arbeite mich gerade durch das C-Tutorial. Auch wenn es noch nicht ganz fertig ist war es doch schon ganz gut geschrieben.
Jetzt bin ich aber bei dem Stack-Beispiel hängen geblieben.
Und zwar kommen beim compilieren einige Fehlermeldungen.
Die ersten konnte ich noch beheben (Denke ich zumindest):
Zeile 16: Warnung: Implizite Deklaration der Funktion »malloc«|
habe ich behoben durch das einfügen von #include <stdlib.h>.
Zeile 40: Warnung: »return« ohne Wert in nicht-void zurückgebender Funktion
da hab ich einfach hinter das return eine 0 geschrieben damit der Rückgabewert vom Typ int ist.
Das letzte Problem wo ich allerdings noch nicht weiter weiß, bzw. gar nicht weiß was der Compiler da von mir will:
Zeile 55 (Code: stack = (unsigned int *)0;): Warnung: Zuweisung von inkompatiblem Zeigertyp|
Vielleicht könnte mir da jemand weiterhelfen (und das Tutorial korrigieren wenn es sich um wirkliche Fehler handelt)?
Danke schon mal!
gruß stampuhh
NachDenkSeiten.de
Re: c:stack Beispiel funktioniert nicht
Ich hab dir mal schnell ein funktionierendes auf dem Code basierendes Beispiel zusammengebastelt:
Ich bin eher gegen die returns in Push und Pop. Bei Push weiß man nicht, ob der Wert nun wirklich geschrieben wurde und bei Pop kann man nicht sagen, ob da jetzt der Wert 0 auf dem Stack gelegt wurde oder ob man seinen Bereich überschritten hat. Eine meiner Meinung nach schönere Lösung wären die Funktionen isEmpty und isFull. Dann ist der Benutzer des Codes selbst verantwortlich für das richtige Schreiben und Lesen, hat aber auch eine einfache Mögleichkeit die Belegung im Stack zu prüfen.
Auf jeden Fall sollte das Beispiel überarbeitet (-> ausführbar gemacht, kommentiert) werden.
Code: Alles auswählen
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
unsigned int* esp;
unsigned int size;
unsigned int maxSize;
} Stack;
Stack * CreateStack( unsigned int maxSize );
void Push( Stack * stack, unsigned int value );
unsigned int Pop( Stack * stack );
void DestroyStack( Stack * stack );
int main ()
{
Stack *s;
int i;
s = CreateStack (5);
for (i = 0; i < 5; i++)
Push (s, i);
for (i = 0; i < 5; i++)
printf ("Element %d: %u\n", i + 1, Pop (s));
DestroyStack (s);
return 0;
}
Stack * CreateStack( unsigned int maxSize )
{
if( maxSize <= 0 )
return 0;
Stack * stack = (Stack*) malloc( sizeof( Stack ) );
stack->maxSize = maxSize;
stack->size = 0;
stack->esp = (unsigned int *) malloc( maxSize );
return stack;
}
void Push( Stack * stack, unsigned int value )
{
if( stack == 0 )
return;
if( stack->size >= stack->maxSize )
return;
stack->esp--;
*( stack->esp ) = value;
stack->size++;
}
unsigned int Pop( Stack * stack )
{
if(stack == 0)
return 0;
if( stack->size <= 0 )
return 0;
unsigned int result = *( stack->esp );
stack->esp++;
stack->size--;
return result;
}
void DestroyStack( Stack * stack )
{
free( stack->esp );
free( stack );
stack = NULL;
}
Auf jeden Fall sollte das Beispiel überarbeitet (-> ausführbar gemacht, kommentiert) werden.
Re: c:stack Beispiel funktioniert nicht
Willkommen im Forum!
Ich schätze mal das Inkludieren von stdlib.h wird für so etwas als selbstverständlich angesehen und steht deshalb nicht im Quellcode.
Das return; wurde gefixt.
Und zu dem anderen Fehler kann ich leider keine Auskunft geben, wobei ich davon ausgehe das wahrscheinlich nur Adressoperator oder Asterix fehlt.
MfG Fuss
Edit: War schon wieder einer schneller...
Ich schätze mal das Inkludieren von stdlib.h wird für so etwas als selbstverständlich angesehen und steht deshalb nicht im Quellcode.
Das return; wurde gefixt.
Und zu dem anderen Fehler kann ich leider keine Auskunft geben, wobei ich davon ausgehe das wahrscheinlich nur Adressoperator oder Asterix fehlt.
MfG Fuss
Edit: War schon wieder einer schneller...
Re: c:stack Beispiel funktioniert nicht
Danke euch beiden für die schnelle Antwort.
zu dem malloc und dem Includen. Ja das mag sein
Ich bin aber noch neu in C und habe die Standartbibliotheken nicht automatisch drin. Daher meine Anmerkung dazu.
@nufan:
Dein Beispiel arbeitet soweit ganz gut. Allerdings gibt es Probleme beim "DestroyStack (s);". Wenn ich das auskommentiere läuft alles gut. Wenn ich das allerdings drin habe dann bekomme ich nach den gewollten Ausgaben noch allerlei kryptisches Zeugs + Backtrace und Memorymap
Arbeite unter Ubuntu mit Code::Blocks falls das wichtig ist.
Hoffe du weißt auch dafür eine Lösung?
gruß stampuhh
zu dem malloc und dem Includen. Ja das mag sein
Ich bin aber noch neu in C und habe die Standartbibliotheken nicht automatisch drin. Daher meine Anmerkung dazu.
@nufan:
Dein Beispiel arbeitet soweit ganz gut. Allerdings gibt es Probleme beim "DestroyStack (s);". Wenn ich das auskommentiere läuft alles gut. Wenn ich das allerdings drin habe dann bekomme ich nach den gewollten Ausgaben noch allerlei kryptisches Zeugs
Code: Alles auswählen
*** glibc detected *** ./Ueben: free(): invalid pointer: 0x086f0018 ***
Arbeite unter Ubuntu mit Code::Blocks falls das wichtig ist.
Hoffe du weißt auch dafür eine Lösung?
gruß stampuhh
NachDenkSeiten.de
Re: c:stack Beispiel funktioniert nicht
Also ein Problem mit Zeigern... am DestroyStack selbst liegts mal sicher nicht. Schätze mal ein veränderter Pointer, der danach nicht mehr auf den Anfang des Speicherbereichs zeigt. Auf jeden Fall wird im CreateStack nicht genug Speicher reserviert, da die Anzahl der Bytes nicht maxSize sondern maxSize * sizeof (unsigned int) ist. Und um weitere Fehler zu verhindern verwende ich jetzt Indizes statt die Pointer selbst zu ändern:stampuhh hat geschrieben:Dein Beispiel arbeitet soweit ganz gut. Allerdings gibt es Probleme beim "DestroyStack (s);". Wenn ich das auskommentiere läuft alles gut. Wenn ich das allerdings drin habe dann bekomme ich nach den gewollten Ausgaben noch allerlei kryptisches Zeugs
Code: Alles auswählen
*** glibc detected *** ./Ueben: free(): invalid pointer: 0x086f0018 ***
Code: Alles auswählen
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
unsigned int* esp;
unsigned int size;
unsigned int maxSize;
} Stack;
Stack * CreateStack( unsigned int maxSize );
void Push( Stack * stack, unsigned int value );
unsigned int Pop( Stack * stack );
void DestroyStack( Stack * stack );
int isEmpty (Stack *stack);
int isFull (Stack *stack);
int main ()
{
Stack *s;
int i;
s = CreateStack (5);
for (i = 0; i < 10; i++)
if (!isFull (s))
Push (s, i);
for (i = 0; i < 10; i++)
if (!isEmpty (s))
printf ("Element %d: %u\n", i + 1, Pop (s));
DestroyStack (s);
return 0;
}
Stack * CreateStack( unsigned int maxSize )
{
if( maxSize <= 0 )
return 0;
Stack * stack = (Stack*) malloc( sizeof( Stack ) );
stack->maxSize = maxSize;
stack->size = 0;
stack->esp = (unsigned int *) malloc( maxSize * sizeof (unsigned int));
return stack;
}
void Push( Stack * stack, unsigned int value )
{
stack->esp[stack->size] = value;
stack->size++;
}
unsigned int Pop( Stack * stack )
{
stack->size--;
return stack->esp[stack->size];
}
void DestroyStack( Stack * stack )
{
free( stack->esp );
free( stack );
stack = NULL;
}
int isEmpty (Stack * s)
{
return (s->size == 0);
}
int isFull (Stack * s)
{
return (s->size == s->maxSize);
}
Re: c:stack Beispiel funktioniert nicht
Sehr gut. Das klappt ohne Probleme. Mir gefällt die Lösung mit den isEmpty und isFull-Funktionen auch viel besser!
Danke!
gruß stampuhh
Danke!
gruß stampuhh
NachDenkSeiten.de
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: c:stack Beispiel funktioniert nicht
Blöde Frage am Rande... der Code im Wiki ist aber jetzt so korrigiert, dass er anfängertauglich ist?
Ansonsten willkommen im Forum, Stampuhh und erstmal vielen Dank, hier den Fehler zu melden. So hilfst Du uns wunderbar das Tutorial zu verbessern. Wenn Dir zuvor andere Stolpersteine aufgefallen sind, nur raus damit.
Und aus Neugier interessiert mich: Wie hast Du das Tutorial gefunden?
Ansonsten willkommen im Forum, Stampuhh und erstmal vielen Dank, hier den Fehler zu melden. So hilfst Du uns wunderbar das Tutorial zu verbessern. Wenn Dir zuvor andere Stolpersteine aufgefallen sind, nur raus damit.
Und aus Neugier interessiert mich: Wie hast Du das Tutorial gefunden?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: c:stack Beispiel funktioniert nicht
Ich hab jetzt mal meine Version reinkopiert, die ist zumindest kompilier- und ausführbar.Xin hat geschrieben:Blöde Frage am Rande... der Code im Wiki ist aber jetzt so korrigiert, dass er anfängertauglich ist?
Re: c:stack Beispiel funktioniert nicht
Was den Code im Tutorial angeht komme ich damit klar
(Habe allerdings auch schon etwas Erfahrung, nur halt in Java und nicht in C)
Der ein oder andere "Stolperstein" war da sicher noch. Kann ich bei Gelegenheit auch gerne noch mal ein neues Thema aufmachen wo ich eine Liste rein stelle mit dem was mir so aufgefallen ist. Ist denke mal besser als für jeden Fehler ein Thema zu eröffnen.
Wie ich zu euch gekommen bin:
Grob gesagt über google. Genauer gesagt über das Forum und diesen Thread.
Ich habe mir das C++ von A bis Z (so heißt es glaube ich, habs nicht zur Hand gerade) gekauft. Auf der CD war noch das OpenBook C von A bis Z. Das Beispiel aus dem verlinkten Thread entstammt dem Buch und das lief bei mir nicht wie gewünscht.
gruß stampuhh
(Habe allerdings auch schon etwas Erfahrung, nur halt in Java und nicht in C)
Der ein oder andere "Stolperstein" war da sicher noch. Kann ich bei Gelegenheit auch gerne noch mal ein neues Thema aufmachen wo ich eine Liste rein stelle mit dem was mir so aufgefallen ist. Ist denke mal besser als für jeden Fehler ein Thema zu eröffnen.
Wie ich zu euch gekommen bin:
Grob gesagt über google. Genauer gesagt über das Forum und diesen Thread.
Ich habe mir das C++ von A bis Z (so heißt es glaube ich, habs nicht zur Hand gerade) gekauft. Auf der CD war noch das OpenBook C von A bis Z. Das Beispiel aus dem verlinkten Thread entstammt dem Buch und das lief bei mir nicht wie gewünscht.
gruß stampuhh
NachDenkSeiten.de
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: c:stack Beispiel funktioniert nicht
Ich hoffe dieses Jahr das C-Tutorial einmal komplett durchgehen zu können. Bisher wurde vorrangig Text wieder verwertet und zugefügt. Aber das ganze muss halt noch in einen Fluss gebracht werden.stampuhh hat geschrieben:Was den Code im Tutorial angeht komme ich damit klar
(Habe allerdings auch schon etwas Erfahrung, nur halt in Java und nicht in C)
Da wäre ich dankbar fürstampuhh hat geschrieben:Der ein oder andere "Stolperstein" war da sicher noch. Kann ich bei Gelegenheit auch gerne noch mal ein neues Thema aufmachen wo ich eine Liste rein stelle mit dem was mir so aufgefallen ist. Ist denke mal besser als für jeden Fehler ein Thema zu eröffnen.
Das wollte ich hörenstampuhh hat geschrieben:Wie ich zu euch gekommen bin:
Grob gesagt über google.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.