60

Hey oh je voulais pas déchainer la polémique justement. grin La solution du Else est en effet ce qui convient ici. Je n'ai rien contre les goto à priori, je voulais savoir si dans ce cas, je pouvais l'éviter tout en gardant mon optimisation. De toute façon, en assembleur, on fait des goto à la pelle, donc je suis le roi du goto. embarrassed
Kevin Kofler (./53) :
Normalement, -Wextra devrait aussi passer avec TIGCC!

Ah, il est pas dans la doc. grin Et comme je n'avais pas de warnings supplémentaires, je pensais qu'il ne marchait pas. grin

61

Kevin Kofler (./59) :
Attention quand-même, ce truc est un lvalue cast, ce n'est pas du C standard et ce n'est plus géré par le GCC officiel (mais celui de TIGCC est patché pour le permettre).

Alors que convient-il de faire pour lire mon short et pointer sur celui d'après ? confus

62

./57 > j'ai failli faire cette remarque à Godzil mais je me suis dit que peut-être "do whatever you want" incluait le passage de toto à qqch qui allait le garder (sur TI il pourrait être ajouté à la VAT typiquement si je ne m'abuse), donc j'ai reproduit ce que faisait le code du ./51 (à moins que j'aie mal compris ce qu'il faisait, ce qui signifierait qu'il n'est pas si clair que ça, mais je ne crois pas)

edit : non rien
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#

63

./57 (cross-edit) : oui oui je suis d'accord, le goto c'est un peu l'exception du pauvre, et ce genre de mécanisme est indispensable dès que tu peux avoir un peu trop de conditions d'erreurs ^^
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#

64

Folco (./61) :
Kevin Kofler (./59) :
Attention quand-même, ce truc est un lvalue cast, ce n'est pas du C standard et ce n'est plus géré par le GCC officiel (mais celui de TIGCC est patché pour le permettre).

Alors que convient-il de faire pour lire mon short et pointer sur celui d'après ? confus

Bah, le code standard est forcément plus long et plus répétitif, c'est bien une des raisons pour lesquelles j'ai patché GCC pour garder cette extension. (Les autres, c'est que TIGCCLIB utilise ça aussi et que je veux garantir la compatibilité source à 100%.)
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é

65

Kevin Kofler (./59) :
uant aux goto, ce qui est intéressant, c'est qu'on peut aussi rentrer dans les blocs avec, ce qui permet d'éviter pas mal de répétitions. Cf. par exemple cette fonction (c'est du C++, mais on peut faire la même chose en C): http://tigcc-linux.cvs.sourceforge.net/viewvc/tigcc-linux/ktigcc/mainform.cpp?revision=1.101&view=markup#l_1372 .

Ca par contre c'est vraiment ultra crade...
Folco (./61) :
Alors que convient-il de faire pour lire mon short et pointer sur celui d'après ? confus.gif


void func(void * bla)
{
  short *blu = (short*)bla;
  blu ++;
}


ou si tu veux incrémenter de 2 a la main :
void func(void * bla)
{
  char *blu = (char*)bla;
  blu +=2;
}

ko<a href='javascript:;' onclick='getPost(event,126586,62)'>./63</a>
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

66

Godzil (./65) :
ko<a href='javascript:;' onclick='getPost(event,126586,62)'>./63</a>

En C Godzil, en C tripo

67

C'est la faute a yAro ce bug embarrassed
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

68

