
Nochwas (bin heute wissbegierig):
Ich hab Speicherbereiche, die ich immer wieder an versch. Funktionen übergeben muss.
Übergebe ich die Adresse besser in einem void* oder in einem unsigned int* ?
Also unsigned int* für reinen Speicher wäre unlogisch. Wohl eher unsigned char*, da kannst du byteweise durchiterieren. Aber...Dirty Oerti hat geschrieben:Ich hab Speicherbereiche, die ich immer wieder an versch. Funktionen übergeben muss.
Übergebe ich die Adresse besser in einem void* oder in einem unsigned int* ?
Genau.cloidnerux hat geschrieben:Hängt doch davon ab was sie beinhalten.
Es ist (wie cloidnerux schon erkannt hat) für meinen Kernel.fat-lobyte hat geschrieben:Deswegen Frage ich, wieso muss es void* oder unsigned int* sein? Wieso kann es nicht DerDatentypDenDuBrauchst* sein?
Erzähl...? *Die Geschichte hören möchte*fat-lobyte hat geschrieben:Die Geschichte mit den void* Zeigern ist ziemlich gefährlich, und eine der Hauptgründe wieso C als nicht "typsicher genug" gilt.
Nimm ein Menory-Handle, dass Du intern als Union verbrätst.Dirty Oerti hat geschrieben:Wie würdest du 4KB (bzw variabel) große Speicherbereiche ansprechen.
Die Entscheidung brauche ich für eine Funktion, die den entsprechenden Speicher null setzt.
Also: Die Funktion bekommt eine Adresse. Und dazu noch einen Wert (der angibt, wie oft sie schreiben soll). Und dann beschreibt die Funktion den Speicherbereich in gewissen Schritten:
memset8 -> ein Byte Schritte (notwendig, um z.B. einen 3 Byte großen Bereich zu beschreiben)
memset16 -> zwei Byte auf einmal schreiben
memset32 -> 4 Byte auf einmal schreiben
(evtl) memset64 -> 8 Byte auf einmal schreiben
Oder soll ich für memset8 char*, für memset16 short* etc nehmen?
Dirty Oerti hat geschrieben:Erzähl...? *Die Geschichte hören möchte*fat-lobyte hat geschrieben:Die Geschichte mit den void* Zeigern ist ziemlich gefährlich, und eine der Hauptgründe wieso C als nicht "typsicher genug" gilt.
Hm, verstehe nicht so ganz, was du meinst.Xin hat geschrieben:Nimm ein Menory-Handle, dass Du intern als Union verbrätst.
Code: Alles auswählen
union address {
unsigned int* INT;
unsigned char* CHAR;
unsigned short* SHORT;
};
Ja... ich versuche das ganz nur möglichst.... "richtig" zu schreibenXin hat geschrieben:Du schreibst ein OS... Typsicherheit ist was für Anwendungen... bei einem OS ist es wichtig, aber das OS darf sich darüber hinwegsetzen. Von daher kannst Du eh nach belieben casten.
Genau. Intern reichst Du eine "address" rum. Damit weißt Du für Dich, dass das eine Adresse auf einen Speicherblock ist, die Du in Deinem OS nach belieben verwalten darfst. Als OS weißt Du ja nicht, was da letztendlich drin ist. Möchtest Du Bytegenau zugreifen kannst Du das, darf es etwas schneller sein, geht das auch.Dirty Oerti hat geschrieben:Hm, verstehe nicht so ganz, was du meinst.Xin hat geschrieben:Nimm ein Menory-Handle, dass Du intern als Union verbrätst.
Oder wie?Code: Alles auswählen
union address { unsigned int* INT; unsigned char* CHAR; unsigned short* SHORT; };
Code: Alles auswählen
struct MemBlock
{
address Address;
unsigned int Size;
}
void clear( MemBlock memblock )
{
int size = memblock.Size >> 2;
while( size-- ) memblock.Address.INT[ size ] = 0; // 32 Bit Schritte
int size = memblock.Size - (memBlock.Size & 3)
while( size < memBlock.Size ) memblock.Address.CHAR[ size ] = 0; // Restgröße in 8 Bit Schritten
}
Hast Du es schon in die Todo-Liste geschrieben, hier findet es schließlich niemand wieder. ^^Dirty Oerti hat geschrieben:Dabei fällt mir auf: Unions fehlen in unserem Tutorial noch...
Kann ich mir schon vorstellen.Dirty Oerti hat geschrieben:Ja... ich versuche das ganz nur möglichst.... "richtig" zu schreibenXin hat geschrieben:Du schreibst ein OS... Typsicherheit ist was für Anwendungen... bei einem OS ist es wichtig, aber das OS darf sich darüber hinwegsetzen. Von daher kannst Du eh nach belieben casten.
Code: Alles auswählen
address AD;
AD.INT = (unsigned int*) POSITION;
AD.CHAR++;
GutXin hat geschrieben:Info am Rande: Ich versuche mich Sonntag an GIT.
Der zeigt nun ein Byte weiter. Es sind ja alles nur Zeiger.Dirty Oerti hat geschrieben:Ich hab mein union address (wie oben gepostet).
Dem weiße ich nun eine Adresse zu.
Nun nehme ich den Byte-Wert, und gehe damit einen Schritt weiter.
Was steht jetzt im INT-Wert?
Code: Alles auswählen
Zeiger += sizeof( Zeiger )