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

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #80 am: 05. February 2009, 15:30 »
Exakt dieses meinte ich mit uintptr_t... Zumindest wäre das der standard(konforme) Weg dies zu tun. Mit (u32) kriegst du im Longmode offensichtlich Probleme. Wie gesagt, Portabilität ist keine Eigenschaft einer (Hoch-)Sprache (edit: Aber erst Hochsprachen machen Portabilität möglich, falls jetzt wieder einer der Fließbandjungs kommt und nörgelt), sondern eher eine guten Codes.
Jo, ich habe in meinem Code eh noch jede Menge unportierbare Sachen drin, die ich noch ändern muss, wenn ich demnächst auch ne 64 bit Version haben möchte. Muss eh noch schauen wie genau das dann machbar ist. Evtl. braucht man dann den Präprozessor und solche Sachen? Und natürlich irgendwie ne Angabe ob ich jetzt 32 oder 64 bit compilieren / linken möchte. Ne Makefile bzw. Makefiles wären auch nicht schlecht.  :lol:

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

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #81 am: 05. February 2009, 15:34 »
genau :-) Du hast übrigens meine Frage warum du zu C gewechselt bist nicht beantwortet, obwohl wir deiner Bedingung nachgekommen sind. :-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 #82 am: 05. February 2009, 15:38 »
...obwohl wir deiner Bedingung nachgekommen sind. :-D
Seid ihr? Uups äh *hust* na ja ...  :-P

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 #83 am: 05. February 2009, 16:33 »
Hmm jetzt meckert gcc wieder und ich weiß nicht was ich machen soll. Also ich habe eine Variable Namens blabla vom Typ u32, die einen Wert beinhaltet, der eine Adresse widerspiegelt, die auf einen Null terminierten String zeigt. Aber folgendes mag gcc dann nicht:

strlen(blabla);
und das geht auch net

strlen((u32)blabla);
gcc meckert dann mit:

Zitat
error: passing argument 1 of ‘strlen’ makes pointer from integer without a cast

hmm...

EDIT: arg, ich sollte vielleicht mein bayern fangesang etwas leiser schalten. Es scheint mich wohl doch ein wenig abzulenken. Also so geht es natürlich:

strlen((const char *)blabla);
bitmaster
« Letzte Änderung: 05. February 2009, 16:40 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 #84 am: 06. February 2009, 19:25 »
So, jetzt kann ich im Kernel ja strlen nutzen, indem ich include <string.h> einfüge und ld die libc.a angebe. Das Gleiche bei Anwendungen natürlich auch. Aber dann hängt ja immer die ganze libc an dem Kernel/an den Anwendungen obwohl nur einzelne Funktionen gebraucht werden. Wenn ich z.B. im Kernel nur strlen brauche, dann hätte ich noch x andere Funktionen, die der Kernel gar nicht benötigt. Oder gibt es eine Möglichkeit nicht benötigte Funktionen nicht mit zu linken? Ich könnte in dem Fall natürlich einfach nur die strlen.o mit linken, nur dann würde es sicher eine Fehlermeldung geben, weil die anderen Prototypen, die in der string.h stehen nicht gefunden werden. Von daher stehe ich jetzt doof/unwissend da.  :?

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

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #85 am: 06. February 2009, 19:34 »
Oder gibt es eine Möglichkeit nicht benötigte Funktionen nicht mit zu linken?
Wenn du eine .a mitlinkst, dann nimmt der Linker m.E. aus der .a wirklich nur die Funktionen mit, die du auch verwendest in den anderen Objektdateien (also denen des Kernels selbst).

Zitat
Ich könnte in dem Fall natürlich einfach nur die strlen.o mit linken, nur dann würde es sicher eine Fehlermeldung geben, weil die anderen Prototypen, die in der string.h stehen nicht gefunden werden.
Solange du die anderen Funktionen nicht verwendest wird der Linker nicht meckern, insofern funktioniert deine Lösung mit der strlen.o schon, hat aber natürlich den Nachteil, dass du wahrscheinlich öfter mal deine Makefiles anpassen musst.
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 #86 am: 06. February 2009, 19:37 »
 :-o echt? Ja dann, vielen dank. Muss ich gleich mal ausprobieren.

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 #87 am: 06. February 2009, 19:44 »
sagt mal, welche Version sollte ich in der string.h stehen haben oder ist das egal?

