Autor Thema: Struktur auf beliebigen Speicher anwenden  (Gelesen 55623 mal)

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #20 am: 28. January 2009, 20:11 »
Was bitmaster will, ist ein statisches Array auf dem Stack, dessen Größe zur Laufzeit bestimmt wird. Und das geht mit gcc (ist aber eine gcc-Erweiterung, wenn ich mich nicht irre).

void test(int x)
{
    int blubb[x];
    // ...
}
Hmm... das ist aber keine Struktur? Und bei mir wird die Variable x in der Fkt. test definiert. Ich habe aber das Gefühl, dass gcc die Variable x vorher herbei nimmt, sprich wenn sie den gewünschten Wert noch gar nicht hat. Denn es wird ganz zu beginn der Funktion test gemacht, obwohl ich der Variable x erst viel später einen Wert zuweise (wenn ich den assemblierten Code richtig deute).

bitmaster
In the Future everyone will need OS-64!!!

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #21 am: 28. January 2009, 20:16 »
Wie sieht dein Code denn konkret aus? Wenn die Variablendeklaration kommt, nachdem du x einen Wert zugewiesen hast, sollte das eigentlich funktionieren. Und ob es ein Array über ints oder irgendwelche structs ist, ist egal - sind beides nur Pointer. ;)
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #22 am: 28. January 2009, 20:36 »
So, ich war jetzt mal so frei und habe mir euren LOST-Code angesehen (bzw. wie heißt euer OS noch gleich tyndur oder so?). Da macht ihr folgendes:

struct multiboot_mmap * mmap;
    struct {
        dword start;
        dword end;
    } available_memory[16 + (3 * multiboot_info.mi_mods_count)];

Wie ihr da auf 16 und 3 kommt weiß ich zwar nicht, aber macht ihr da nicht das was ich auch haben will? Ich meine multiboot_info.mi_mods_count ist doch eine Variable die einen Wert zur Laufzeit zugewiesen bekommt, oder net? Von daher wäre das doch das was ich meinte, oder net?

@taljeth:

also ungefähr so sieht mein Code aus:

void test(void)
{
int counter = 0;

//blabla = Code der mit dieser Sache nichts zu tun hat

//eine do .. while schleife die den Wert von counter erhöht

//jo und hier würde ich dann gerne meine Struktur(en) mittels counter aufbauen
}
In the Future everyone will need OS-64!!!

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #23 am: 28. January 2009, 21:21 »
Was bitmaster will, ist ein statisches Array auf dem Stack, dessen Größe zur Laufzeit bestimmt wird. Und das geht mit gcc (ist aber eine gcc-Erweiterung, wenn ich mich nicht irre).
Das ist im C99 Standard.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #24 am: 28. January 2009, 21:39 »
Na ja OK vielen dank. Ich schaue mir das dann frühstens morgen an. Ich muss jetzt weg.

5:1 *hust* äh ich meine bitmaster  :-D
In the Future everyone will need OS-64!!!

Termite

  • Beiträge: 239
    • Profil anzeigen
Gespeichert
« Antwort #25 am: 29. January 2009, 10:00 »
Moin Moin

das was ihr sucht kann jeder c compiler und nennt sich malloc, realloc und free.

wenn sich zur laufzeit die grösse des arrays nicht verändert, sondern nur bestimmt werden muss, ist das der einfachste weg.

sollte sich zur laufzeit die grösse des Arrays verändern, ist eine Liste die beste wahl. wobei man auch bei einer liste um malloc und free nicht drum herumkommt. und ob nun einfach doppelt verkettet, oder doch lieber ein baum, oder doch lieber gleich nen wald ( ein baum aus bäumen) ist dann geschmakssache, bzw hängt von den anforderungen an die liste ab.

wobei die einfachste version für eine dynamisch wachsende Liste realloc, bzw. ein malloc mit memcopy und einen free der alten liste währe.

gruss

ps. und in C++ würde ich euch die STL ans herz legen. wieso das rad neu erfinden, wenn sich schlaue köpfe schon das hirn verränkt haben und die fast optimale implementierung gefunden haben ( list, map, hashmap, sortiert, nicht sortiert, optimiert auf linaren zugriff, ... ) bzw Boost


Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #26 am: 29. January 2009, 10:41 »
Das Problem ist, dass diese tollen Funktionen nicht in jedem Betriebssystemkernel zur Verfügung stehen. Und ohne vorher einiges zu tun, erst recht nicht ;)
Dieser Text wird unter jedem Beitrag angezeigt.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #27 am: 29. January 2009, 11:18 »
das was ihr sucht kann jeder c compiler und nennt sich malloc, realloc und free.
Falls du meinst, daß jeder C-Compiler Funktionsaufrufe kann, hast du vermutlich recht. Ansonsten hat er wenig mit malloc/free zu tun. ;)
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Termite

  • Beiträge: 239
    • Profil anzeigen
Gespeichert
« Antwort #28 am: 29. January 2009, 12:05 »
Moin Moin

ich arbeite teilweise auch ohne OS bzw mit sehr exotischen sachen microC/OS-II auf einem ARM 7 z.B. Malloc und free werden mir vom compiler zur verfügung gestellt. voraussetzung ist, das ich einen heap definiere, im embeded bereich macht man das meist statisch, da so viel speicher gar nicht vorhanden ist.

