Listen in C/C++
-
Ich Grüße euch!
Es geht um folgenden Sourcecode:
#include <stdio.h> #include <stdlib.h> typedef enum { FALSE = 0, TRUE = 1 } boolean; struct ListElement { int value; struct ListElement *last; struct ListElement *next; }; typedef struct { struct ListElement *head; struct ListElement *position; } List; boolean addElement(List *list, int value) { ListElement e; e.value = value; e.next = list->position->next; e.last = list->position; if(list->position->next != NULL) list->position->next->last = &e; list->position->next = &e; return TRUE; } int main(int argc, char **argv) { List list; ListElement head; head.value = 40; head.next = NULL; head.last = NULL; list.head = &head; list.position = &head; addElement(&list, 20); ListElement *e; e = &head; printf("%i ", e->next->value); printf("%i ", e->value); printf("\n\n"); system("PAUSE"); return EXIT_SUCCESS; }
Vorwerg: Ich habe den Sourcecode mit der Visual C++ 2008 Express Edition erfolgreich kompiliert.
Wie ihr sicher merkt geht es um Listen. An sich nicht weiter spektakulär. In diesem Fall bekomme ich als Ausgabe:
20 40 Drücken Sie eine beliebige Taste . . .
Diese Ausgabe habe ich auch erwartet. Jetzt kommt aber das Merkwürdige. Vertausche ich nämlich nun die Zeilen 48 und 49 miteinander, dann sollten sich meiner Meinung nach die Werte nicht ändern und die Ausgabe in vertauscher Reihenfolge erscheinen. Ich bekomme jedoch folgende Ausgabe:
40 3014228 Drücken Sie eine beliebige Taste . . .
Dies kann ich mir aber beim besten Willen nicht erklären. Wäre dankbar für jeden Ratschlag.
Grüße Simex
-
Erstmal solltest du lernen, dass C und C++ zwei verschiedene Sprachen sind. Es gibt kein C/C++ und was du schreibst ist kein C++, sondern C und dazu noch falsches C.
Variablen haben nur eine begrenzte Lebensdauer. So wie deine Variable in Zeile 21. Danach werden diese entfernt und wenn du versuchst auf den Speicher zuzugreifen, kann alles mögliche passieren.
-
Hey rüdiger,
ich danke dir
. Du hast Recht, die Lebenszeit der Variablen hab ich total missachtet.
Damit hat es aber dann geklappt:
//... boolean addElement(List *list, int value) { ListElement *e; e = (ListElement*)malloc(sizeof(ListElement)); if(e == NULL) return FALSE; e->value = value; e->next = list->position->next; e->last = list->position; if(list->position->next != NULL) list->position->next->last = e; list->position->next = e; return TRUE; } // ...
Erstmal solltest du lernen, dass C und C++ zwei verschiedene Sprachen sind. Es gibt kein C/C++ und was du schreibst ist kein C++, sondern C und dazu noch falsches C.
An welcher Stelle behaupte ich, dass C das Gleiche ist wie C++? Und wo habe ich behauptet, dass ich von einem C++ Code rede? Und was ist falsches C? Wenn du dir den Teil gespaart hättest, dann wäre das wirklich eine super Antwort gewesen. Wollte dir damit nur ein kleines Feedback zu deiner Antwort geben. Die kam nämlich etwas herabslassend rüber. Soll nicht bös gemeint sein. Bin nach wie vor echt dankbar und das hat mir sicher einige Stunden Zeit erspaart
.
Grüße Simex
-
Erstmal solltest du lernen, dass C und C++ zwei verschiedene Sprachen sind. Es gibt kein C/C++ und was du schreibst ist kein C++, sondern C und dazu noch falsches C.
An welcher Stelle behaupte ich, dass C das Gleiche ist wie C++? Und wo habe ich behauptet, dass ich von einem C++ Code rede? Und was ist falsches C? Wenn du dir den Teil gespaart hättest, dann wäre das wirklich eine super Antwort gewesen.
- Titel "Listen in C/C++", und es gibt halt kein C/C++.
- Du kompilierst das mit dem "Visual C++ 2008 Express Edition" wie du schreibst, also scheinst du doch irgendwo C++ machen zu wollen.
- Was an deinem "C" falsch ist, kann ich dir nicht sagen, ich kann kein richtiges C. Aber wenn Rüdiger das sagt würde ich ihm Glauben schenken und höflich nachfragen, wie das in irchtigem C ausschaut
Ach ja, ich weiß
struct MyStruct { // Daten };
geht in C nicht
Geht erst seit C++...
Du musst das über den "typedef"-Umweg machentypedef struct { /// } MyStruct;
oder so.
-
Dieser Thread wurde von Moderator/in volkard aus dem Forum C++ in das Forum ANSI C verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Jolender Hüter schrieb:
- Du kompilierst das mit dem "Visual C++ 2008 Express Edition" wie du schreibst, also scheinst du doch irgendwo C++ machen zu wollen.
In Visual C++ 2008 Express Edition kann man angeben, ob als C++ oder C kompiliert werden soll. Bei mir im Institut gibt es auch viele Kollegen, die C mit Visual C++ schreiben.
-
simex schrieb:
Und was ist falsches C?
Damit meint man meistens einen Quelltext, der nicht ohne Fehler durch den Compiler geht.
-
simex schrieb:
Und was ist falsches C?Damit meint man meistens einen Quelltext, der nicht ohne Fehler durch den Compiler geht.
Hier aber wohl nicht
-
DarkShadow44 schrieb:
Hier aber wohl nicht
Weil...?
-
sorry, wirkte vielleicht ein bisschen herablassend. Aber die ganze C und C++ Verwechselei ist ein bisschen nervig. Sollte nicht böse gemeint sein.
Wegen dem malloc, siehe http://www.c-plusplus.net/forum/viewtopic.php?t=206606
-
rüdiger schrieb:
sorry, wirkte vielleicht ein bisschen herablassend. Aber die ganze C und C++ Verwechselei ist ein bisschen nervig. Sollte nicht böse gemeint sein.
Naja, der Seitenbetriber machts ja auch offiziell.
<title>C/C++ Forum :: Index</title>
-
DarkShadow44 schrieb:
Hier aber wohl nichtWeil...?
...man unkompiliert keine Ausgabe bekommt
-
> Naja, der Seitenbetriber machts ja auch offiziell.
Naja, aber selbst Herr Struppi macht da eine feine Unterscheidung. :xmas1:
<a href= schrieb:
http://www2.research.att.com/~bs/bs_faq.html#C-slash">I use C/C++ only in phrases such as "C/C++ compatibility" and "C/C++ community".
-
DarkShadow44 schrieb:
...man unkompiliert keine Ausgabe bekommt
Hmm.
$ gcc main.c main.c: In function 'addElement': main.c:21: error: 'ListElement' undeclared (first use in this function) main.c:21: error: (Each undeclared identifier is reported only once main.c:21: error: for each function it appears in.) main.c:21: error: expected ';' before 'e' main.c:22: error: 'e' undeclared (first use in this function) main.c: In function 'main': main.c:37: error: 'ListElement' undeclared (first use in this function) main.c:37: error: expected ';' before 'head' main.c:38: error: 'head' undeclared (first use in this function) main.c:45: error: 'e' undeclared (first use in this function)
Hab ich da was falsch gemacht?
-
Naja, aufgrund der Compilermeldungen sieht es ganz danach aus
Guck mal wo die angemeckerten Elemente deklarierst.
-
Matze8426 schrieb:
Naja, aufgrund der Compilermeldungen sieht es ganz danach aus
Guck mal wo die angemeckerten Elemente deklarierst.Aber ich hab's doch einfach nur aus dem ersten Post kopiert.
-
Hallo nochmal
,
ich find es gut, dass jeder seine Meinung in einem Forum kundtun darf, aber findet ihr es wirklich sinnvoll darüber nachzudenken ob das nun C++ oder C ist und dabei über andere herzufallen?
Fakt ist jedenfalls, dass sich der Sourcecode mit der Visual C++ 2008 Express Edition ohne Fehlermeldung kompilieren ließ. Ich hatte die "Kompilierungsart" auf "Als C++-Code kompilieren (/TP)". Mit "Als C-Code kompilieren (/TC)" lässt sich der Sourcecode nicht kompilieren. Jetzt kann man sich streiten wie wer was gemeint hat und was nun C-Code ist und was nicht. Ich werd mich aber aus dieser Diskusion herausziehen und möchte rüdiger nochmal danken. Man merkt, dass er das nötige Know-How hat und ich find es super, dass er Menschen wie mir hilft und Fragen beantwortet.
Da es mir tatsächlich darum ging am Ende reinen C-Code zu haben und das Thema nun auch ins ANSI C Forum geschoben wurde, hab ich den Sourcecode angepasst und versucht den Tip mit dem malloc richtig umzusetzen.
Hier das Ergebnis:
#include <stdio.h> #include <stdlib.h> struct listElement { int value; struct listElement *last; struct listElement *next; }; typedef struct listElement ListElement; struct list { ListElement *head; ListElement *position; }; typedef struct list List; typedef enum { false = 0, true = 1 } bool; bool addElement(List *list, int value) { ListElement *element; element = (ListElement *)malloc(sizeof(element)); if(element == NULL) return false; element->value = value; element->next = list->position->next; element->last = list->position; if(list->position->next != NULL) list->position->next->last = element; list->position->next = element; return true; } int main(int argc, char **argv) { List list; ListElement *element; ListElement head; head.value = 40; head.next = NULL; head.last = NULL; list.head = &head; list.position = &head; addElement(&list, 20); element = &head; printf("%i ", element->next->value); printf("%i ", element->value); printf("\n\n"); system("PAUSE"); return EXIT_SUCCESS; }
Grüße Simex
-
simex schrieb:
ich find es gut, dass jeder seine Meinung in einem Forum kundtun darf
Gut ist das sicher nicht, es fällt nur keinem was besseres ein.
-
µngbd schrieb:
simex schrieb:
Und was ist falsches C?
Damit meint man meistens einen Quelltext, der nicht ohne Fehler durch den Compiler geht.
oder einer (viel schrecklicher), der zwar durch den compiler geht, aber mal läuft und manchmal auch nicht.
Ad aCTa schrieb:
Naja, aber selbst Herr Struppi macht da eine feine Unterscheidung.
<a href= schrieb:
http://www2.research.att.com/~bs/bs_faq.html#C-slash">I use C/C++ only in phrases such as "C/C++ compatibility" and "C/C++ community".
struppi ist ja auch voll der loser. "C/C++ compatibility" sowie "C/C++ community" sind kaum vorhanden, quasi nichtssagende buzzwörter. er will doch nur irgendwelche alten aussagen damit rechtfertigen, die er irgendwann mal gemacht hat.
-
;fricky schrieb:
struppi ist ja auch voll der loser. "C/C++ compatibility" sowie "C/C++ community" sind kaum vorhanden, quasi nichtssagende buzzwörter. er will doch nur irgendwelche alten aussagen damit rechtfertigen, die er irgendwann mal gemacht hat.
Naja, "C/C++ community" ist realexistierend hier. Siehe title-Tag.
"C/C++ compatibility" drückt aus, daß C++ viele Syntaxverbrechen, die man heutzutage niemals mehr machen würde, von C übernommen hat, um verdammt viele C-Benutzer zu klauen.