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

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

11

26.05.2006, 08:56

Hehe,

ich wüsste auf Anhieb auch nicht, wozu man das genau brauchen kann.

Aber, man sollte schon verstehen, was da passiert (auch wenn es hinter einem Macro verborgen ist).

Wo ist denn der Unterschied zwischen den folgenden Konstrukten?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
#include <tchar.h>

typedef unsigned int DWORD;

struct Struct
{
  int _a, _b, _c;
};

int _main (int argc, _TCHAR* argv[])
{
  Struct* pStruct1 = 0;
  Struct* pStruct2 = 0;
  Struct* pStruct3 = 0;

  pStruct1 += 1;
  pStruct2 = (Struct*)((DWORD)pStruct2 + (DWORD)1);
  pStruct3 = (Struct*)((DWORD)pStruct3 + (DWORD)(3 * sizeof (int)));

  printf ("%p %p %p\n", pStruct1, pStruct2, pStruct3);

  getchar ();

  return 0;
}

ext

Treue Seele

  • Private Nachricht senden

12

26.05.2006, 11:22

Erwartest du bei dem Programm ernsthaft ne sinnvolle Ausgabe?

Lemming

Alter Hase

Beiträge: 550

Beruf: Schüler

  • Private Nachricht senden

13

26.05.2006, 11:51

naja der oberste dürfte nen cast error hervorrufen, aber die unteren beiden sollten keine allzu großen schwirigkeiten machen, auch wenn mans schöner schreiben könnte. das mittlere würde halt nur einen byte weiter gehen, während das untere um die größe von drei ints weiter geht... wobei ich sowas vll nicht unbedingt mit sowas undefiniertem, wie int machen würde ^^
aber ansich ist das ne sache, die man schon mal braucht.. zB beim auslesen von dateien ausm speicher... da haste dann deinen cursor und bei jeder gelesen daten struktur, wird der um deren größe erhöht, und das weiter auslesen geschieht dann aus einem pointer, der um den cursor wert vergrößert wird... also selten kommt das eigentlich nicht vor...
Es gibt Probleme, die kann man nicht lösen.
Für alles andere gibt es C++...

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

14

26.05.2006, 18:34

Tja,

das gibt eine sinvolle Ausgabe (nämlich drei Zeiger). Sollte das "+=" nicht compilieren, nimmt man eben ein "++"... macht das gleiche. :)

Der Trick ist eben, das der erste und dritte Fall das gleiche Ergebnis haben sollten, falls der Compiler nicht was schreckliches beim struct-Padding anstellt.

Das passiert auch, wenn man das korrigierte Programm laufen lässt.

Gruss,
Rainer

helium

Treue Seele

Beiträge: 180

Wohnort: NRW, Burscheid (nahe Köln)

  • Private Nachricht senden

15

26.05.2006, 19:27

Ich kenne MakePtr :)

Früher, als man noch für 16-Bit DOS-Programmiert hat gab es Far- und Near-pointer. Far-Pointer bestanden aus einem Segment- und einem Offset-Anteil (Near nur aus einem Offset). Mit MakePtr konnte man dann Segment und Offset angeben und sich so einen Zeiger basteln, der auf eine bestimmte Adresse verweise. Denn unter DOS konnte man an bestimmtenn adressen bestimmte Dinge erfahren. So wurde z.B. der Bildschirmspeicher dort gespiegelt und man konnte oberhalb vom Segment 0xB800 was in den Speicher schreiben un so direkt den Bildschirm manipulieren (im Grafikmodus mit 320x200 Pixel bei 8bpp war es dann 0xA000), etc. Es gab adressen, an denen sich ein Timer befand und noch vieles mehr.

Allerdings war das MakePtr IMO anders aufgebaut, als das hier gepostete.
Why is 6 afraid of 7?
Because 7 8 9

16

29.05.2006, 20:34

.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »FOGX« (15.09.2010, 16:47)


Werbeanzeige