gcc hat sicher auch eigene Funktionen für malloc und free. die gehen sicher intern wieder auf andere Fuktionen, die man ggf erst implementieren muss. z.B. um vom os speicher für den heap anzufordern.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #29 am: 31. January 2009, 12:52 »
So, nochmal was anderes in C. Ich möchte wenn eine Bedingung erfüllt ist eine Funktion verlassen. Wie mache ich das? Also ich meine das hier:

u8 test(void)
{
if (bla)
{
bla
}

else
{
bla

if (bla)
{
bla
return 1;
//ich will nach hallo
}

bla
return 0;
}

//hier ist hallo
}

Wie "springe" ich nach der Stelle, die ich hallo genannt habe?

thx

bitmaster
In the Future everyone will need OS-64!!!

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #30 am: 31. January 2009, 13:01 »
//blub

goto hallo

//blub

hallo:
//bla
Aber abhängig davon was genau du machen willst, ist eventuell das Design deiner Funktion(en) Schrott. In höheren Sprachen ist goto considered harmful, weil es das "intuitive Codeverständnis" extrem behindert.
« Letzte Änderung: 31. January 2009, 13:08 von bluecode »
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #31 am: 31. January 2009, 13:10 »
Wobei C noch nicht so höher ist, daß es dort absolut gelten würde. Faustregel: Dort, wo man in anderen Sprachen Exceptions verwenden würde, können gotos angebracht sein, unter Umständen auch noch als eine Art mehrstufiges break (also nicht nur eine Schleife abbrechen, sondern die umgebende gleich mit). Rückwärtssprünge mit goto sind extrem schlechter Stil (und deswegen z.B. im qemu-Source anzutreffen :-D)
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #32 am: 31. January 2009, 13:18 »
Ja an so etwas wie break habe ich dabei gedacht. Nur wie genau mache ich das in meinem Beispiel? Wenn ich das break hinter der if Schleife schreibe, dann wird es ja auch "ausgeführt" wenn die if-Bedingung nicht erfüllt ist. Aber das soll ja nicht.  :?
In the Future everyone will need OS-64!!!

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #33 am: 31. January 2009, 13:20 »
if Schleife
-> http://www.if-schleife.de/
Insofern ist break da fehl am Platz.
Wie gesagt, goto würde das tun was du möchtest (webei ein goto direkt hinter einem return auch sinnlos ist), aber es ist nicht unbedingt der Königsweg.
« Letzte Änderung: 31. January 2009, 13:22 von bluecode »
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #34 am: 31. January 2009, 13:21 »
if Schleife
-> http://www.if-schleife.de/
Insofern ist break da fehl am Platz.
^^ Na dann, dann werde ich es wohl mit goto machen müssen. thx
In the Future everyone will need OS-64!!!

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #35 am: 31. January 2009, 13:25 »
Sag mal bitmaster, magst du vielleicht begründen, warum du von Assembler zu C (bzw. allgemein zu eine höheren Programmiersprache) gewechselt bist? Vielleicht könnten einige andere davon was lernen und mich würde es natürlich interessieren (und ich denke die anderen in #lost auch :-D ).
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #36 am: 31. January 2009, 13:32 »
Sag mal bitmaster, magst du vielleicht begründen, warum du von Assembler zu C (bzw. allgemein zu eine höheren Programmiersprache) gewechselt bist? Vielleicht könnten einige andere davon was lernen und mich würde es natürlich interessieren (und ich denke die anderen in #lost auch :-D ).
Wenn du mir eine Vernünftige Lösung für mein Problem bietest, gerne ja. Also gcc meckert jetzt rum, dass am Ende der Funktion ein Label steht:

Zitat
mm.c: In function ‘init_phys_mem’:
mm.c:146: error: label at end of compound statement

bitmaster
In the Future everyone will need OS-64!!!

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #37 am: 31. January 2009, 13:38 »
Mach einfach ein return; dahinter rein.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #38 am: 31. January 2009, 14:04 »
Mach einfach ein return; dahinter rein.
Ja klasse, dann ist ja der Sinn dahin. ^^ Ich mache vor dem goto ja schon ein return 1 (Fehlercode).

Zumal gcc dann auch meckert:

error: ‘return’ with no value, in function returning non-void
bitmaster
« Letzte Änderung: 31. January 2009, 14:06 von bitmaster »
In the Future everyone will need OS-64!!!

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #39 am: 31. January 2009, 14:24 »
Man irgendwie geht gar nichts mehr. Man ist wirklich total eingeschrenkt mit einer Hochsprache (alleine wenn ich denke wie schlecht die Compiler "optimieren"). Also noch ein Problem. Was ist denn jetzt hier falsch?

u32 beispiel = 0xB8000;
u8 *pointer;
pointer = beispiel; //wieso geht das nicht?

while (bla)
{
*pointer = 0x00;
pointer++;
}

gcc meckert:

Zitat
error: assignment makes pointer from integer without a cast

man man man, ich kriege hiermit noch mal kA ^^

bitmaster
In the Future everyone will need OS-64!!!

 

Einloggen