C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

struct mit Zeiger Schwierigkeit

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Klaus Reinke
Guest





PostPosted: Tue Aug 15, 2006 4:11 pm    Post subject: struct mit Zeiger Schwierigkeit Reply with quote



Bin im Moment wie vernagelt wieso funktioniert der folgende Code nicht?

#include<iostream>
using namespace std;

struct teil{
string bezeichnung;
int id;
teil *next;
};

int main(){
teil *p_teil = new teil[100];
teil *p;

p_teil->bezeichnung="Hammer";
p_teil->id=1;
p_teil->next=new teil;
p=p_teil;

p_teil++;
p_teil->bezeichnung="Meißel";
p_teil->id=2;
p_teil->next=new teil;

p_teil++;
p_teil->bezeichnung="Schraubendreher";
p_teil->id=3;
p_teil->next=NULL;

++p_teil;
p_teil=NULL;

p_teil=p;
do {

cout << p_teil->id << '\t' << p_teil->bezeichnung << endl;
p_teil++;

} while (p_teil!=NULL);


return 0;
}

Die Teile werden korrekt ausgegeben aber die NULL-Abfrage funzt nich.

Für diese Aufgabe wäre ein vector die bessere Alternative,
aber darum geht es im Moment nicht.

mfg Klaus
Back to top
Martin Engler
Guest





PostPosted: Tue Aug 15, 2006 5:44 pm    Post subject: Re: struct mit Zeiger Schwierigkeit Reply with quote



Klaus Reinke wrote:

Quote:
struct teil{
string bezeichnung;
int id;
teil *next;
};

int main(){
teil *p_teil = new teil[100];//(1)
teil *p;

p_teil->bezeichnung="Hammer";
p_teil->id=1;
p_teil->next=new teil;//(2)
p=p_teil;

p_teil++;
p_teil->bezeichnung="Meißel";
p_teil->id=2;
p_teil->next=new teil;//(3)

p_teil++;
p_teil->bezeichnung="Schraubendreher";
p_teil->id=3;
p_teil->next=NULL;//(4)

++p_teil;
p_teil=NULL;

Deine Datenstruktur sieht hier so aus:

[teil_1, teil_2, teil_3, teil_x, teil_y...] <-Das teil Array aus (1)
| | |
v v v
teil_a teil_b 0
(2) (3) (4)

Wobei teil_x, teil_y und der Rest im Array keinen definierten Inhalt
haben. Die Zahlen (1),(2) beziehen sich auf die Markierungen, die ich
in deinem Code gemacht habe.
Quote:
p_teil=p;
do {

cout << p_teil->id << '\t' << p_teil->bezeichnung
endl; p_teil++;

} while (p_teil!=NULL);
return 0;
}

Die Teile werden korrekt ausgegeben aber die NULL-Abfrage funzt nich.
Hier durchläufst du das Array vom Anfang ohne auf das Ende des Arrays zu

testen, da der Zeiger p_teil nach jedem Schritt auf nächste Feld zeigt
und daher nicht 0 wird.
Ich denke du wolltest eine verkette Liste haben in der Art:
teil_1->next=teil_2
teil_2->next=teil_3
teil_3->next=0

Siehe auch: http://de.wikipedia.org/wiki/Liste_(Datenstruktur)

Quote:
Für diese Aufgabe wäre ein vector die bessere Alternative,
aber darum geht es im Moment nicht.
Ich würde eher std::list mit

struct myTeil{
string bezeichnung;
int id;
};
als Datentyp verwenden oder du baust dir eine verketten Liste mit
Einfüge- und Löschfunktion und Speicherfreigabe im Destruktor selbst.
Back to top
Klaus Schroeder
Guest





PostPosted: Tue Aug 15, 2006 5:47 pm    Post subject: Re: struct mit Zeiger Schwierigkeit Reply with quote



-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Klaus Reinke schrieb:
Quote:
Bin im Moment wie vernagelt wieso funktioniert der folgende Code nicht?

#include<iostream
using namespace std;

struct teil{
string bezeichnung;
int id;
teil *next;
};

int main(){
teil *p_teil = new teil[100];
teil *p;

p_teil->bezeichnung="Hammer";
p_teil->id=1;
p_teil->next=new teil;
p=p_teil;

p_teil++;
p_teil->bezeichnung="Meißel";
p_teil->id=2;
p_teil->next=new teil;

p_teil++;
p_teil->bezeichnung="Schraubendreher";
p_teil->id=3;
p_teil->next=NULL;

++p_teil;
p_teil=NULL;
Was soll das, wo Du den Pointer doch gleich darauf auf


Quote:
p_teil=p;
setzt?
do {

cout << p_teil->id << '\t' << p_teil->bezeichnung << endl;
p_teil++;

} while (p_teil!=NULL);


return 0;
}

Die Teile werden korrekt ausgegeben aber die NULL-Abfrage funzt nich.

Du solltest Dich schon entscheiden, ob Du einen Vektor oder eine

verkettete Liste aufbauen willst. Du versuchtst einen Mix aus beidem,
der voll in die Hose geht. Am besten, Du zeichnest Dir einmal alle in
diesem Programm definierten Speicherbereiche einmal auf, auch wohin
jeder Pointer zeigt. Dann wirst Du sehen, welcher Murx da zustande kommt.

Mfg Klaus
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.2 (GNU/Linux)
Comment: Using GnuPG with SUSE - http://enigmail.mozdev.org

iD8DBQFE4cJWFiIwKQhNwYMRAhrHAJ9q8utyno7ZT109UQ6NCorvcfDmzwCbBQSO
KUu/Oje1yC7gnOmjk0wMXCY=
=pNfc
-----END PGP SIGNATURE-----
Back to top
Rolf Magnus
Guest





