Vous n'êtes pas identifié.
J'ai une procedure en C contenant de l'assembleur inline et à l'endroit où on appelle cette procédure je veux que le compilateur réécrive dans le code compilé la procedure complète au lieu de faire un call ! Est-ce possible ?
Euh.. si vous avez pas compris se que je demande faites le moi savoir !
Hors ligne
Ben tu definis la fonction en inline:
inline function_name(args) { }
Hors ligne
normalement en mettant dans la déclaration de ta méthode le mot inline du style : inline void maproc();
Le compilateur prendra le corps de la méthode à chaque endroit ou tu appelles la méthode. Ca doit 'normalement' donner le meme résultat qu'un #Define. Mais faut faire attention aux options du compilateur, car certains compilateurs ont des options pour ne pas copier le code de la méthode si celle-ci est trop grosse en mémoire.(c réglable)
Hors ligne
Merci
Mais en fait (et c'est ca que je ne comprend pas) TurboC n'accepte pas que je mette : inline void nomprocedure(args) !
Hors ligne
Attention les fonctions inline doivent être définies dans un fichier .h et non un fichier .c (c'est logique en fait, si on réfléchit au fait que pour remplacer l'appel de la fonction par son code le compilateur a besoin du corps entier de la fonction et pas seulement de sa déclaration...)
Attention aussi, si on n'y prend pas garde ça peut faire exploser la taille de l'executable! C'est généralement à éviter.
Hors ligne
Mais je le mes dans un fichier .h
Vous avez pas une source à me présenter pour savoir d'où viens mon erreur ?
Hors ligne
Turbo C est un (très) vieux compilateur, il ne supporte peut-etre pas les fonctions inline.
Regarde du coté de digital mars, c'est un compilateur beaucoup plus récent, et plus strict aussi, ce qui te permet de faire moins d'erreurs.
Hors ligne
Ne t'inquiète pas il les supporte très bien...
(En tout cas pour les fonctions inline dans des classes il les supporte même trop bien, à voir la taille du code que ça génère au lieu d'un simple appel de fonction :P)
Hors ligne
Mais commenyt je fais moi ???
Hors ligne
si tu ne vx pas passer à un autre compilo au lieu d'utiliser une fonction inline, défini ta méthode comme une macro #define MAPROC(arg) asm{ blabla}
Hors ligne
je crois que "inline" ne fonctionne qu'en C++
Hors ligne
Bon, Inline ne marche pas même dans le fichier .h : erreur "Syntax error"
et le #define MAProc(ARg) asm {truc} non plus : erreur ben ça dépend ! j'ai eu 6 erreurs différentes ! :evil:
Bon, je suis débutant en C donc si vous pouvez me dire comment déclarer ma procedure avec des exemples plizzz ! :vert:
Hors ligne
qu'est ce qui t'empêche de faire un fonction banal ? ah mois que j'a rien suivi
Hors ligne
Ben, comme je l'ai dis je suis débutant et j'essai d'apprendre et puis c'est pour une fonction d'affichage de Point.
Hors ligne
C'est "inline" et pas "Inline" hein (juste au cas où)...
Par contre de l'asm ne peut pas être contenu dans des fonctions inline, ça j'en suis sûr... Ici tu veux faire un define, à mon avis ce sont les accolades qui lui posent quelques soucis (y'a moyen de faire en sorte que ça marche, mais je crois qu'il faut un peu chipoter).
Qu'est-ce que tu veux créer comme procédure inline? Normalement tu n'as pas vraiment besoin de ça... :?
Hors ligne
Ben ca serais pour faire une fonction AfficherPixel (comme je l'ai dis plus haut) mais j'aimerai l'integrer à l'intérieur d'une fonction AfficherLigne sans les s***peri de Push ! qui ralentisse tout !
Hors ligne
ta pas besoin de faire ces fonctions elles existent déjà et sont surrement plus optimisées que les tiennes, push ou pas
d'ailleur la vitesse va plus dépendre de ton algorithme que du fait que tes fonctions soit inline ou pas
et le fait quelles soient inline ça ne va pas virer les push mais juste éviter les call.
Hors ligne
oué je sais qu'elles existent déjà ! mais tu sais les programmeurs ca a toujours la mani de tout refaire soi-même ! et je vois pas comment on pourrais vraiment plus les optimiser que les miennes parce que se qui prend le plus de temps c'est les PUSH que met le compilateur automatiquement ! et j'aimerai les virer !
Hors ligne
essaye en écrivant #define TEST(a) asm ...;
asm ....;
........
asm ....;
dans les defines tu ne px pas typer les arguments vu qu'ils seront remplacés par le pré-processeur. Normalement cela doit fonctionner.
Hors ligne
ahhhh ! Oui j'ai compris !!!
Je comprennais pas comment le préprocesseur pouvait connaitre les types des arguments et en plus avec de l'ASM c'est super important !
Bon je teste ca et je vous donne des nouvelles !
Hors ligne
bof
un bon programmeur ça réutilise
d'ailleur c bien conu ya pas plus feignant qu'un programmeur
Hors ligne
Ah Bon ?
Et pour les nouvelles donc ca compile mais la fonction de point ne marche pas (Mais en décompilant le compilé on peut voir qu'il n'y a pas de PUSH donc ca doit être beaucoup plus rapide !)
Hors ligne
C'est bon ca marche ! et c'est assez rapide !
Hors ligne
Tu pourrais me donner le code que tu as écrit?
Je vais faire des tests de vitesse, on verra bien
Hors ligne
Bon c'est un chronométrage à la montre donc pas très précis !
environ 24400 pixels/s pour la fonction d'affichage de pixel PutPixelD3 !
environ 25600 pixels/s pour la fonction d'affichage de pixel PutPixelD3Segment !
environ 45000 pixels/s pour la fonction d'affichage de pixel PutPixelD3Inline !
environ 51000 pixels/s pour la fonction d'affichage de pixel PutPixelD3SegmentInline !
Par contre l'utilisation de WinG100 pour connaitre la rapidité du prog est très mauvaise : il accélère presque par 2 la vitesse ! Donc au début j'étais super heureux j'avais 100000 pixels par seconde mais bon !
#define PutPixelD3SegmentInline(X, Y, Couleur, Segment) { asm { mov ax, Segment; add al, Y; mov es, ax; mov cx, X; mov si, cx; shr si, 3; and cl, 7; db 0x26, 0x0F, 0x12, 0x04; mov al, Couleur; shl al, cl; or es:[si], al; } } void PutPixelD3Segment(unsigned int X, unsigned char Y, unsigned char Couleur, unsigned int Segment) { asm { mov ax, Segment add al, Y mov es, ax mov cx, X mov si, cx shr si, 3 and cl, 7 db 0x26, 0x0F, 0x12, 0x04 mov al, Couleur shl al, cl or es:[si], al } } #define PutPixelD3Inline(X, Y, Couleur, Page) { asm { mov ax, Page; shl ax, 6; add ax, 0x1A20; add al, Y; mov es, ax; mov cx, X; mov si, cx; shr si, 3; and cl, 7; db 0x26, 0x0F, 0x12, 0x04; mov al, Couleur; shl al, cl; or es:[si], al; } } void PutPixelD3(unsigned int X, unsigned char Y, unsigned char Couleur, unsigned int Page) { asm { mov ax, Page shl ax, 6 add ax, 0x1A20 add al, Y mov es, ax mov cx, X mov si, cx shr si, 3 and cl, 7 db 0x26, 0x0F, 0x12, 0x04 mov al, Couleur shl al, cl or es:[si], al } }
J'ai supprimer les commentaire parce que ça prennais beaucoup de place !
Hors ligne