JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=2ee4a95f7013097193c6c2d361392990Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Zeiger Frage(Problem)
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Florian
Super JLI'ler


Alter: 36
Anmeldedatum: 20.06.2003
Beiträge: 302

Medaillen: Keine

BeitragVerfasst am: 04.01.2004, 17:40    Titel: Zeiger Frage(Problem) Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
Hasenfuß
Senior JLI'ler


Alter: 37
Anmeldedatum: 20.08.2002
Beiträge: 291

Medaillen: Keine

BeitragVerfasst am: 04.01.2004, 17:49    Titel: Re: Zeiger Frage(Problem) Antworten mit Zitat

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 Confused 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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 04.01.2004, 17:49    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Hasenfuß
Senior JLI'ler


Alter: 37
Anmeldedatum: 20.08.2002
Beiträge: 291

Medaillen: Keine

BeitragVerfasst am: 04.01.2004, 17:50    Titel: Antworten mit Zitat

Schneeeeeeeller:P
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 04.01.2004, 17:56    Titel: Antworten mit Zitat

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 Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
xardias
JLI Master


Alter: 38
Anmeldedatum: 28.12.2003
Beiträge: 804
Wohnort: Palo Alto, CA
Medaillen: Keine

BeitragVerfasst am: 04.01.2004, 18:25    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 04.01.2004, 18:27    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
MadMax82
Mini JLI'ler



Anmeldedatum: 31.12.2003
Beiträge: 9

Medaillen: Keine

BeitragVerfasst am: 04.01.2004, 19:06    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Florian
Super JLI'ler


Alter: 36
Anmeldedatum: 20.06.2003
Beiträge: 302

Medaillen: Keine

BeitragVerfasst am: 04.01.2004, 21:16    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
TheMillenium
Dark JLI'ler



Anmeldedatum: 21.07.2002
Beiträge: 1427
Wohnort: World
Medaillen: Keine

BeitragVerfasst am: 04.01.2004, 21:20    Titel: Antworten mit Zitat

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! Smile
_________________
The source of all power is in its destiny...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 04.01.2004, 21:21    Titel: Antworten mit Zitat

Jo, ist voll das Gleiche und in C fangen Arrays immer mit Index 0 an - Peace.

Christian Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
MadMax82
Mini JLI'ler



Anmeldedatum: 31.12.2003
Beiträge: 9

Medaillen: Keine

BeitragVerfasst am: 04.01.2004, 21:49    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Florian
Super JLI'ler


Alter: 36
Anmeldedatum: 20.06.2003
Beiträge: 302

Medaillen: Keine

BeitragVerfasst am: 04.01.2004, 21:58    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
MadMax82
Mini JLI'ler



Anmeldedatum: 31.12.2003
Beiträge: 9

Medaillen: Keine

BeitragVerfasst am: 04.01.2004, 22:16    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
HotAcid
Super JLI'ler


Alter: 43
Anmeldedatum: 04.08.2002
Beiträge: 372
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 05.01.2004, 10:49    Titel: Antworten mit Zitat

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
Code:
*(flo.nummer + 3)

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum