1

J'ai quelques petits problème que je vais essayé d'exposer clairement grin

Voilà à quoi rtessemble mon code :

unsigned char *chose = {"Bidule", "Truc", "Machin", "Chouette", "999", "1", "0"}

et voilà ce que j'obtient en mémoire:

Bidule*Truc*Machin*Chouette*999*1*0*

avec * le caractère 0 du code ascii soit fin de chaine.

D'après le bouquin dans lequelle j'ai appris je devrais obtenir:

Bidule*##Truc*####Machin*##Chouette*999*#####1*#######0*#######

Enfin jusque là c'est pas trop grave une fois qu'on le sait, mais si je m'avise de renter deux fois la même chaine de caractère, la seconde est purement et simplement sauter, je ne peux la retrouver.
C'est vraiment génant vu que je passe ce pointeur en argument à un fonction.
Que puis-je faire pour y remédier? Il y a-t-il un erreur dans mon code?


[Edit] Hem, j'ai envoyé par mégarde avant d'avoir fini...
...

2

Riri :
que je vais essayé d'exposer clairement grin

erf, c pas gagné cheeky

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

3

Ou est le probleme ?

4

-

5

Riri :
D'après le bouquin dans lequelle j'ai appris je devrais obtenir:

Bidule*##Truc*####Machin*##Chouette*999*#####1*#######0*#######
ben, soit ton bouquin raconte des betises, soit il faut que tu le relise attentivement.
Pour obtenir,ca, il faut utiliser le code d'Orion.
D'ailleurs, si tu compile ce truc, il doit te metrre pleins de warning !
et voilà ce que j'obtient en mémoire:

Bidule*Truc*Machin*Chouette*999*1*0*
[...] Enfin jusque là c'est pas trop grave une fois qu'on le sait, mais si je m'avise de renter deux fois la même chaine de caractère, la seconde est purement et simplement sauter, je ne peux la retrouver.
Le compilateur a fait des optimisations : en fait chaque chaîne est déclarée indépendament. Donc toute chaîne redondante est inutile, donc virée.
Et a mon avis, il a fait pointer chose sur la première chaîne de caractère.
Et rien qu'au "typage", on voit que c'est pas correct : d'un coté tu as un poiteur de chaine de caractere et de l'autre tu as un tableau de pointeur de chaines de caracteres.

6

Oui. En fait quand le compilateur voit :

unsigned char *chose = {"Bidule", "Truc", "Machin", "Chouette", "999", "1", "0"};

il fait comme si tu avais écrit

unsigned char *chose = "Bidule";

et te met, en principe, un warning en plus qui devrait te mettre la puce à l'oreille. La seule différence au niveau du fichier produit, c'est que ton compilateur n'optimise pas très bien, et que dès qu'il voit une chaîne de caractères, il la rajoute dans l'exécutable (même si elle n'est pas utilisée). Avec un compilateur comme GCC, seule la chaîne "Bidule" sera rajoutée dans l'exécutable et donc les deux codes que j'ai donnés sont strictement équivalents.


En plus, même dans le cas où le compilateur laisserait toutes les chaînes, tu n'as aucune garantie qu'elles sont effectivement dans l'ordre où tu les as déclarées : ça peut très bien être l'ordre inverse (c'est même assez courant).

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

7

Pollux
: Avec un compilateur comme GCC, seule la chaîne "Bidule" sera rajoutée dans l'exécutable

Si le tableau est global, il va forcément les mettre toutes, parce que d'autres fichiers .c pourraient en avoir besoin.
Et même pour les tableaux locaux, il va probablement falloir attendre la branche de développement tree-ssa pour une scalarisation efficace.
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é

8

Kevin Kofler
:
Pollux
: Avec un compilateur comme GCC, seule la chaîne "Bidule" sera rajoutée dans l'exécutable

Si le tableau est global, il va forcément les mettre toutes, parce que d'autres fichiers .c pourraient en avoir besoin.
Et même pour les tableaux locaux, il va probablement falloir attendre la branche de développement tree-ssa pour une scalarisation efficace.

trifus
Non, ce que je veux dire c'est que le reste du tableau est carrément ignoré (ça passe juste par le parseur et ça va direct à la poubelle).

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

9

10

Lol nounoun, je fais mieux, ça y est, je me met vraiment à l'asm...
...

11