Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Florian Super JLI'ler
Alter: 36 Anmeldedatum: 20.06.2003 Beiträge: 302
Medaillen: Keine
|
Verfasst am: 04.01.2004, 17:40 Titel: Zeiger Frage(Problem) |
|
|
Hallo
Ich wollte mal eine kleinen versuch anstellen.
Ich versuchte einen Klasse mit ein dynamisches Array erstellen.
Die größe des Arrays wollte ich mit den Konstruktor übergeben.
Mein Code:
#include<stdio.h>
class florian
{
public:
florian(int anzahl);
int *nummer ;
};
florian::florian(int anzahl)
{
*nummer = 0;
for(int i=0; i < anzahl;i++)
{
nummer = new int;
}
nummer = nummer -(anzahl*(sizeof(int)-sizeof(int)));
}
int main()
{
florian flo(3);
flo.nummer[3] = 2;
printf("%d",flo.nummer[3]);
return 0;
}
Das Programm funktioniert auch aber wenn ich einen index über 3 eingib funktioniert es immer noch das dürfte doch nicht sein oder.Warum ist das so
Danke im Voraus |
|
Nach oben |
|
|
Hasenfuß Senior JLI'ler
Alter: 37 Anmeldedatum: 20.08.2002 Beiträge: 291
Medaillen: Keine
|
Verfasst am: 04.01.2004, 17:49 Titel: Re: Zeiger Frage(Problem) |
|
|
Florian hat Folgendes geschrieben: |
florian::florian(int anzahl)
{
*nummer = 0;
for(int i=0; i < anzahl;i++)
{
nummer = new int;
}
|
Damit erzeugtst du je nachdem was anzahl für einen Wert hat mehrere Memory Lakes.
Florian hat Folgendes geschrieben: |
nummer = nummer -(anzahl*(sizeof(int)-sizeof(int)));
|
Das verstehe ich nicht nummer = nummer - (anzahl*0) => nummer = nummer??
Florian hat Folgendes geschrieben: |
int main()
{
florian flo(3);
flo.nummer[3] = 2; <==
printf("%d",flo.nummer[3]);
return 0;
}
|
Bei <== greifst du auf den Index 3 von nummer zu aber nummer ist doch gar kein array!?
Florian hat Folgendes geschrieben: |
Das Programm funktioniert auch aber wenn ich einen index über 3 eingib funktioniert es immer noch das dürfte doch nicht sein oder.Warum ist das so
Danke im Voraus |
Versuch erstmal ein array dynamisch-je nach anzahl-zu erstellen, und lösche das ding danach wieder mit delete! |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 04.01.2004, 17:49 Titel: |
|
|
Es ist schon toll das der Index 3 uebergaupt funktioniert.
2 ist die Obergrenze deines Arrays.
Und wieso stellst du den Speicher in einer Schleife bereit
es geht doch auch so:
nummer= new int[anzahl];
loeschen geht dann so:
delete [] nummer; _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
Hasenfuß Senior JLI'ler
Alter: 37 Anmeldedatum: 20.08.2002 Beiträge: 291
Medaillen: Keine
|
Verfasst am: 04.01.2004, 17:50 Titel: |
|
|
Schneeeeeeeller:P |
|
Nach oben |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 04.01.2004, 17:56 Titel: |
|
|
Was du machst ist schrecklich falsch !!!
Bitte mal genau drüber nachdenken was hier alles passiert:
Code: |
florian::florian(int anzahl)
{
*nummer = 0;
for(int i=0; i < anzahl;i++)
{
nummer = new int;
}
nummer = nummer -(anzahl*(sizeof(int)-sizeof(int)));
}
|
Es sollte zum ersten mal bei
*nummer = 0;
abstürzen. Du greifst da auf einen nicht definierten Speicherbereich zu. Wo zeigt nummer hin? Auf Adresse 0? Sonstwohin? Es ist eben nicht definiert, ohne dass du den Zeiger initialisierst. Vielleicht meintest du
nummer = NULL;
Damit würde der Zeiger initialisert werden. In der Schleife legst du dir Speicher für 3 Integer-Variablen an. Du merkst dir aber nicht, wo dieser Speicher ist. Ich denke nicht, dass es garantiert ist, dass die 3 ints hintereinanderliegen. Außerdem ist die Adreßberechung falsch.
Richtig sollte der Konstruktor ungefähr so aussehen:
Code: |
florian::florian(int anzahl)
{
nummern = 0;
nummern = new int[anzahl];
}
|
Das dies hier klappt ist genauso Zufall wie beim Kontruktor:
Code: |
int main()
{
florian flo(3);
flo.nummer[3] = 2;
printf("%d",flo.nummer[3]);
return 0;
}
|
Du kannst auch auf flo.nummer[10000] zugreifen. Das wird vielleicht auch gehen. Das Problem ist nur, dass es nicht definiert ist. Du schreibst in Speicher der dir nicht gehört und liest auch wieder von dort. Gehen kann das, wird aber spätestens dann nicht mehr gehen, wenn sich dieser Code in der Steuerung für ein Atomkraftwerk wiederfindet.
Zum Schluss wäre dann noch folgender Destruktor gut:
Code: |
forian::~florian()
{
delete[] nummern;
}
|
Memory Leaks sind halt auch nicht schön.
Christian |
|
Nach oben |
|
|
xardias JLI Master
Alter: 38 Anmeldedatum: 28.12.2003 Beiträge: 804 Wohnort: Palo Alto, CA Medaillen: Keine
|
Verfasst am: 04.01.2004, 18:25 Titel: |
|
|
Ein kleiner Tipp.
Ich würde std::vector statt arrays benutzen.
die haben den Vorteil, dass sie praktisch einen Überlaufschutz haben und man nicht unbeabsichtigt ganz andere variablen ändert, das kann zu schrecklichen fehlern führen. |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 04.01.2004, 18:27 Titel: |
|
|
Als Training ist das ganze trotzdem recht gut. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
MadMax82 Mini JLI'ler
Anmeldedatum: 31.12.2003 Beiträge: 9
Medaillen: Keine
|
Verfasst am: 04.01.2004, 19:06 Titel: |
|
|
Ich würde vorschlagen das er erst mal ein Buch über C++ ließt den bei solchen Fehler die er gemacht hat würde ich nicht einfach mal mit der STL anfangen.Er sollte versuchen nachdem er das Buch gelesen hat nocheinmal eine Array classe zu schreiben und dan vieleicht eine Template Classe und erst wen man das alles behrscht sollte kan man anfangen vorgefertigte funktionen wie die der STL benutzen. |
|
Nach oben |
|
|
Florian Super JLI'ler
Alter: 36 Anmeldedatum: 20.06.2003 Beiträge: 302
Medaillen: Keine
|
Verfasst am: 04.01.2004, 21:16 Titel: |
|
|
Hallo Danke für die Antworten
Es stimmt, ich soll mich mit C++ mehrer beschäftigne speziel(Array und Zeigers);Aber ich bin noch neu in dieser Branch.
Mein ausgebesserter Code;
#include<stdio.h>
class florian
{
public:
florian(int anzahl);
~florian();
int *nummer;
};
florian::florian(int anzahl)
{
nummer = 0;
nummer = new int[anzahl];
}
florian::~florian()
{
delete[] nummer;
}
int main()
{
florian flo(4);
flo.nummer[3] = 3;
printf("%d",*(flo.nummer + 3));
return 0;
}
Dieser Code müsste jetzt korekt sein oder;
Ach noch eine Frage Dass *(flo.nummer + 3) ist voll das gleiche wie flo.nummer[3] oder?
und wenn ich bei der deklaration flo(3) eingib und dan mit dem index 3 zugreifen möchte kommt eine fehler Meldung.Meine Erklärung dazu das Array wird nicht so erstellt (1,2,3,4) sonder (0,1,2,3) stimmt das? |
|
Nach oben |
|
|
TheMillenium Dark JLI'ler
Anmeldedatum: 21.07.2002 Beiträge: 1427 Wohnort: World Medaillen: Keine
|
Verfasst am: 04.01.2004, 21:20 Titel: |
|
|
Florian hat Folgendes geschrieben: | und wenn ich bei der deklaration flo(3) eingib und dan mit dem index 3 zugreifen möchte kommt eine fehler Meldung.Meine Erklärung dazu das Array wird nicht so erstellt (1,2,3,4) sonder (0,1,2,3) stimmt das? |
Richtig! _________________ The source of all power is in its destiny... |
|
Nach oben |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 04.01.2004, 21:21 Titel: |
|
|
Jo, ist voll das Gleiche und in C fangen Arrays immer mit Index 0 an - Peace.
Christian |
|
Nach oben |
|
|
MadMax82 Mini JLI'ler
Anmeldedatum: 31.12.2003 Beiträge: 9
Medaillen: Keine
|
Verfasst am: 04.01.2004, 21:49 Titel: |
|
|
So jetzt stimmt dein Code zwar aber macht noch net viel Sinn du Kapselst dein Array in einer Klasse aber irgendwie macht das noch keine Unterschied als wie wen du das ohne Klassen machst. Versuche mal das eigentliche Array als privat zu deklarieren und dann den [] operator zu überladen, auch solltest du die Anzahl der elemente in der Klasse speichern, so kannst du eine überprüfung des Index durchführen und bei einem zu kleine oder zu großen Index eine Fehlermeldung ausgeben.
Dynamisch ist dein Array eigentlich auch net wirklich den man kan die größe nur im Konstruktor angeben. Fü rmich ist ein Array nur dan dynamisch wen man seine Größe wärend der Laufzeit ändern kann(Natürlich kan es sein das da andere anderer Meinung sind:-)). |
|
Nach oben |
|
|
Florian Super JLI'ler
Alter: 36 Anmeldedatum: 20.06.2003 Beiträge: 302
Medaillen: Keine
|
Verfasst am: 04.01.2004, 21:58 Titel: |
|
|
da dies so in einer Klasse geschrieben unsinn ist ist mir schon klar es war auch nur ein Versuch für mein erstes Spie.
Danke für die Antworten |
|
Nach oben |
|
|
MadMax82 Mini JLI'ler
Anmeldedatum: 31.12.2003 Beiträge: 9
Medaillen: Keine
|
Verfasst am: 04.01.2004, 22:16 Titel: |
|
|
Ja ist schon klar. Ich habe auch so angefangen C++ zu lernen damit wollte ich eigentlich nur sagen das es eine gute Übung ist wen man mal die ein oder andere Klasse der STL nachprogrammiert.Und wen du schon mal damit angefangen hast hintert dich ja nix daran die Klasse fertig zuschreiben ist echt nicht scwer. Und wen du Hilfe brauchst kanst ja hier posten. |
|
Nach oben |
|
|
HotAcid Super JLI'ler
Alter: 43 Anmeldedatum: 04.08.2002 Beiträge: 372 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 05.01.2004, 10:49 Titel: |
|
|
Florian hat Folgendes geschrieben: | Ach noch eine Frage Dass *(flo.nummer + 3) ist voll das gleiche wie flo.nummer[3] oder?
|
NEIN, das stimmt so nicht.
der Ausdruck
machr überhaupt keinen Sinn - es sei denn, du willst ein völlig willkürliches Verhalten.
was du meinst, ist vermutlich folgendes:
Code: | *(flo.nummer + 3 * sizeof(ARRAY_TYPE) ) |
das ist dann nämlich genau die Bedeutung des operator[]
viele Grüße
Felix _________________ StGB §§ 328 Abs. 2 Pkt 3:
Mit Freiheitsstrafe bis zu fünf Jahren oder mit Geldstrafe wird bestraft, wer eine nukleare Explosion verursacht. |
|
Nach oben |
|
|
|