Inkompatible Typen
-
Hi, ich habe folgendes Problem
#include <stdio.h> #include <stdlib.h> typedef struct stackPart { int value; struct *ptrToNextPart; }stackPart; // Funktion initStack die einen integerwert zurück liefern soll, und zwar die Adresse, darum das Sternchen int *initStack(int eingabe) { stackPart a; /* neue variable vom typ stackPart erstellen */ a.value = eingabe; // füllen a.ptrToNextPart = NULL; // zeiger setzen return (a); /* a returnen, aber durch das Sternchen nur die adresse von a, hier kommt die Fehlermeldung inkompatible typen*/ } int main() { int *pstart; // ein pointer pstart = initStack(30); /*speicher die adresse die von initstack zurück geliefert wird */ return(0); }
Tjoa
-
Hallo,
einige Dinge die mir spontan auffallen:
(1)die Funktion ist hat nach der Definition den Rückgabetyp int*, aber Du versuchst eine Struktur zurückzugeben.
(2)die Struktur ist überdies lokal, d.h. sie wird bei Rückkehr der Funktion zerstört.
(3) davon abgesehen gibst Du auch keine Adresse zurück, sondern den "Inhalt" der Struktur
-
So sehen Asgards hinweise übersetzt in Code aus:
stackPart *initStack(int eingabe) { stackPart* a = new stackPart; a->value = eingabe; a->ptrToNextPart = NULL; return a; }
Den reservierten Speicher musst du irgendwo wieder mit delete löschen, wenn
du die Liste nicht mehr brauchst. Soll doch ne verkettete Liste werden?
-
Taurin schrieb:
stackPart* a = new stackPart;
Aber nicht in C.
stattdessen:
stackPart * a = malloc(sizeof(stackPart));
-
Ok, Vorschläge beherzigt, ich habs mit Hilfe geschafft das Teil zu beenden, allerdings habe ich fragen dazu:
#include <stdio.h> #include <stdlib.h> typedef struct stackPart { int value; int *pToNextPart; }stackPart; stackPart *pPosition; /* Hierzu die Frage: In der Main gebe ich die Adresse aus, auf die dieser Pointer zeigt. Wieso ist die "0" und kein Wert der bereits im Speicher war? 2.) Verständnisfrage: "stackPart *pPosition;" besagt doch auf gut Deutsch: erstelle einen pointer welcher auf irgendeine Struktur vom typ stackPart zeigen kann oder sehe ich das falsch?*/ void push(int eingabe) { stackPart *pNeuesElement = (stackPart *)malloc(sizeof(stackPart)); pNeuesElement->value = eingabe; pNeuesElement->pToNextPart = pPosition; pPosition = pNeuesElement; printf("Die %i liegt in der Adresse %i!\n", pNeuesElement->value, pPosition); } void pop() { // Unterlaufschutz fehlt stackPart *pZuLoeschendesElement=pPosition; pPosition=pPosition->pToNextPart; free(pZuLoeschendesElement); } void show() { // Ausgabe erst wenn ein Wert eingegeben wurde fehlt printf("Der Wert %i in der Adresse %i liegt oben im Stack!\n", *pPosition, pPosition); } int main() { printf("%i ist die momentane Adresse vom pPosition!\n", pPosition); push(30); push(17); push(40); pop(); push(100); show(); return 0; }
Hoffentlich hilft mir so spät noch jemand
Gibts sonst noch etwas zu meckern?
-
Gast001 schrieb:
stackPart *pPosition; /* Hierzu die Frage: In der Main gebe ich die Adresse aus, auf die dieser Pointer zeigt. Wieso ist die "0" und kein Wert der bereits im Speicher war?
2.) Verständnisfrage: "stackPart *pPosition;" besagt doch auf gut Deutsch: erstelle einen pointer welcher auf irgendeine Struktur vom typ stackPart zeigen kann oder sehe ich das falsch?*/1: Du gibst die Adresse mehrfach aus. Ist die immer 0? (Kann eigentlich nicht sein). BTW der Formatbezeichner für Pointer ist %p und nicht %i.
2: Genau.
-
Ich gebe die Adresse 1x aus, und zwar ganz am Anfang wo ich noch nichts dort reingeschrieben habe, wo der pointer pPosition hinzeigt
int main() { printf("%i ist die momentane Adresse vom pPosition!\n", pPosition); [...]
Ich habe pPosition initialisiert und wollte mal schauen worauf der pointer zeigt und er zeigt immer auf "0".
Ist das nun Standardmäßig so gemacht worden?
-
Man merkt dasist noch neu für mich:
ich meinte die adresse des pointers ist Null, schreibe ich nun noch einen pointer dazu, z.b. stackPart *neuerpointer; und gebe auch seine adresse aus ist sie auch null. ich verstehe nicht wie beide dieselbe adresse haben können?
-
Du gibst die Adresse nicht nur in main aus, sondern auch in push und in show. Dass sie am Anfang 0 ist liegt daran, dass globale und statische Variablen automatisch mit 0 initialisiert werden, wenn nichts anderes angegeben ist.
auf das zweite Posting: Nicht die Adresse des Pointers ist 0, sondern beide Pointer zeigen auf 0. Und das ist überhaupt kein Problem, hoffe ich
-
Ok genau das wollte ich wissen vielen Dank.
Ist wie gesagt alles noch sehr neu für mich und ich muss mich da noch reinfuchsen.besten dank!
-
halt, moment gar nicht
also:
stackPart *pPointer; wurde erstellt.
int main() { printf("%i ist die momentane Adresse vom pPosition!\n", pPosition); [...]
Rufe ich auf, ohne das ich irgendetwas gemacht habe und pPosition gibt doch die Adresse aus, *pPosition würde den Inhalt ausgeben denn:
void push(int eingabe) //Nehmen wir 30 { [...] printf("Die %i liegt in der Adresse %i!\n", pNeuesElement->value, pPosition); }
Gibt aus
"Die 30 liegt in der Adresse 3283298!"
Also gibt pPosition doch die Adresse aus und nicht den Inhalt worauf pPosition zeigt oder nicht?!
-
Am Anfang zeigt pPosition auf 0. Dann weist du ihm einen dynamisch allozierten Speicherblock zu, dh er zeigt dann auf eine konkrete Adresse. Wo ist das Problem?