JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.phpMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Zeiger Frage(Problem)
Gehe zu Seite Zurück  1, 2
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Fallen
JLI MVP
JLI MVP


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

BeitragVerfasst am: 05.01.2004, 11:58    Titel: Antworten mit Zitat

Komisch unser Proz. Progg Prof. sagte das dies hier geht

Code:
*(flo.nummer + 3)


Da die Zeigerarithmetik das gut unterscheiden kann.
In einigen Büchern habe ich das auch schon so gesehen.

Was also stimmt nun ?
_________________
"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
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 05.01.2004, 12:02    Titel: Antworten mit Zitat

Hallo,

ich wüßte nicht, warum das nicht gehen soll. Der Compiler merkt sogar, ob es ein Byte-,Int-,short- oder sonstwas Zeiger ist und erhöht die Adresse entsprechend um 1,2,4 Byte.

Ich teste das gerade mal...

Es sollte gehen:

Code:

#include <iostream>

int f1[4] = { 1,2,3,4 };
char c1[4] = { 'a','b','c','d' };


int main(int argc, char* argv[])
{
   char* pc = c1;

   int* pi = f1;

   using std::cout;

   cout << *(pi+0) << " " << *(pc+0) << "\n";
   cout << *(pi+1) << " " << *(pc+1) << "\n";
   cout << *(pi+2) << " " << *(pc+2) << "\n";
   cout << *(pi+3) << " " << *(pc+3) << "\n";
   
   return 0;
}



Christian
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: 05.01.2004, 13:14    Titel: Antworten mit Zitat

alos bisher hab ich es nur gesehen, dass man für sowas so schreibt:

Code:

 cout << *(pi+sizeof(int)*2) << " " << *(pc+sizeof(char)*2) << "\n";


klingt ja eigentlich auch logischer.. ich wusste bisher nicht, dass der compiler das automatisch erkennt...
[/code]
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: 05.01.2004, 13:18    Titel: Antworten mit Zitat

Ich finde es nicht logisch. Das Problem ist , dass

*(pi+sizeof(int)*2);

zu groß ist. Das wäre dann pi[8].

Christian
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: 05.01.2004, 13:22    Titel: Antworten mit Zitat

Na doch... logischer klingt das was xardias schreibt schon. Eben nur von der normalen Arithmetik gesehen und nicht von der Zeigerarithmetik.
_________________
"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
HotAcid
Super JLI'ler


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

BeitragVerfasst am: 05.01.2004, 15:52    Titel: Antworten mit Zitat

*(pi + sizeof(int)*2) ist eben *nicht* pi[8].

pi ist eine Adresse.

pi++; zählt diese Adresse um ein Byte hoch.

(pi = pi + 4) <=> (pi = pi + sizeof(int) ) <=> (pi = pi + 1*sizeof(int) )

zählt die Adresse um vierByte hoch.

* Beispiel*

Angenommen, wir haben ein Array int arr[10] mit 9 Elementen.
Sei die Anfangsadresse (die Adresse, auf die arr zeigt) 100.

Da ein int zwei Byte benötigt, belegt das gesamte Array 40 Byte, von den Speicherstellen 100 bis 139.

das erste Element des Arrays - also arr[0] - liegt nun im Speicher auf Position 100 - 103, das zweite Element folgt dann auf Position 104-107 etc...

*(arr + 3 * sizeof(int) ) = *(arr + 3*4) = *(arr + 12) = *(100 + 12) = *(112) zeigt dann auf das vierte Element (an Position 112-115, wenn man obige Rechnung weitermacht). Und wie jeder weiß, erfolgt der Zugriff auf das vierte Element des Arrays mit der Schreibweise arr[3].

*(arr + 3) = *(100 + 3) = *(103) wenn man diesen Ausdruck als int interpretieren möchte, bekommt man ein int, dessen Bytes aus einem Byte von arr[0] und drei Bytes von arr[1] bestehen.

Es kann natürlich sein, dass einige Compiler das inzwischen anders interpretieren, aber wie sagte mit vor kurzem hier jemand: "Wir möchten doch alle portablen Code erzeugen". Und aus technischer Sicht ist und bleibt es falsch.

viele Grüße
Felix

[EDIT dummen Fehler beseitigt - ein int hat schließlich 4 Bytes Embarassed
_________________
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 Zurück  1, 2
Seite 2 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