PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Referenz Parameter in C++


nobody
25.03.2003, 18:47
Hi
Hab ein Problem mit den schon eben schon genannten.
Muss für ne Übung ein Prog schreiben und mein Debugger spuckt die ganze Zeit

R2_01.OBJ : error LNK2001: unresolved external symbol "void __cdecl Erstellen(struct St_Mitarb *)" (?Erstellen@@YAXPAUSt_Mitarb@@@Z)
Debug/PR2_01.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

PR2_01.exe - 2 error(s), 0 warning(s)

aus.

Ich bin schon soweit, dass ich das Prob auf die Referenz Parameter in der Funktion "Erstellen" zurrück geführt habe.
Ich habe den Syntax mit dem Bsp. Prog. meines Info-Profs schon verglichen und kann keinen syntaktischen Fehler finden.

Der bisherige Quelltextt:


PR01_02.CPP
-----------

#include "funktionen.h"




void main()
{
St_Mitarb *anf;
anf = new St_Mitarb;
Erstellen(anf);
//Einfuegen(anf);
//Ausgabe(anf);
}

funktionen.h
------------

#include <iostream.h>

//Strukturen
struct St_GebTag
{
int tag,
monat,
jahr;
};

struct St_Mitarb
{
char name[20],
vorname[15];

St_GebTag gebdat;

St_Mitarb *pvor,
*prueck;

};


//Funktionen
void Erstellen(St_Mitarb*& anf);

Erstellen.CPP
-------------

#include "funktionen.h"

void Erstllen(St_Mitarb* anf)
{
St_Mitarb* pmitarb;
pmitarb = new St_Mitarb;
anf=pmitarb;
cout << "Adresse von anf im Stack: " << &anf << endl;
cout << "Adresse von anf im Heap: " << anf << endl;
}

Vielleicht findet hier ja einer die Wurzel des Problems.
Grüsse und dank im Vorraus!

ernest
25.03.2003, 20:50
hm, was bedeutet dieses *prueck;?
St_GebTag gebdat;

St_Mitarb *pvor,
*prueck;

};

nochwas: muss ein {}-Bereich auch mit einem ; abgeschlossen werden?

PS: Sorry, aber ich hab mich mit C/C++ noch nie wirklich auseinandergesetzt

nobody
25.03.2003, 21:21
@ernest
Das Prog ist ne Übung zur Dynamischen Speicherverwaltung. dieses *prueck ist ein Zeiger auf das zuvor eingegebne Datenfeld im Speicher.
Sollte wenns fertig ist ne vor und rückwerts verkettet Liste werden.

und der Bereich mit den {} der mit ; abgeschlossen ist.
Meines Wissens ist das nur bei Struckturen (struct) und Klassen nötig (class).

Naja hab auch nicht wirklich Ahnung von C++, gibt noch zu vieles was ich noch zu lernen hab.
Greetz

nobody
26.03.2003, 15:28
das stimmt ´meiner meinung nicht und ich code ein halbjahr schon java im informatik lk in der schule. nach {} kommt kein ;

nach z.b. int fahrrad; da kommt ein ; sonst nicht

nobody
26.03.2003, 17:05
@larzerrus
Von Java hab ich keine Ahnung.
In C++ dagegen ist es so das du nach der Deklaration von Strukturen und Klassen, die ja mir {} eingeschlossen werden, das ganze mit nem ; abschließen musst.
Beim Rest braucht man nach {} sowas nicht.


Axo hab die Lösung des Problems gefunden.
War ein kleiner Vertipper den der Debugger nicht erkannt hat.
ist schon so ne Sache wenn irgendwo ein einzelnes e fehlt und mans patu nicht findet
Greetz

nobody
26.03.2003, 18:11
ist ja total schrott sowas :confused:

nobody
21.04.2003, 20:30
hmmmmm....schau mal nach ob du alle Bibliotheken richtig dastehen hast.
ich meine du hast ja 2 cpp´s
aber der ausführende teil kennt denn anderen meiner meinung gar nicht. ich kenne die fehlerausgabe auch, LNK (sprich Linker) also schau da noch mal nach

nobody
21.04.2003, 22:25
Funktioniert dein Programm jetzt, nachdem du den Tippfehler verbessert hast? Mir kommen da noch ein paar Sachen merkwürdig vor.

Gruß,
Christian

nobody
21.04.2003, 22:54
Hallo,

ich habe das Programm jetzt mal geändert; so ist es wenigstens syntaktisch korrekt. Was du damit willst ist mir aber noch nicht klar.


// aus dem CO-Forum
//------------------


#include <iostream.h>


struct St_GebTag
{
int tag, monat, jahr;
};

struct St_Mitarb
{
char name[20],
vorname[15];
St_GebTag gebdat;
St_Mitarb *pvor, *prueck;

};



void Erstellen(St_Mitarb &anf);


Wegen dem Betreff gehe ich davon aus, dass du Erstellen eine Referenz übergeben möchtest?


int main()
{
St_Mitarb *anf = new St_Mitarb;
Erstellen(*anf);
//Einfuegen(anf);
//Ausgabe(anf);
return 0;
}




void Erstellen(St_Mitarb &anf)
{
St_Mitarb *pmitarb = new St_Mitarb;
anf=*pmitarb;
cout << "Adresse von anf im Stack: " << &anf << endl;
//cout << "Adresse von anf im Heap: " << anf << endl;
}


Also: Erstellen(*anf) wird anf als Referenz übergeben. Anf in Erstellen(...) ist sozusagen ein Alias für den Speicher, auf den *anf in main() zeigt. Dieser ist im Heap. Auf die Adresse der Referenz selbst kann man nicht zugreifen.

In Erstellen(...) wird anf jetzt = *pmitarb.
Was ist davon jetzt bitte im Stack?


Gruß,
Christian

nobody
22.04.2003, 00:20
@Bubu:
Yepp das Prog läuft jetzt.
Der Linker hatte nen Verweis auf ne Funktion die wegen des Tippfehlers nicht zu finden war.

@Chris:
Im Stack ist nur noch die Adresse auf der die eigentichen Daten liegen sollen.
Ziel war es ja die Daten mittels dynamischer Speicherverwaltung im Heap abzulegen.
Das Funktioniert nur mit Zeigern die aus dem Stack auf die Adresse im Heap zeigen.
(Hoffe das hattest du gemeint, wenn nicht einfach posten)

Greetz

nobody
22.04.2003, 11:25
Originalnachricht erstellt von Cursedone
@Chris:
Im Stack ist nur noch die Adresse auf der die eigentichen Daten liegen sollen.
Ziel war es ja die Daten mittels dynamischer Speicherverwaltung im Heap abzulegen.
Das Funktioniert nur mit Zeigern die aus dem Stack auf die Adresse im Heap zeigen.
(Hoffe das hattest du gemeint, wenn nicht einfach posten)


Ja ok. War gestern Abend zu spät.

Gruß,
Christian