Nyko Le 13/10/2003 à 23:12 le code si dessous fonctionne mais j'ai une erreur (discards qualifiers from pointers target type) sur le compilateur
void fonction(char *txt)
{
DrawStr(x,y,txt,A_NORMAL);
}
void _main(void)
{
fonction("stuff");
}
Par contre ci je modifie la fonction Main comme cela, je n'ai plus de probleme
void _main(void)
{
char txt[10]="Stuff";
fonction(txt);
}
Pourquoi le premier exemple ne marche pas?
Un pointeur ici *txt ne peux pas contenir de texte, il a une taille fixe de 4 octets donc ce message est un avertissement de TIGCC comme quoi il ne connaît pas la taille des données pointé par *txt qu'il devra traiter.
Dans le deuxième exemple tu identique cette taille qui est de 10 octets.
Il y a une différence entre un pointeur et une zone de données (ici une liste de 10 octets).
Nyko Le 13/10/2003 à 23:18 Merci
donc si je veux passer uniquement la chaine de caractere je dois obligatoirement specifier la taille qu'elle vas prendre?
Oui dans le cas ou cette chaîne de caractères ne change pas de taille ou si c'est le cas avec une taille maximum prédéfinie.
Nyko Le 13/10/2003 à 23:29 J'ai remplacé
char *txt
par
char txt[10]
et j'ai toujours la meme erreur lorsque je compile
Et pourquoi
txt[10] et "Stuff" c'est pas la meme chose?
Nyko Le 13/10/2003 à 23:31 Excuse moi pour la deuxieme question tu viens d'y repondre
Ce n'ai pas un message d'erreur c'est un warning, qui te signale juste que si tu dépasse la zone de ton texte ici txt[10] et donc que tu y rentre un texte >10 lettres, ton programme plantera.
char *txt=stuff;
Est un pointeur qui pointe sur le mot stuff. Un pointeur pointe sur une zone dont la taille doit être connus.
char txt[10];
est une zone qui fait 10 octets. Plus précisément une liste de 10 élément de type char donc 1*10 octet car 1 char=1 octet.
Dans ton programme char *txt pointera sur la zone qui contient le texte que tu veut.
Et char txt[10] contiendera le texte de taille égale ou inférieur à 10 octets.
La notion de pointeur est difficle en C et s'apprend progressivement. TIGCC affiche ce message dans le but de manipuler correctement la variable déclarée.
Sally Le 14/10/2003 à 12:11 L'explication du message d'erreur est que "stuff" est de type const char * (c'est un pointeur vers une chaîne de caractères qu'on n'a pas le droit de modifier). Le mot-clef const est un qualifier, et si tu définis ta fonction pour qu'elle prenne comme argument un char * sans préciser const, ce « qualifier » est oublié (« discarded ») lors de l'appel de la fonction. (Autrement dit la fonction pourrait si elle voulait s'amuser à modifier la chaîne qu'on lui passe en argument). D'où le warning.

« 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#
Zeph Le 14/10/2003 à 12:11 Non non, ce n'est pas obligatoire du tout mais c'est une habitude que j'ai prise (sachant que les caractères ASCII sont numerotés de 0 à 255, ça me semble plus logique).

All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez
par ici :)
PpHd Le 14/10/2003 à 15:15 Perso je mets des const partout, et j'en enleve seulement lorsque c'est necessaire
Uther Le 14/10/2003 à 15:27 c'est quoi l'interet de const? ca améliore l'optimisation?
le const permet de dire au compilateur que la variable passé en paramettre a la fonction n'est pas sensé etre modifié lors de l'execution de la fonction.

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.
On m'avait dit que parfois ça avait un avantage d'utiliser ça plutôt que #define, mais j'ai oublié dans quel cas...

« 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
. »
Pour quoi? const int value = 5; plutôt que #define value 5 ? Hum, à part que c'est plus propre mais que certains compilos risquent de ne pas bien l'optimiser (et qu'on ne peut pas l'utiliser par exemple pour la taille d'un array), je ne vois pas.
« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)
BiHi Le 14/10/2003 à 20:30 En C, c'est conseillé par Kernigan et Ritchie dans leur bouquin d'utiliser #define.
En C++, c'est conseillé par Stroustup dans son bouquin d'utiliser const.

;)
Peut-être que les variables décarées const peuvent être stockées dans la section code, vu qu'elles ne doivent (normalement) pas être modifiées, non ? 'je pense surtout aux chaînes)
EDIT: ...
=10 ...
Un namespace en gros c'est lié à la portée des variables : en C, quand tu déclares une var au milieu d'une fonction, sa portée ne dépasse pas la fonction. Le C++ généralise ça à la portée pour la classe courante. En gros, à l'intérieur de la classe on peut y accéder, à l'extérieur on est obligé de faire MaClasse::identificateur, ce qui permet une conception plus modulaire sans conflits de noms dans les gros progs.
« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)
On peut faire des #define CONST 2.1 ou pas ? En fait, je me souviens, notre pof nous avait dit que dans la cas où on avait besoin de définir une constante réelle (par opposition à entière) on ne pouvait pas utiliser #define et on devait donc utiliser const. Mais ce prof s'est souvent trompé, donc est-ce que c'est vrai tout ça ?

« 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
. »