Tiens ça fait longtemps que j'ai pas utilisé la fonction source de yN cheeky   }   game_file.nombre = i;   if (sauvegarde) return 2;   return 1; }voici donc un exemple de très magnifique fonction où j'ai utilisé un goto :int open_file (const char *filename) {   char nom_complet[MAX_CAR_NOM_FIC];   char *basename;   char *chiffre;   Bool sauvegarde = FALSE;   SYM_ENTRY *se;   int i;     nom_complet[0] = 0;   if ((basename = strchr (filename, '\'))) {     basename++;     chiffre = nom_complet + sprintf (nom_complet + 1, "%.17s", filename);     if ((se = SymFindPtr (chiffre + 1, 0))) {       byte *ptr = HeapDeref (se -> handle);       if (!strcmp ("ZSVG", ptr + *(word*)ptr - 4)) {      strncpy (nom_jeu, ptr + 10, 7);      chiffre =        nom_complet + 1 + sprintf (nom_complet + 1, REPERTOIRE_JEUX "\%.7s", ptr + 10);      sauvegarde = TRUE;       }       else {      *chiffre = 0;      strncpy (nom_jeu, basename, 7);       }     }     else goto argh;   }   else {     chiffre =       nom_complet + 1 + sprintf (nom_complet + 1, REPERTOIRE_JEUX "\%.7s", filename);     strncpy (nom_jeu, filename, 7);   }      chiffre[1] = 0;   for (i = 0, *chiffre = '1'; i < 4; i++, (*chiffre)++) {     if ((se = SymFindPtr (chiffre + 1, 0)))       game_file.fichier[i] = se -> handle;     else break; #ifndef DOORS     if (!ttarchive_valid (HeapDeref (game_file.fichier[i]) + 2)) { #else     if (({       void *ptr = HLock (game_file.fichier[i]);       !ptr || !(game_file.descriptors[i] = shrnklib_OpenArchive (ptr + 2));     })) { #endif /* DOORS */       ST_helpMsg (FRENCH ? "fichier non valide" : "invalid gamefile");       return 0;     }   }   if (i == 0) { argh :     ST_helpMsg (FRENCH ? "jeu non trouvé" : "game not found");     return 0;(ça n'a aucun intérêt sauf que j'avais envie d'utiliser cette fonction, enfin c'est juste un exemple où je ne vois pas vraiment comment éviter le goto sans dupliquer du code, contrairement à ceux de godzil)
edit : bon c'est quand même plus joli sous mirari (par contre il faudrait mettre l'extrait dans un fichier séparé et l'uploader non ?)
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#

69

Bah, c'est comme mon exemple du ./59.
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é

70

PpHd, quand mon programme termine, clean libère toujours un handle...
Je ne fais aucune allocation à la main, j'ouvre une lib (de données) et je crée un plane. Je les libère en sortie. Ca pourrait venir de gl_main qui ne libère par quelque chose ? Faut dire que je quitte le programme avec exit, donc gl_main ne termine jamais.

71

Oupf o_O

Pour 1.5 ko d'asm, j'ai 2 ko en C. Je dois être nul grin

72

le C est moins cher au kgo, pas d'inquiétude embarrassed

73

Folco (./70) :
Je ne fais aucune allocation à la main, j'ouvre une lib (de données) et je crée un plane. Je les libère en sortie. Ca pourrait venir de gl_main qui ne libère par quelque chose ? Faut dire que je quitte le programme avec exit, donc gl_main ne termine jamais.


Surement çà

74

Merde. Donc avec gl_main, au revoir exit sad

src/static/main.c :
	PUSH_DSCREEN(dscr[0]);
	gl_init_dscreen(&dscr[1], &hd);

Ca searit possible de rajouter un gl_push_hd(hd) derrière ? Histoire de pouvoir s'en sortir avec un gl_free_hd() ?

75

atexit() ?

76

Mais atexit de quoi ? Je ne vais pas savoir quoi libérer, de toute façon j'ai la main quand je quitte, mais je ne sais pas quel handle a été alloué.

77

Folco (./74) :
Merde. Donc avec gl_main, au revoir exit sad

src/static/main.c :
	PUSH_DSCREEN(dscr[0]);
	gl_init_dscreen(&dscr[1], &hd);

Ca searit possible de rajouter un gl_push_hd(hd) derrière ? Histoire de pouvoir s'en sortir avec un gl_free_hd() ?

Tu dois pouvoir t'en sortir avec un setjmp/longjmp.
Sinon tu patches les sources smile

78

PpHd (./77) :
Tu dois pouvoir t'en sortir avec un setjmp/longjmp.

En effet. Je connaissais pas, c'est très bien. smile Marrant d'ailleurs que ça sauve d2 ce truc
PpHd (./77) :
Sinon tu patches les sources smile.gif

Super commode pour la distribution. grin (ok, c'est pas ce qui me guette le plus, mais on va faire comme si ^^)

79

Je sais pas pour le atexit, c'était juste une vague suggestion grin
Sinon, pour le patch de genlib problématique pour la distribution, c'est facile : patche au runtime tripo

80

Ah oui je suis con, j'y avais pas pensé #fpalm# grin
Non en fait, le problème était que je ne connaissais pas le handle à libérer, seul la fonction principale le connait, donc elle doit quitter par return => pas de exit.

Sinon, ça marche impec ta solution, merci PpHd. smile

81

Habituellement, est-ce que vous explicitez toutes les conditions, genre if(truc !=0) ou if(machin == 0) ?

82

Non, j'essaie d'utiliser des noms suffisamment clairs pour que ça soit inutile.
Au besoin je fais un truc du genre de :

const bool isPlopLoaded= (varObscure & flagObscur)!=42 && !huhu ;
if ( isPlopLoaded ) {
   //...
}


L'énorme avantage à la lecture, c'est qu'en plus de savoir ce qu'on teste, on connaît également sa signification réelle smile
En gros ça dépend du nom de la variable à tester ^^


edit : en fait je me rend compte que je suis limite HS, ma réponse est donc, pour du C : oui, utilise les tests complets, les tests "implicites" ne servent à rien et sont peu lisibles... (genre if ( !srtcmp(...) ) {//identique} else {//différence} couic couic2)

83

Moi j'utilise plus ou moins cette règle quand c'est possible (en gros quand le langage l'autorise ^^):
Si la sémantique de ta variable est numérique (ex: le nombre d'hippopotames caché derrière la cabane au fond de ton jardin, le poids d'un de ces pachydermes, la position de ton wc en coordonnées gps, ...) expliciter la condition == 0 et != 0 (de toutes façons en général tu auras plus besoin de > 0 que de != 0), et sinon, même si la variable est un entier (y'a pas de type bool en C de toutes façons...), ne pas expliciter la condition. (Donc pour tous les cas où tu testes une valeur de retour, un flag, un pointeur, ...)

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

84

Intéressant, je m'étais fait la même réflexion. Autant pour une abcisse, 0 veut vraiment dire qqchose, autant pour un pointeur, c'est pas pareil. Très bien, merci des avis. smile

85

Attention, NULL ne vaux pas forcement 0...
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

86

Merde. C'est quoi ce truc ? En tout cas, NULL sur TI == 0, non ?

87

Oué, enfin... je crois grin. Ce dont je suis certain, en revanche, c'est que le _nostub a toujours été NUL embarrassed

88

#triyon#

89

Godzil (./85) :
Attention, NULL ne vaux pas forcement 0...

Arrête de l'embrouiller pour lui dire que p = NULL = (void* ) 0
mais que ca peut être différent d'un memset(p, 0, sizeof (void*));
Sur TI ca marche. Sur plein d'autres aussi ca marche. J'en cherche toujours un où ca pourrait ne pas marcher.

90

p = NULL = (void* ) 0mais ca peut être différent d'un memset(p, 0, sizeof (void*));

Ah ? Et pourquoi ? oO