Les structures dans mon langage
Mon langage permet de grouper des variables.
On utilise le mécanisme des structures présent dans d'autres langages compilés.
J'utilise un système basique de prototype/Allocation
On fait un prototype de la structure, ensuite on peut la déclarer sous forme de référence memoire ou de données organisées sur la pile allouée.
Démonstration
Considérons le code suivant :
// gaspardl.exe console g/Consoleinc.g g/Struct.g
// il faut gaspardl 1.2 !!!
struct pack teststruct = begin
element uint32_t texte2;
element uint32_t texte;
element double double1;
end
global struct teststruct test_pile;
global struct teststruct test_pile_arr[255];
global struct teststruct ptr test_struct_ptr;
global string log1 = "log : %d \n";
global string log2 = "log : %f \n";
procedure main return uint32_t = begin
structptr test_struct_ptr = 0xCAFEBABE; // adresse bidon, vous devez alloc avec MALLOC()
test_pile_arr[255].double1 = 14.0444;
test_pile.texte = cast uint32_t 26666;
call printf log2 test_pile_arr[255].double1;
call printf log1 sizeof test_pile_arr;
return cast uint32_t 1;
end
commentaires
Cas spécial :
struct pack teststruct = begin
element uint32_t texte2;
element uint32_t texte;
element double double1;
end
une structure peut se déclarer sans pack, pack permet juste d'éviter certaines optimisations LLVM qui vise a arrondir la taille de la structure.
Déclaration
Admettons le code suivant :
global struct teststruct test_pile; // aucune difficulté
global struct teststruct test_pile_arr[255]; // ok, allocation sur la pile 255*teststruct
global struct teststruct ptr test_struct_ptr; // pointeur
Dans le cas du pointeur, pour lui associer une adresse dans la memoire on utilise l'opérateur structptr
j'ai décidé d'introduire le mot clé structptr pour éviter une ambiguité avec =
si structptr est présent avec le nom, on sait qu'on référence un ptr à une struct.
Limitations
- pour l'instant, pas de ref de structure (pile ou ptr) dans une struct -> très problématique, je travaille dur
- le bits fields existe : exemple :
element bits 4 limit_high ;
element bits 4 flags ;
ça marche, mais c'est buggé.