1

Bon, je cherche la position d'un caractere ds une chaine, j'ai donc ecrit ca ... et ca compile pas (pas la peine de proposer d'autres méthode, celle ci a pour but d'optimiser...)
int GetNb(char c, char *str)
{
 for (int i=0; ;str++,i++)
     (*str ? ((*str == c) ? return (i) : continue ) : return (-1));
  return -1;
}

gcc 3.2 special mingw
il me dit que c un erreur lors d'un (des) return

2

Tu ne peux pas utiliser return comme ça.
Tu peux mettre:
int GetNb(char c, char *str)
{
 for (int i=0; ;str++,i++)
     (*str ? ((*str == c) ? ({return (i);}) : ({continue;}) ) : ({return (-1);}));
  return -1;
}

mais attention, c'est une extension GNU.

[EDIT: Il manquait des ;.]
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é

3

Et franchement, je te conseille d'utiliser if, c'est fait pour ça! Tu n'optimises rien du tout en utilisant ?: à la place de if.
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é

4

moi je ferais:
int Lycos(char *pStr, char c)
{
char *pStr2 = pStr;
while ( (*pStr) && (*pStr++ != c);
return pStr2-pStr-1;
}

5

enfin il parait qu'en C++ l'arithmetique des poiteurs faut pas utiliser ...

6

? necessite une C expression. return / continue n'en sont pas.

7

Mais (return i, 0) en est une, non ? (sans utiliser d'extension GNU). À moins que la virgule doive elle-même être précédée d'une expression ? (bon de toute façon ça ne sert à rien de faire ça, mais...)
Sinon, Kevin, l'extendion ne permettrait-elle pas de faire des jolies (triroll) choses comme :
int GetNb(char c, char *str) {
  for (int i=0; ;str++,i++)
    return (*str ? ((*str == c) ? i : ({continue; 0})) : -1);
  return -1;
}

?
Et au fait, si ({continue}) est une expression, quels sont son type et sa valeur ? confus
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

8

Il me semble que la virgule doit être précédée d'une expression. Elle ne peut séparer que des expressions.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

9

oui

10

et d'une maniere générale, écrire du code illisible n'aide absolument pas le compilateur à optimiser... que le code soit sur 1 ligne ou 100 lignes, ça fait strictement aucune différence
So much code to write, so little time.

11

Bon, en fait, je me suis rendu compte de ma connerie ce matin en cours de scheme smile

nitro: ce code c'était pour optimiser et m'amuser aussi ...

12

nEUrOO
: ce code c'était pour optimiser et m'amuser aussi ...

Comme je l'ai dit, généralement tout mettre dans une seule instruction n'optimise rien du tout, et quelque fois ça pessimise, comparé à du code trivial que le compilateur peut manipuler plus librement. Ceci sera encore plus vrai dans la prochaine version de GCC qui utilisera un backend SSA unifié.
So much code to write, so little time.

13

oki smile

14

heu mon code il est pas mieux optimisé? (j'utilise pas de compteur?)

15

Moi je pense que ton code est pas mal, JackosKing.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

16

en meme temps j'y connais rien en C sad

17

Euh JackosKing le problème c'est que tu renvoies la taille de la chaîne au lieu de -1 quand on ne trouve pas le caractère...
J'aurais plutôt mis :
for (ptr = str; *ptr; ptr++) if (*ptr == 'c') return (ptr - str);
return -1;
mais effectivement le compteur n'est pas nécessaire.
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

18

Sally :
Et au fait, si ({continue}) est une expression, quels sont son type et sa valeur ? confus

void, à mon avis.
nitro
:
nEUrOO
: ce code c'était pour optimiser et m'amuser aussi ...
Comme je l'ai dit, généralement tout mettre dans une seule instruction n'optimise rien du tout, et quelque fois ça pessimise, comparé à du code trivial que le compilateur peut manipuler plus librement. Ceci sera encore plus vrai dans la prochaine version de GCC qui utilisera un backend SSA unifié.

De toute façon, ce que fait GCC est de couper l'instruction monstre en plein d'instructions triviales. Ça sera fait encore plus tôt avec tree-ssa, mais déjà maintenant, c'est fait avant toutes les passes d'optimisation.
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é

19

Et la preuve que cette "optimisation" ne sert strictement à rien:
unknown@K ~
$ cat test1.c
int GetNb(char c, char *str)
{
 for (int i=0; ;str++,i++)
     (*str ? ((*str == c) ? ({return (i);}) : ({continue;}) ) : ({return (-1);}));
  return -1;
}

unknown@K ~
$ gcc -S -Os -fomit-frame-pointer -std=gnu99 test1.c

unknown@K ~
$ cat test1.s
        .file   "test1.c"
        .text
        .align 2
.globl _GetNb
        .def    _GetNb; .scl    2;      .type   32;     .endef
_GetNb:
        pushl   %ebx
        pushl   %ecx
        movb    12(%esp), %al
        movl    16(%esp), %edx
        movb    %al, 3(%esp)
        xorl    %eax, %eax
L2:
        movb    (%edx), %cl
        orl     $-1, %ebx
        testb   %cl, %cl
        je      L1
        movl    %eax, %ebx
        cmpb    3(%esp), %cl
        je      L1
        incl    %edx
        incl    %eax
        jmp     L2
L1:
        popl    %edx
        movl    %ebx, %eax
        popl    %ebx
        ret

unknown@K ~
$ cat test2.c
int GetNb(char c, char *str)
{
 for (int i=0; ;str++,i++)
     if (*str) if (*str == c) return (i); else continue; else return (-1);
  return -1;
}

unknown@K ~
$ gcc -S -Os -fomit-frame-pointer -std=gnu99 test2.c

unknown@K ~
$ cat test2.s
        .file   "test2.c"
        .text
        .align 2
.globl _GetNb
        .def    _GetNb; .scl    2;      .type   32;     .endef
_GetNb:
        pushl   %ebx
        pushl   %ecx
        movb    12(%esp), %al
        movl    16(%esp), %edx
        movb    %al, 3(%esp)
        xorl    %eax, %eax
L2:
        movb    (%edx), %cl
        orl     $-1, %ebx
        testb   %cl, %cl
        je      L1
        movl    %eax, %ebx
        cmpb    3(%esp), %cl
        je      L1
        incl    %edx
        incl    %eax
        jmp     L2
L1:
        popl    %edx
        movl    %ebx, %eax
        popl    %ebx
        ret

unknown@K ~
$ diff -u test1.s test2.s
--- test1.s     Thu Jan 15 05:15:26 2004
+++ test2.s     Thu Jan 15 05:15:46 2004
@@ -1,4 +1,4 @@
-       .file   "test1.c"
+       .file   "test2.c"
        .text
        .align 2
 .globl _GetNb
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é

20

oki, merci bcp

Jacki: ton truc est basé sur le fait que sizeof(char) est égale a 1 non ?

21

oui

22

nEUrOO > non ! ça marche parce que les pointeurs sont des char*, tout simplement.
Mais si tu avais une chaîne de caractères 16-bit (toujours terminée par un 0), tu pourrais utiliser exactement le même code en remplaçant char par short, et ça marcherait.
ptr++ augmente la valeur de ptr de sizeof (*ptr)

Kevin > euh oui void, je n'y pensais pas mais je ne vois effectivement pas ce que ça peut être d'autre
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

23

Et de même la soustraction des pointeurs te donnera le nombre de mots entre l'un et l'autre si ce sont des short*, pas le nombre d'octets. (A priori ce serait bien ce que tu veux ici, sinon il faut multiplier par 2.)
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

24

Sally :
nEUrOO > non ! ça marche parce que les pointeurs sont des char*, tout simplement.
Mais si tu avais une chaîne de caractères 16-bit (toujours terminée par un 0), tu pourrais utiliser exactement le même code en remplaçant char par short, et ça marcherait. ptr++ augmente la valeur de ptr de sizeof (*ptr)

Si un char vaut deux, ca marche pas.

25

Ben si confus
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

26

Bon, je suis une merde wink

27

si un char vaut 2 ca marchera quand meme.

28

oui

29

Kevin> ça me paraît assez logique que "if (a) b; else c;" soit strictement équivalent à "a?(void)bsadvoid)c;", non? Par contre il y a d'autres "optimisations" qui pourraient donner un truc moins efficace, parce que le lien avec la version originale n'est pas trivial à faire.

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

30

Évidemment que c'est logique, mais nEUrOO pensait le contraire. grin
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é