Anonym
8. April 2002 um 18:24
1
Hallo,
Gibt es in C eine Möglichkeit eine Variable ueber einen bestimmten Speicherbereich zu legen ?
Wer sich jetzt fragt „Wofür ?“, dem sei hier mal ein Stück Pascal-Code gegönnt:
Var
X : Array[0…1999] of Word absolute $b800:blush:0;
Bin fuer jede Antwort dankbar.
Lars
Hallo Lars,
Gibt es in C eine Möglichkeit eine Variable ueber einen
bestimmten Speicherbereich zu legen ?
Wer sich jetzt fragt „Wofür ?“, dem sei hier mal ein Stück
Pascal-Code gegönnt:
Var
X : Array[0…1999] of Word absolute $b800:blush:0;
z.B.
int *Array[2000] = {(int *) 0x800}
*Array[3]=3;
oder so etwas:
(*(int *) (0x800)) = 5;
eine andere Variante ist die Variable in ein eigenes Modul zu packen und dann die gewünschte Adresse mit dem Linker festzulegen, ist aber etwas komplizierter.
MfG Peter(TOO)
Anonym
10. April 2002 um 00:11
3
Hallo,
[…]
Wer sich jetzt fragt „Wofür ?“, dem sei hier mal ein Stück
Pascal-Code gegönnt:
Var
X : Array[0…1999] of Word absolute $b800:blush:0;
Ich frage mich immmer noch, wofür?
Gruß
Fritze
Hi Lars.
Gibt es in C eine Möglichkeit eine Variable ueber einen
bestimmten Speicherbereich zu legen ?
Es gibt eine Möglichkeit, aber nur für DOS, da unter Windows der Speicher etwas anders gehandhabt wird.
In DOS.H sind folgende Makros definiert:
#define MK\_FP(seg,ofs) ((void \_seg \*)(seg) + (void near \*)(ofs))
#define FP\_SEG(fp) ((unsigned)(void \_seg \*)(void far \*)(fp))
#define FP\_OFF(fp) ((unsigned)(fp))
Mit MK_FP kannst du einen beliebigen Far Pointer erzeugen, mit FP_SEG und FP_OFF kannst du die Segment- und Offset-Adresse rauskriegen.
Um dein Beispiel zu nehmen:
Var X : Array[0…1999] of Word absolute $b800:blush:0;
WORD \*x = MK\_FP(0xB800, 0x0);
Dann könntest du x als Array behandeln ( x[0] bis x[1999] und darüber hinaus
Ich würde aber eine andere Definition für einen Far Pointer verwenden, die ohne den _seg Modifier auskommt:
#define MK\_FP(seg,ofs)
((void far \*)((((long)(seg) & 0xFFFF)
(Ohne Gewähr, ich habs aus dem Kopf einfach hingeschrieben...)
cu
Klaus
Autsch, da hab ich doch glatt nen Anfängerfehler gemacht…
#define MK\_FP(seg,ofs)
((void far \*)((((long)(seg) & 0xFFFF) && 0xFFFF)))
ist falsch, da muss & statt && stehen:
#define MK\_FP(seg,ofs)
((void far \*)((((long)(seg) & 0xFFFF) & 0xFFFF)))