 |
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Fallen JLI MVP


Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 05.01.2004, 11:58 Titel: |
|
|
Komisch unser Proz. Progg Prof. sagte das dies hier geht
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 |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 05.01.2004, 12:02 Titel: |
|
|
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 |
|
 |
xardias JLI Master

Alter: 38 Anmeldedatum: 28.12.2003 Beiträge: 804 Wohnort: Palo Alto, CA Medaillen: Keine
|
Verfasst am: 05.01.2004, 13:14 Titel: |
|
|
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 |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 05.01.2004, 13:18 Titel: |
|
|
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 |
|
 |
Fallen JLI MVP


Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 05.01.2004, 13:22 Titel: |
|
|
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 |
|
 |
HotAcid Super JLI'ler

Alter: 43 Anmeldedatum: 04.08.2002 Beiträge: 372 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 05.01.2004, 15:52 Titel: |
|
|
*(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  _________________ 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 |
|
 |
|
|
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
|