1

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?

2

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).
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

3

Merci
donc si je veux passer uniquement la chaine de caractere je dois obligatoirement specifier la taille qu'elle vas prendre?

4

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.
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

5

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?

6

Excuse moi pour la deuxieme question tu viens d'y repondre

7

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.
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

8

Geogeo... neutral

void fonction(const unsigned char *txt) 
{ 
DrawStr(x,y,txt,A_NORMAL); 
}

void _main(void)
{
fonction("stuff");
}


Nyko > Ceci devrait marcher sans problème et surtout sans warnings (à part x et y qui ne sont pas définis) smile
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

9

Ou sinon il y a un switch pour désactiver ce genre de warning.

Nyko> comme le dit Vertyos, essaye d'oublier les posts antérieurs au ./8 ...

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

10

rotfl
*** Ne sous-estimez pas la puissance de la Marmotte ***
© Marmotte Team : LaMarmotte, sBibi, Vark & sabrina

11

trisotfl
avatar
I'm on a boat motherfucker, don't you ever forget

12

Il reste clair que le message d'erreur du compilateur est quand meme un peu cryptique :/

Meme moi je m'y perdrait trigni

Vertyos> Tu est sûr qu'il faille le unsigned ? (question con)
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.

13

Non.
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é

14

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.
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#

15

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).
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

16

Perso je mets des const partout, et j'en enleve seulement lorsque c'est necessaire

17

c'est quoi l'interet de const? ca améliore l'optimisation?
avatar

18

Ca evite les bugs smile

19

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

20

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

21

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)

22

perso une fois un prof nous a dit que const etait tellement inutile (le compilo la plus pars du temps ne le prend pas en compte) et sa a souvent tendance a porter confusion au niveau du code, ni a savoir exactement pq il y a un const que pour lui const ne servait a rien et qu'il était la pour on ne sais quelle raison neutral
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.

23

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.
avatar
;)

24

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: ...
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

25

Je pense qu'il parlait de constantes genre entiers, parce qu'un #define pour créer un tableau c assez moyen tongue

Et effectivement const est préférable en C++ dans la mesure où on peut le définir dans un namespace donné.

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

26

Oui je pense qu'en C le define est préférable car on peut pas faire ça:
const int MAX_LENGTH 10;
char chaine[MAX_LENGTH];


C'est quoi un namespace?
avatar
;)

27

=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)

28

hum pour le = 10... trigic

Et donc ça veut dire quoi le
using namespace std;
avatar
;)

29

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

30

#28

A priori le #define est géré par le préprocesseur et remplace tte occurence de "CONST" (dans ton cas) par 2.1 dans le reste du code donc sa devrai marcher sans pbm

genre tu peu bien faire (et sa marche)

/* converti de radian en degre */
#define RAD2DEG(x) ( (double)(x*180) / PI )

et ça marche (si je me suis pas planté dans la formule triso)

donc oui normalement tu peut mettre des flottant dans un #define


edit: Correction de conneries....
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.