Was macht folgendes Programm?
-
#include <windows.h> // hatte ich vorhin vergessen, sorry int main() { far; near; return 0; }
-
sieht für mich wie ein windows programm, das gehört hier nicht hin
thread verschoben ins winapi forum. WinAPI
-
Schau mal in deine windef.h.
-
Hallo!
Hab ich schon. Da steht nur:
#define far #define near
Aber was machen die Makros jetzt?
-
Siehst du doch: nix!
-
far und near waren zu DOS (und Win 3.x) Zeiten Typisierungen für Zeiger. Da DOS ein reines 16-Bit System war, das im Real-Mode arbeitete, konnte man mit einem Adressregister (Adress-Offset) halt nur 2^16=65536 Bytes (64KB) an Speicher auf einmal ansprechen. Da trotzdem mehr Speicher vorhanden war (alleine schon 512KB bzw. 640KB Hauptspeicher), teilte man den gesamten Speicher in sog. Segmente (zu jeweils 64KB). Allerdings waren diese Segmente nicht voneinander unabhängig, da diese den Speicher in 16 Byte Schritten referenzierten und somit überlappten. Also Segment 0 begann bei Speicheradresse 0 , Segment 1 bei 16, Segment 2 bei 32, usw. D.h., zB Byte 0..9 im Segment 2 ist derselbe Speicher wie Byte 16..25 im Segment 1
.
Solange man deshalb Speicher im aktuellen Segment ansprach, reichte es near-Zeiger (16 Bit, nur Adress-Offset) zu benutzen. Wollte man Speicher in einem anderen als dem aktuellen Segment ansprechen, musste man far-Zeiger (16+16 Bit, Segment+Adress-Offset) benutzen.Als der 286 auf den Markt kam, konnte man zum ersten Mal vom Real in den Protected Mode umschalten, beim 386 dann auch endlich in *echten* 32 Bit. Dort gibt es zwar weiterhin Segment und Offset Register, allerdings werden hier die Segment Register anders behandelt. Dadurch reicht es lediglich den Offset Anteil in Zeigern zu speichern, wobei 2^32=4GB an Speicher auf einaml angesprochen werden können.
Da Windows im Protected Mode arbeitet, ist heutzutage die Angabe von far bzw. near absolut überflüssig. Aus Gründen der Kompatibilität zu älteren Programmen gibt es zwar weiterhin Defines, diese machen aber wie schon gesagt nix.
-
Na, wenn das keine zufriedenstellende Antwort war...
-
Siehst du doch: nix!
und wer sagt das nicht noch irgendwo ein:
#ifdef far // bla bla #endif #ifdef near // bla bla #endif
steht
??? *kurz vor we noch mal blöd gefragt*
rocknix ///