PostPosted: Tue Aug 15, 2006 5:52 pm    Post subject: Re: struct mit Zeiger Schwierigkeit Reply with quote

Klaus Reinke wrote:

Quote:
Bin im Moment wie vernagelt wieso funktioniert der folgende Code nicht?

#include<iostream
using namespace std;

struct teil{
string bezeichnung;
int id;
teil *next;
};

int main(){
teil *p_teil = new teil[100];
teil *p;

p_teil->bezeichnung="Hammer";
p_teil->id=1;
p_teil->next=new teil;

Wozu ist das gut? Du legst ein neues Teil an, und das war's. Sollte das
nicht vielleicht eine verkettete Liste sein?

Quote:
p=p_teil;

p_teil++;
p_teil->bezeichnung="Meißel";
p_teil->id=2;
p_teil->next=new teil;

p_teil++;
p_teil->bezeichnung="Schraubendreher";
p_teil->id=3;
p_teil->next=NULL;

++p_teil;

Hier inkrementierst du p_teil.

Quote:
p_teil=NULL;

Hier machst du nen Nullzeiger draus. Damit hat die vorherige Operation
keinen Effekt mehr.

Quote:
p_teil=p;

Hier überschreibst du es abermals, diesmal mit p. Wieder wird dadurch der
Effekt der vorherigen Zuweisung zunichte gemacht. p_teil ist ja nicht pro
Element abgespeichert, sondern einfach nur der Zeiger, den du zum Iterieren
durch das Array benutzt.

Quote:
do {

cout << p_teil->id << '\t' << p_teil->bezeichnung << endl;
p_teil++;

} while (p_teil!=NULL);


return 0;
}

Die Teile werden korrekt ausgegeben aber die NULL-Abfrage funzt nich.

Warum sollte p_teil auch NULL werden? Es zeigt am Anfang auf das erste
Element und wird dann immer weiter inkrementiert.
Back to top
Klaus Reinke
Guest





PostPosted: Tue Aug 15, 2006 6:44 pm    Post subject: Re: struct mit Zeiger Schwierigkeit Reply with quote

Klaus Schroeder wrote:

Quote:
p_teil->next=NULL;

++p_teil;
p_teil=NULL;
Was soll das, wo Du den Pointer doch gleich darauf auf

p_teil=p;
setzt?

Jetzt erkenne ich meinen Fehler ich wollte das vierte Element auf
NULL zeigen lassen, statt dessen verweist mein Auswahlzeiger auf NULL
was freilich wenig Zweck hat.
Also teste ich auf auf p_teil->next selbst, was ich eigentlich unelegant
finde.


p_teil++;
p_teil->bezeichnung="Schraubendreher";
p_teil->id=3;
p_teil->next=new teil;

p_teil=p;
do {

cout << p_teil->id << '\t' << p_teil->bezeichnung << endl;
p_teil++;

} while (p_teil->next!=NULL);

ist das zulässig?
Immerhin frage ich ein nicht initialisiertes Element ab.

mfg Klaus
Back to top
Rolf Magnus
Guest





PostPosted: Tue Aug 15, 2006 7:21 pm    Post subject: Re: struct mit Zeiger Schwierigkeit Reply with quote

Klaus Reinke wrote:

Quote:
Klaus Schroeder wrote:

p_teil->next=NULL;

++p_teil;
p_teil=NULL;
Was soll das, wo Du den Pointer doch gleich darauf auf

p_teil=p;
setzt?

Jetzt erkenne ich meinen Fehler ich wollte das vierte Element auf
NULL zeigen lassen, statt dessen verweist mein Auswahlzeiger auf NULL
was freilich wenig Zweck hat.
Also teste ich auf auf p_teil->next selbst, was ich eigentlich unelegant
finde.


p_teil++;
p_teil->bezeichnung="Schraubendreher";
p_teil->id=3;
p_teil->next=new teil;

p_teil=p;
do {

cout << p_teil->id << '\t' << p_teil->bezeichnung << endl;
p_teil++;

} while (p_teil->next!=NULL);

ist das zulässig?
Immerhin frage ich ein nicht initialisiertes Element ab.

Nein. Du fragst nur den Zeiger ab, und der ist initialisiert. Allerdings
verstehe ich nicht ganz, wozu du überhaupt immer noch mal ein zusätzliches
dynamisch angelegetes teil hast.
Back to top
Klaus Reinke
Guest





PostPosted: Tue Aug 15, 2006 9:11 pm    Post subject: Re: struct mit Zeiger Schwierigkeit Reply with quote

Rolf Magnus wrote:

Quote:
Allerdings
verstehe ich nicht ganz, wozu du überhaupt immer noch mal ein zusätzliches
dynamisch angelegetes teil hast.

Nun ursprünglich sah mein Code so aus:

teil *p_teil = new teil;
teil *p;

p_teil->bezeichnung="Hammer";
p_teil->id=1;
p_teil->next=new teil; // \1\
p=p_teil;

p_teil++; // \2\
p_teil->bezeichnung="Meißel";
p_teil->id=2;
p_teil->next=NULL;

Das lief gar nich, langsam dämmert mir auch warum nicht, ich
erzeuge bei \1\ ein neues Teil aber wieso sollte 'p_teil++' auf
diese Adresse verweisen?
Jetzt habe ich bei \2\ folgendes stehen: 'p_teil=p_teil->next'
sieht zumindest besser aus.

mfg Klaus
(sorry wegen der PM da hab ich mich verklickt)
Back to top
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
 


Powered by phpBB © 2001, 2006 phpBB Group