Seite 1 von 1

void* oder unsigned int* ?

Verfasst: Do Mai 14, 2009 8:05 pm
von Dirty Oerti
Tag :)

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* ?

Re: void* oder unsigned int* ?

Verfasst: Do Mai 14, 2009 8:08 pm
von cloidnerux
Hängt doch davon ab was sie beinhalten.
Aber ich neheme an es ist für deinen Kernel.
Ich glaube void* ist standart und void* ist besser, nicht zuletzt wegen der kürzeren schreibweise ;)

Re: void* oder unsigned int* ?

Verfasst: Do Mai 14, 2009 8:39 pm
von fat-lobyte
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* ?
Also unsigned int* für reinen Speicher wäre unlogisch. Wohl eher unsigned char*, da kannst du byteweise durchiterieren. Aber...
cloidnerux hat geschrieben:Hängt doch davon ab was sie beinhalten.
Genau.

Deswegen Frage ich, wieso muss es void* oder unsigned int* sein? Wieso kann es nicht DerDatentypDenDuBrauchst* sein?
Die Geschichte mit den void* Zeigern ist ziemlich gefährlich, und eine der Hauptgründe wieso C als nicht "typsicher genug" gilt.

Re: void* oder unsigned int* ?

Verfasst: Do Mai 14, 2009 9:03 pm
von Dirty Oerti
fat-lobyte hat geschrieben:Deswegen Frage ich, wieso muss es void* oder unsigned int* sein? Wieso kann es nicht DerDatentypDenDuBrauchst* sein?
Es ist (wie cloidnerux schon erkannt hat) für meinen Kernel.
Das Problem ist:
Ich weiß nicht, welchen Datentyp ich brauche.
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?
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.
Erzähl...? *Die Geschichte hören möchte*

Re: void* oder unsigned int* ?

Verfasst: Do Mai 14, 2009 10:05 pm
von Xin
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?
Nimm ein Menory-Handle, dass Du intern als Union verbrätst.
Dirty Oerti hat geschrieben:
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.
Erzähl...? *Die Geschichte hören möchte*
;-)
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.

Re: void* oder unsigned int* ?

Verfasst: Do Mai 14, 2009 10:30 pm
von Dirty Oerti
Xin hat geschrieben:Nimm ein Menory-Handle, dass Du intern als Union verbrätst.
Hm, verstehe nicht so ganz, was du meinst.

Code: Alles auswählen

union address {
  unsigned int* INT;
  unsigned char* CHAR;
  unsigned short* SHORT;
};
Oder wie?
Dabei fällt mir auf: Unions fehlen in unserem Tutorial noch...
Xin 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.
Ja... ich versuche das ganz nur möglichst.... "richtig" zu schreiben :)

Re: void* oder unsigned int* ?

Verfasst: Fr Mai 15, 2009 8:12 am
von Xin
Dirty Oerti hat geschrieben:
Xin hat geschrieben:Nimm ein Menory-Handle, dass Du intern als Union verbrätst.
Hm, verstehe nicht so ganz, was du meinst.

Code: Alles auswählen

union address {
  unsigned int* INT;
  unsigned char* CHAR;
  unsigned short* SHORT;
};
Oder wie?
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.

Mal so grob und ungetestet aus dem Kopf:

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
}
Dirty Oerti hat geschrieben:Dabei fällt mir auf: Unions fehlen in unserem Tutorial noch...
Hast Du es schon in die Todo-Liste geschrieben, hier findet es schließlich niemand wieder. ^^
Ich hab's eingetragen.
Dirty Oerti hat geschrieben:
Xin 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.
Ja... ich versuche das ganz nur möglichst.... "richtig" zu schreiben :)
Kann ich mir schon vorstellen.

Info am Rande: Ich versuche mich Sonntag an GIT.

Re: void* oder unsigned int* ?

Verfasst: Fr Mai 15, 2009 12:54 pm
von Dirty Oerti
Hm...
das sieht gut aus :)
(eine intelligente "clear" Funktion hatte ich mir für die neue Version des Kernels auch schon überlegt, diese ist aber schneller)

Eine Frage:

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

address AD;
AD.INT = (unsigned int*) POSITION;
AD.CHAR++;
Wie sieht's jetzt mit AD.INT aus?
Wo zeigt das hin?


Mal eine Frage am Rande... kann ich mit unsigned char* Pointern die vollen 4GB (auf 32 Bit) ansprechen...?
Eigntl schon...oder?
Xin hat geschrieben:Info am Rande: Ich versuche mich Sonntag an GIT.
Gut :)

Re: void* oder unsigned int* ?

Verfasst: Fr Mai 15, 2009 2:06 pm
von Xin
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?
Der zeigt nun ein Byte weiter. Es sind ja alles nur Zeiger.
Ein char Zeiger wird mit ++ um 1 Byte verschoben, ein int Zeiger um 4 Byte.
Eben immer

Code: Alles auswählen

Zeiger += sizeof( Zeiger )
Je nach Prozessor könntest Du damit Alignment-Schwierigkeiten bekommen, was aber heutzutage eher unwahrscheinlich ist.
Da Du ein x86-OS schreibst... solltest Du keine Probleme erwarten.