1

Salut à tous !
Je rencontre un problème avec TIGCC :

Je programme un RPG révolutionnaire smile
Est ce qu'il y a une limite de taille pour un switch ?
Par ce que ça marche très bien pour dix morceaux de dialogues (1000 à 1010)
et puis boum je rajoute encore un autre et là ça plante !

Je suis désespéré...

Celui qui me répondra recevra une version avant tout le monde wink
Ben voilà. Ben ouais quoi.

2

divise le switch en 2 parties : je pense que ce problème est bel et bien du au switch parce que j'ai rencontré le ^m problème.
avatar

3

Oué enfin cela dit ya pê d'autres moyens plus efficaces que des switchs monstrueux, vous trouvez pas ?
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

4

Comme quoi par exemple ???

une suite de

if(num==1000)
{

}
if(num==1001)
{

}

wink

Edit : J'vais faire comme t'a dis Amosé merci smile
Ben voilà. Ben ouais quoi.

5

Oula nan sick

Par exemple tu peux coller toutes tes chaines bout à bout, séparées par des \0, faire une indexation au début et ensuite c'est très facile de récuperer la chaine que tu veux. Enfin c'est qu'un exemple y'a plein de méthodes.
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

6

ouè ms bon... c koi exactement les désavantages du switch ? confus
avatar

7

Heu... Je sais pas comme fonctionne un switch, mais à mon avis y'a des chances que ça soit bien lent si t'en fais un énorme... Et puis ça prendra bcp plus de place.
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

8

il me semble que dans la norme C89 la limite pour le nombre de case (non imbriques je crois) dans un switch est de 1023.
Fiou.

9

sick

En principe un switch, si gros soit-il, ne doit pas crasher. Et en supposant qu'il y ait une limite au nb de cases [je ne pense pas qu'il y en ait dans GTC ou TIGCC, autre que la RAM libre], si elle est atteinte, en principe le compilo te le dit, plutôt que de te balancer un code faux. Donc je pense que le pb est ailleurs : bug de ton prog qui ne se manifeste que dans certaines conditions, ou bien bug de TIGCC. Dans les deux cas il vaudrait mieux que ce bug soit corrigé, même s'il n'est pas visible...
Heu... Je sais pas comme fonctionne un switch, mais à mon avis y'a des chances que ça soit bien lent si t'en fais un énorme... Et puis ça prendra bcp plus de place.

S'il est assez dense (i.e. tous les case sont dans un intervalle de valeurs assez petit) il peut être très efficace point de vue vitesse et taille...

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

10

Pollux
: (i.e. tous les case sont dans un intervalle de valeurs assez petit)

Justement, d'après ce qu'il a dit (1000 / 1010), ça n'a pas l'air d'être le cas. Et puis franchement, même si ça l'étais, je serais curieux de voir la différence entre un switch monstrueux et DrawStr(strTable + strOffset[i]).

[edit] putain de bug avec [ i ]...
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

11

Bah si les valeurs du switch sont pas trop écartées, ça fera un tableau de pointeurs vers les chaînes, je pense.
Par exemple si j'ai bien compris le code post 3 les dialogues vont de 1000 à 1010. Si la variable est num, le code que pourrait donner un compilateur serait
int tmp = num;
tmp -= 1000;
fonction(tab[tmp]); // tab est un tableau de pointeurs vers les chaînes de caractères


et ça c'est pas trop mal quand même (beaucoup mieux que pleins de if sick). Mais bon c'est vrai qu'une chaîne de caractères et un tableau de pointeurs (switch dense et bien transformé) c'est moins bien qu'une chaîne et un tableau d'offsets, enfin si les offsets sont sur 4 octets ça fera pratiquement pareil au niveau taille.
avatar
;)

12

Ils ne seront pas sur 4 octets, vu qu'il ne pourra pas avoir plus de 65518 octets de chaine (et puis même pour un rpg, ça m'étonnerais qu'il ait besoin de dépasser ça sans être obligé de séparer les niveaux)
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

13

Bon donc j'ai essayé de mettre plusieurs switch mais ça merde quand même après...

PS: Le coup des if c'était une blague smile
Ben voilà. Ben ouais quoi.

14

Vertyos
:
Pollux
: (i.e. tous les case sont dans un intervalle de valeurs assez petit)

Justement, d'après ce qu'il a dit (1000 / 1010), ça n'a pas l'air d'être le cas. Et puis franchement, même si ça l'étais, je serais curieux de voir la différence entre un switch monstrueux et DrawStr(strTable + strOffset[i]).
[edit] putain de bug avec [ i ]...

J'avais pas fait gaffe que c'était pour stocker des chaînes de caractères, auquel cas la méthode que tu décris est bien plus efficace.

Mais toujours est-il que c'est plutôt inquiétant d'avoir un crash comme ça, et que ça peut être une occasion de débugger maintenant un bug qui fera crasher la calc au bout de 10 minutes si on le laisse survivre...

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

15

pencil
Je pense qu'il y a d'autres possibilités qu'indexer de la façon de Vertyos, mais celles que je voie reviennent au même (je pensais notamment à un tableau à deux dim ou à un arbre -binaire ou plus- généré à partir d'un fichier de données).
avatar

16

Rising Sun
: Est ce qu'il y a une limite de taille pour un switch ?

En présupposant un switch parfaitement dense (aucune valeur sautée), le maximum théorique est 65518/2=32759 valeurs pour tous les switches de ton programme réunis. Mais évidemment, le code prend aussi une partie de ces 65518.
Si ton switch est très peu dense (beaucoup de valeurs sautées), essaye de compiler en -Os (si ce n'est pas ce que tu fais déjà), ça consomme moins de place.
Par ce que ça marche très bien pour dix morceaux de dialogues (1000 à 1010)

C'est nettement en-dessous du maximum...
et puis boum je rajoute encore un autre et là ça plante !

Tu me fais peur... "ça plante" comment?! Le compilateur plante? Le programme plante? Avec une boucle infinie ou avec un message? Le message lors du plantage, c'est quoi (s'il y en a un)? Ou alors tu as seulement un message d'erreur et tu appelles ça "planter"? Selon ce qui est le cas, ça pourrait aussi être un bogue du compilateur, donc j'aimerais toutes les informations que tu peux fournir. Quelque chose d'aussi vague que "ça plante" ne m'avance pas du tout! sad
D'ailleurs, même si le problème est dans ton programme, j'ai besoin de ces informations pour t'aider.
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é

17

Oui c'est vrai la calc plante pas (c'est vti avec 2.03)

Le programme s'arrête genre Crash contrôlé par PreOs

Mais y a une fois où ça m'a fait Adress Error (oui oui quand tout est planté)
et une fois où j'ai eu Error in adress 0x5777A of object 0xtruc
Ben voilà. Ben ouais quoi.

18

Rising Sun :
Oui c'est vrai la calc plante pas (c'est vti avec 2.03)

Le programme s'arrête genre Crash contrôlé par PreOs

Mais y a une fois où ça m'a fait Adress Error (oui oui quand tout est planté) et une fois où j'ai eu Error in adress 0x5777A of object 0xtruc

Je crois que tu vas être bon pour tout balancer à Kevin, avec l'endroit surtout où tu *penses* que ça plante. Sinon, essaie de récupérer aussi lors du plantage, l'état de la pile dans le débugger de VTI et tout le reste - valeur des registres, ... on ne sait jamais, ça peut être utile -
Site : http://www.phareaway.com/
Membre du groupe Phare Away et webmaster du site