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

PD

unregistriert

21

29.04.2005, 14:36

Das du keine andere Variable dazwischen hast ist so nicht ganz richtig ;) Du hast den Pointer und der ist 4Byte groß (glaub ich) +g* Wenn das was weigo gesagt hat stimmt dann versuch mal den Pointer als erstes zu deklarieren ^^

Aber abgesehen davon... ich bin der ansicht außerhalb eines Arrays sollte man sich NIE darauf verlassen was für nen Speicher ne Variable hat. Vorallem weil da der Sinn verloren geht. Also wenn du unbedingt 3 char Vars brauchst die direkt hintereinander liegen: Packs aufn heap (new char[3]) oder nimm dir'n Array ^^ Ist in jedem fall sicherer...

helium

Treue Seele

Beiträge: 180

Wohnort: NRW, Burscheid (nahe Köln)

  • Private Nachricht senden

22

29.04.2005, 16:48

Zitat

Adresse von cWert1 = 12ff78
Adresse von pcZeiger = 12ff78


MÖÖÖÖP!!!
Du scheinst Zeiger nciht im geringsten verstanden zu haben.
Die adresse von cWert1 und von pcZeiger kann niemals die selbe Sein. Ein Zeiger ist ein eigenständiges Ding, das eine eigene Adresse haben muss, die niemals der einer anderen Variable entsprechen wird.


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
int foo = 42;
int * bar = &foo;

cout
   << "Wert von foo: " << foo << '\n'
   << "Wert von bar: " << bar << '\n'
   << "Adresse von foo: " << &foo << '\n'
   << "Adresse von bar: " << &bar << '\n'
   << "Wert auf den bar verweist: " << *bar << '\n'

in dem beispiel wird immer gelten: &foo != &bar. In deinem Beispiel wird immer gelten: &cWert1 != &pcZeiger.

Zitat


Du hast vollkommen recht,mit dem Memory Alignment innerhalb einer
Klasse oder von Strukturen,da stimmt das so wie du es gesagt hast.
Auch kann ich hier mit Pragma Pack(1) das Alignment ausschalten.
Das selbe hat 0x00000023 gestern auch gesagt.
Nur habe ich das Prob. das auf der Lokalen Ebene drei UCHAR Datentypen
trotzdem einen 4Byte Abstand zueinander haben,wo ich keinen anderen
Datentyp (also int,oder short Wert) dazwischen oder davor oder dannach
habe.

Die "lokale Ebene", wie du sie bezeichnest ist einfach der Stack. Und auf dem Stack werden nicht nur diese Variablen abgelegt, sondern es werden auch sämmtliche Variablen, die du an Funktionen übergibts darauf abgelegt, etc.
Why is 6 afraid of 7?
Because 7 8 9

23

29.04.2005, 16:52

ich denke das die aussage auf die du dich beziehst einfach ein fehler in
der ausgabe war und er schon den wert und nicht die adresse
von pcZeiger meinte.

Sicaine

unregistriert

24

29.04.2005, 22:17

Hm kann mir mal jemand auch bitte erkären wieso du deinen Zeiger um x werte erhöhst? Dieses "mit Zeigeraddition-subtraktion" geht nur bei Arrays. Bzw. is nur bei Arrays "sicher"

Bonsai

Frischling

  • »Bonsai« ist der Autor dieses Themas

Beiträge: 37

Wohnort: Bayreuth

  • Private Nachricht senden

25

30.04.2005, 17:03

Hallo zusammen
Entschuldigt bitte das ich nicht schon eher geantwortet habe,aber hatte
gestern Spätschicht gehabt und heute Frühschicht.

Zu PD:
Also ich habe den Rat von Weigo beherzigt und bei einem zweite Beispiel,
den pcZeiger aus meinen Programm entfernt,sodaß ich nur noch meine drei UCHAR Werte 0,1,2 hatte.Dabei lagen die trotzdem noch 4 Byte auseinander.

Zu helium:
Tut mir leid.Ich glaube da habe ich mich falsch ausgedrückt.Natürlich ist
mit der Adresse von pcZeiger die Adresse gemeint auf die er zeigt,und nicht seine eigene Adresse.War mein Fehler.
Zum Stack,da verstehe ich nur nicht warum ich nur die Angleichung innerhalb einer Klasse oder Struktur mit Pragma Pack(1) deaktivieren kann und nicht innerhalb von Funktionen.Dieses müsste doch für interen Stack Angleichungen gelten,oder nicht.

Zu Sicaine:
Das ist wie bereits oben schon erwähnt,ein wirklich dummes Beispiel gewesen,nennen wir es einfach einen Test.Tatsächlich versuchen ich in einen Array im Heap den Zeiger weiterzuschieben.Zwecks Primary_Buffer
und Secondary_Buffer,mittels memcpy(.....).Ich versuche Linie durch Linie
durchlaufen zulassen und zu kopieren,aber da hatte ich eine Fehler drin deshalb mein Test,auf dem ich dann das mit den auseinanderliegenden
4 Bytes gesehen habe.Und das hat mich etwas verwirrt.

Ich sagte ja schon weiter oben,das dies alles noch etwas Neuland für mich ist,also bitte peitscht mich nicht gleich aus,wenn ich mal einen Fehler mache,aber ich versuche mich ja in die Thematik reinzuvertiefen und will das ganze Lernen weil es mich fasziniert.Aber an alle Danke für eure Antworten.

mfg Bonsai 8)

helium

Treue Seele

Beiträge: 180

Wohnort: NRW, Burscheid (nahe Köln)

  • Private Nachricht senden

26

01.05.2005, 18:42

Zitat


Zum Stack,da verstehe ich nur nicht warum ich nur die Angleichung innerhalb einer Klasse oder Struktur mit Pragma Pack(1) deaktivieren kann und nicht innerhalb von Funktionen.Dieses müsste doch für interen Stack Angleichungen gelten,oder nicht.

Bei Strukturen/Klassen macht es teilweise Sinn:
Z.B: um kompatibel mit einer Funktion zu sein, die von einem bestimmten Compiler erstellt wurde, der ein anders alignment hat, als der, mit dem man gerade arbeitet. Früher wurde sowas auch gerne genutzt, um große Teile von proprietären Formaten mit einem Schlag zu lesen. (Heute verwendet man XML.)
Wenn die Klasse viele Instanzvariablen besitzt und man dann verdammt viele davon in ein Datenfeld packt könnte man so auch (auf Kosten der Geschwindigkeit) ein wenig Platz sparen.

Beim Stack bringt das absolut gar nichts, außer, dass dein Programm langsamer wird. Und sein Programm bekommt man auch auf andere Weise langsam, wenn man will.
Why is 6 afraid of 7?
Because 7 8 9

Bonsai

Frischling

  • »Bonsai« ist der Autor dieses Themas

Beiträge: 37

Wohnort: Bayreuth

  • Private Nachricht senden

27

02.05.2005, 05:12

Hi Helium

Danke für die ausführliche Erklärung.Das hilft mir das ganze etwas
besser zu verstehen.

Kennt jemand zufällig ein paar gute Quellen zu den Vorgängen und
Einteilungen für die verschiedenen Codebereiche (Heap,Stack,Globaler
Namensbereich, sowie Register)wo kann man sich da eventuell etwas
schlauer machen.

mfg Bonsai :)

Werbeanzeige