 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Klaus Reinke Guest
|
Posted: Tue Aug 15, 2006 4:11 pm Post subject: struct mit Zeiger Schwierigkeit |
|
|
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
|
Posted: Tue Aug 15, 2006 5:44 pm Post subject: Re: struct mit Zeiger Schwierigkeit |
|
|
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
|
Posted: Tue Aug 15, 2006 5:47 pm Post subject: Re: struct mit Zeiger Schwierigkeit |
|
|
-----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
|
Posted: Tue Aug 15, 2006 5:52 pm Post subject: Re: struct mit Zeiger Schwierigkeit |
|
|
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.
Hier machst du nen Nullzeiger draus. Damit hat die vorherige Operation
keinen Effekt mehr.
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
|
Posted: Tue Aug 15, 2006 6:44 pm Post subject: Re: struct mit Zeiger Schwierigkeit |
|
|
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
|
Posted: Tue Aug 15, 2006 7:21 pm Post subject: Re: struct mit Zeiger Schwierigkeit |
|
|
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
|
Posted: Tue Aug 15, 2006 9:11 pm Post subject: Re: struct mit Zeiger Schwierigkeit |
|
|
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 |
|
 |
Powered by phpBB © 2001, 2006 phpBB Group
|