30

Ce n'est pas normal de devoir écrire ce genre de casts, c'est plutôt un indice que tu essaies d'écrire du C comme si c'était de l'assembleur. hehe
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

31

pareil grin

ça raye les yeux ce cast grin


pourquoi pas FilePtr + FileSize - 5?

d'ailleurs ça va foirer pour autre chose que du x86

32

Le truc, c'est que mon FilePtr est le résultat d'un HeapDeref, donc un void*

Puis je dois calculer l'offset du char FilePtre + FileSize - 5 (merci squalyl, j'y ai pensé j'étais déjà couché grin). Je dois donc caster en char*
Puis il me faut un void pour memcmp, donc re-cast en void*.
Ya un autre moyen ?

Il vut pas de l'opérateur & quand j'écris ça :
(void*)&((char*)FilePtr + FileSize - 5)
D'abord je comprends pas pourquoi, et ensuite je vois pas comment faire autrement qu'éviter ces deux casts...

33

Normalement y'a pas besoin de cast en void*.
Et tu peux pas obtenir un pointeur sur une valeur tongue
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

34

Eh merde... je m'en doutais.... alors je fais comment pour récupérer ce p**ain de pointeur en plein milieu de mon tableau ? J'ai essayé de fooler le compilo avec diverses écritures hier soir, sans y arriver :/

Mais le cast en char* reste obligatoire, ça se déréférence par un void* ... Bref, ça reste pas splendide...

35

(void*)&((char*)FilePtr + FileSize - 5)

non mais non là grin
qu'est ce qu'il vient foutre au milieu ce &? grin

FilePtr est déja un pointeur vers ce que tu veux, il pointe juste quelques octets avant, et il a éventuellement pas le bon type. Donc a la limite tu pourrais faire

(void*)((char*)FilePtr + FileSize - 5)

mais vu que void* et char* se comportent de la même manière, tu peux carrément virer tous les casts.

a abuser un compilo, autant le faire proprement trifouet

36

Ah oui n'importe quoi triso Ca m'apprendra à faire un truc sans réfléchir, putain la honte triso

Don au final, FilePtr + FileSize - 5 marche très bien. trioui Tout ça pour essayer de faire bien à la base, n'importe quoi mur

37

comme un peintre en ascii art, des petits & , * et () un peu partout et hop hehe

38

N'est-ce pas ? Quel manque de goût ce compilo quand même grin

39

40

41

42

Tu m'étonnes grin

Tiens, j'm'a fait baysay :
*((char*)FilePtr + FileSize + 1)
!=
*(char*)FilePtr + FileSize + 1
cheeky

43

44

C'est un peu évident quand même cheeky
Faut bien réfléchir à la priorité des opérateurs quand tu codes ^^
Le cast heu déréférencement c'est un "opérateur" avec une des priorités les plus élevées, donc évidemment, ça passe avant le + et beaucoup d'autres smile
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

45

Oui, je m'en suis rendu compte à la relecture, donc j'ai pas galéré dessus. bizarement ça m'a sauté aux yeux, alors que j'y ai même pas pensé quand j'ai écrit...

46

squalyl (./35) :
vu que void* et char* se comportent de la même manière
Sûr ? #doute#
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

47

bah teste mais tu verrais quoi comme différence a part que tu peux pas deref un void*?

ma remarque vaut surtout que x+3 pointe 3 octets après x , que x soit un char* ou un void*.

48

Justement, je sais que ça semble marcher en pratique, mais je ne sais pas si c'est garanti par le standard C.

Du point de vue logique c'est un peu embêtant : si tu fais pointeur += 3, le pointeur est censé avancer de (3 * taille du type de pointeur) octets. Or void ne représente justement aucun type en particulier...
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

49

j'ai vraiment la flemme de ressortir le doc ISO C89 ou 99 (chaipa) mais il me semble qu'il mentionne que sizeof(void) = 1 quand on s'en sert comme pointeur.

en cherchant vite ça semblerait être une extension gcc... merdalors.

bon, m'en fous, j'utilise que gcc , mais c'est bon a savoir.

50

C'est une extension GCC, en effet.
L'utiliser ou pas est une question de goût - personnellement, je n'aime pas, et c'est une introduction gratuite d'importabilité bien connue entre compilos.
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.