extern size_t strlen(const char *);
size_t strlen(const char *);
size_t strlen(const char* str);
size_t strlen(const char *str);
thx

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

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #88 am: 06. February 2009, 19:46 »
Zitat
The linker will search an archive only once, at the location where it is specified on the command line. If the archive defines a symbol which was undefined in some object which appeared before the archive on the command line, the linker will include the appropriate file(s) from the archive. However, an undefined symbol in an object appearing later on the command line will not cause the linker to search the archive again.
aus dem Manual (unter der Option --library=). Bemerkenswert ist, dass die Datei die das undefinierte Symbol enthält dazugenommen wird, nicht nur das Symbol an sich. Also nicht ganz das gleiche wie ich oben behauptet habe.
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

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #89 am: 06. February 2009, 19:50 »
Das sind komplett äquivalente Deklarationen, da zum einen extern implizit verwendet wird, d.h. man bekommt "extern" bei einer Funktionsdeklaration ohne es explizit hinschreiben zu müssen. Die Setzung des Sterns ist eine stylistische Frage und keine semantische (auch wenn es da heiße C vs. C++ Debatten gibt *g*). Das Weglassen des Argumentnamens würde ich aber als unpraktisch ansehen, da man dann zum einen den Parameter nicht über doxygen dokumentieren kann und zum anderen bei modernen IDEs automatisch wenn man zB "strlen(" schreibt einem die Typen und Namen der Parameter angezeigt werden und man am Namen der Parameter gleich erkennt wie die Funktion zu verwenden ist. Beispiel: Wenn ich ein strcpy(char *dest, const char *src) habe und mir wird das angezeigt, dann ist klar(er) von wo nach wo kopiert wird.
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 #90 am: 06. February 2009, 19:54 »
ah OK vielen dank, also um noch mal sicher zu gehen, folgendes ist das selbe?

const char *bla
const char* bla
?

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

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #91 am: 06. February 2009, 19:55 »
Ja.
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 #92 am: 06. February 2009, 20:01 »
Ja.
Cool danke, jetzt kann ich mir 100%ig sicher sein, dass Bayern Meister wird.  :lol:

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 #93 am: 07. February 2009, 10:55 »
So, um wieder dem Thema ziemlich nah zu kommen, habe ich jetzt noch eine Frage bezüglich Strukturen. Sagt mal, was genau ist der Unterschied zwischen:

struct bla
{
...
};

und

typedef struct
{
...
} bla;

vielen dank schon mal

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

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #94 am: 07. February 2009, 12:54 »
Bei ersterem heißt der Datentyp "struct bla" bei zweiterem "bla".
Dieser Text wird unter jedem Beitrag angezeigt.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #95 am: 07. February 2009, 13:21 »
Bei ersterem heißt der Datentyp "struct bla" bei zweiterem "bla".
ah danke

Ist es irgendwie möglich die selbe Funktion mehrmals auszuführen, aber nur eine Zeile zu benutzen? Also dass man

funktion(var1);
funktion(var2);
funktion(var3);

ungefähr so schreiben kann
funktion(var1 kA var2 kA var3);
Also dass man nicht so "hässlich" mehrere Zeilen benötigt um hintereinander die selbe Funktion nur mit verschiedenen Parametern auszuführen. Geht das, oder geht das nicht?

thx

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

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #96 am: 07. February 2009, 14:27 »
Im Allgemeinen nicht. Wenn überhaupt dann über for-Schleife: Wenn i die Zählvariable ist dann kann man entweder den/die Parameter direkt aus i errechnen oder man kann i als Index in ein Array mit den Parameternwerten machen.
also entweder (f ist der Ausdruck mit dem ich von i zu meinem Parameter komm)
for (int i = 0;i < blub;++i)
  func( f(i) );
oder
void func(Type param);
Type A[] = { // Insert my first parameter of type Type here
                     // Insert my second parameter of type Type here
                    ...
                    };
for (int i = 0;i < blub;++i)
  func( A[i] );
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 #97 am: 07. February 2009, 15:01 »
hmm.. schade, na ja, nicht sooo schlimm
In the Future everyone will need OS-64!!!

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #98 am: 07. February 2009, 15:41 »
C++0x kann das (zumindest mit einer Hilfsfunktion) :-D

void func_helper(){}

template<typename T, void (*func)(T), typename... Args>
void func_helper(T arg1, Args... pack)
{
  func(arg1);
  func_helper(pack...);
}

das ist eine leicht allgemeinere Lösung als die geforderte, man müsste die auch über
void func(int);
func_helper<int, func>(1, 2, 3, 4, 5, 6, 7); // something like that
aufrufen. Aber ich kenn mich mit variadic templates noch nicht so ganz gut aus und kann da keine Korrektheit garantieren. :-)

edit: Glatt den Basisfall vergessen
« Letzte Änderung: 07. February 2009, 15:45 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 #99 am: 12. February 2009, 12:31 »
So, da bin ich wieder.  :-D

Also ich möchte die Adresse eines Pointers in eine size_t Variable kopieren. Dazu mache ich folgendes:

char *pch;
size_t i;
...
i = pch;

Jetzt meckert gcc mit:

error: assignment makes integer from pointer without a cast

Without a cast? Was heißt das? So geht es nämlich auch nicht:

i = (char *)pch;
Muss ich da irgendwas spezielles machen, oder wie?

thx

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

 

Einloggen