Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Bonsai

Frischling

  • »Bonsai« ist der Autor dieses Themas

Beiträge: 37

Wohnort: Bayreuth

  • Private Nachricht senden

1

28.04.2005, 18:01

Frage zu Datentypgrösse und Adressierung

Hi!

Ich habe da irgendwie glaube ich ein Problem,ich habe mir die Datentypen Grössen in Bytes ausgeben lassen,und stelle fest das bei
Zeigern egal ob (char*, double*) immer konstant 4 Bytes Grösse
angegeben wird.

Außerdem ist es etwas mystisch,daß die Adressierung aller Datentypen
besonders von char,short sowie auch double immer 4Byte auseinanderliegen.Liegt hier der Fehler bei mir oder ist es bei euch auch so.

mfg Bonsai

PD

unregistriert

2

28.04.2005, 18:39

Also 4Byte größe für zeiger ist verständlich ^^ Weil ein zeiger ist ein typ für sich und hat nunmal die größe die er braucht um ne Adresse zu speichern (und adresse ist adresse, egal was sich dort befindet).

Das mit dem auseinander liegen versteh ich so das du ein array erstellt hast und dir die adressen zweier aufeinander folgender Glieder hast anzeigen lassen? Wenn ja sollten sie afaik je nach Typ des zeigers (bzw. des arrays) auseinander liegen. Kann aber auch sein das dein Compiler da irgendwie irgendwelche optimierungen vornimmt *schulter zuck*

Bonsai

Frischling

  • »Bonsai« ist der Autor dieses Themas

Beiträge: 37

Wohnort: Bayreuth

  • Private Nachricht senden

3

28.04.2005, 18:56

Hi PD

Zuerst einmal danke für deine Antwort.Das mit den Zeigern gut würde ich
auch aktzeptieren,bis auf den Zeiger (double*) der doch normalerweise
8Byte braucht.

Das mit den auseinanderliegen,damit meine ich auf dem Stack,ich init mehrere Datentypen hintereinander,diese werden dann doch in umgekehrter Reihenfolge auf den Stack abgelegt,d.h was zuletzt init wurde liegt ganz oben.Aus diesem Grunde müßte doch eigentlich zwischen den einzelnen Datentypen (je nach Byte Grösse) diese dann auch verschieden auseinanderliegen.Oder nicht.Verstehe ich hier wohl etwas falsch.

mfg Bonsai :)

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

4

28.04.2005, 19:39

Die Adressen sind alle gleich lang und das mit den 4 Byte kann wirklich mit einer Optimierung zusammenhängen(meiner Meinung nach)

Bonsai

Frischling

  • »Bonsai« ist der Autor dieses Themas

Beiträge: 37

Wohnort: Bayreuth

  • Private Nachricht senden

5

28.04.2005, 19:51

Naja,ich gebe es ja nicht gerne zu aber das ist beängstigend,aber ich
denke mal da kann man nichts machen.Ich hoffe bloß nicht das es da
irgendwelche Schwierigkeiten gibt wenn ich ein Programm auf meinen
System entwickelt habe,und es auf anderen Plattformen laufen lassen
möchte.Aber trotzdem danke,für eure schnellen Antworten.

mfg Bonsai :huhu:

PD

unregistriert

6

28.04.2005, 20:29

sollte keine größeren probleme geben... aber ich bin sicher das, wenn es eine Optimierung ist, einen weg gibt sie abzuschalten. Frag am besten mal in einer Community deines Compilers ;) Gibt bestimmt irgendwo en Forum oder Support oder so.

Und ne Adresse ist, wie bereits gesagt, immer gleich lang. Nur das was sich dort befindet hat ne andere größe (länge).
Beispiel:
Adresse: xyz
Typ: char
Wenn du über den Zeiger auf xyz zugreifst wird (normal) 1 Byte gelesen

Adresse abc
Typ: double
Die adresse (abc) ist genau so lang wie xyz, allerdings wird ab abc 8 Byte gelesen (weils eben en double ist)

Da jeder zeiger nur ne Adresse speichert brauchen die Zeiger selbst keine unterschiedliche Größe

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

28.04.2005, 20:35

vermutlich handelt es sich um eine optimierung, so wie z.b. auch das byte alignment bei structs...

Bonsai

Frischling

  • »Bonsai« ist der Autor dieses Themas

Beiträge: 37

Wohnort: Bayreuth

  • Private Nachricht senden

8

28.04.2005, 21:09

Oke,also wenn es bei euch nicht der Fall ist,dann schätze ich habe ich ein
ernstzunehmendes Problem.Warum mich das ganze so beunruhigt,ist,ich
arbeite momentan an Zeigern welche ich auf eine andere Speicheradresse zeigen lassen möchte.Dies versuche ich mit Addition oder auch Subtraktion zu erreichen.

void main()
{
typedef unsigned char UCHAR;

//Initialisierungen
UCHAR cWert0 = 52;
UCHAR cWert1 = 125;
UCHAR *pcZeiger;
UCHAR cWert2 = 255;

//In pcZeiger die Adresse von cWert1 speichern
pcZeiger = &cWert1;

Oke jetzt kommt die Ausgabe ohne Addition:
Adresse von cWert0 = 12ff7c
Adresse von cWert1 = 12ff78
Adresse von pcZeiger = 12ff78
Adresse von cWert2 = 12ff70

Wert von cWert0 = 52
Wert von cWert1 = 125
Wert von pcZeiger = 52
Wert von cWert2 = 255

Jetzt verschiebe ich den Zeiger um 1*sizeof(UCHAR)

//Versuch pcZeiger auf den cWert0 zeigen zulassen
//pcZeiger += 1 (gleiche 1 * sizeof(UCHAR) wäre normalerweise 1 Byte
//Verschiebung


pcZeiger += 1;

Oke jetzt kommt wie gesagt mein Problem:
Adresse von cWert0 = 12ff7c
Adresse von cWert1 = 12ff78
Adresse von pcZeiger = 12ff79
Adresse von cWert2 = 12ff70

Wert von cWert0 = 52
Wert von cWert1 = 125
Wert von pcZeiger = 204
Wert von cWert2 = 255

Ich muß jetzt wie gesagt normalerweise um auf cWert0 Speicheradresse zu kommen, den pcZeiger += 4 verschieben.Und ich denke das ist beunruhigend,gerade dann wenn man dies auf einem anderen System laufen läßt.Wo wie du PD schon sagtest die Länge der Adresse immer gleich lang wäre.
Aber ich werde mal eueren Rat folgen,und mal in einer Community für meinen Compiler mal nachhaken,vielleicht hat da jemand,einen Tip.
Aber nochmals an alle Danke.

mfg Bonsai :huhu:

9

28.04.2005, 21:35

da stimmt jetzt aber was net:

Adresse von cWert0 = 12ff7c
Adresse von cWert1 = 12ff78
Adresse von pcZeiger = 12ff78
Adresse von cWert2 = 12ff70

Wert von cWert0 = 52
Wert von cWert1 = 125
Wert von pcZeiger = 52
Wert von cWert2 = 255

wenn das deine richtigen ausgaben sind hast du ein echtes problem:
du hast pcZeiger auf &cWert1 gesetzt bei der ausgabe kriegst du
aber den wert von cWert0 näml. 52.
aber ich denke mal das ist ein schreibfehler oder?
---
ich sehe hier eigentl. kein prob. das wird einfach an der optimierung deines
compilers liegen und ist damit kein problem weil das dann auf jedem
rechner auf dem du das prog startest genauso aussehen wird.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

28.04.2005, 21:37

ich versteh dein problem auch nicht ganz.
wenn dus auf anderen systemen laufen lassen willst, musst dus sowieso neu kompillieren!?
und das is nur der günstigste fall...

Werbeanzeige