Question de débutant
Le
Tanguy Briançon
Bonjour,
int c;
struct points {
float x;
float y;
char couleur;
char *nom;
char *type;
char visible;
};
typedef struct points point;
point points[20];
Je fais
char *t;
t=points[c].type;
puis je veux faire quelque
chose avec points[*t].x je me fais
jeter par le compilateur (gcc). Par contre si je fais
char *t;
int p;
t=points[c].type;
p=*t;
puis je peux faire quelque
chose avec points[p].x Aucun problème
Une explication?
int c;
struct points {
float x;
float y;
char couleur;
char *nom;
char *type;
char visible;
};
typedef struct points point;
point points[20];
Je fais
char *t;
t=points[c].type;
puis je veux faire quelque
chose avec points[*t].x je me fais
jeter par le compilateur (gcc). Par contre si je fais
char *t;
int p;
t=points[c].type;
p=*t;
puis je peux faire quelque
chose avec points[p].x Aucun problème
Une explication?

Poser une question


*t est un char, or GCC n'aime pas les indexation par des char. Ca peut
poser des pbs de portabilité je crois (char est parfois signé, parfois
pas). Par contre:
t = point[255 & *t].x
devrait mieux passer. Ce cas marche indépendamment du fait que *t soit
signé ou pas, et qu'on souhaite un indexe entre 0 et 255 (donc >=0). Si
on veut un indexe entre -128 et 127, alors on doit pouvoir faire quelque
chose du genre:
t = point[(int)(signed char)*t].x
Mais les indexes négatifs sont rarement utilisés en pratique et la
construction avec un masque à 255 est ce qu'on retrouve habituellement.
sam.
Pourquoi un pluriel à ton nom de type ?
Jeter ? Moi il me dit juste
warning: array subscript has type ‘char’
Le fait est que char est parfois signé, parfois non... Et souvent, cela
n'est pas connu des programmeurs.
En fait, si tu explicites ton intention (avec un signed char ou un
unsigned char), le compilo ne dit plus rien.
Ceci dit, il semble bizarre ton code. C'est quoi ce char* qui code le type ?
C'est une chaine de caractère ? Si oui, pourquoi utiliser le premier caractère
comme indice ?
Idem avec tes couleurs. Est-ce que char est le bon type ? Tu veux un type
énuméré ou un codade de couleur 8bits (et autant utiliser un unsigned char
il me semble).
Marc Boyer
--
En prenant aux 10% des francais les plus riches 12% de leurs revenus,
on pourrait doubler les revenus des 10% les plus pauvres.
http://www.inegalites.fr/spip.php?a...amp;id_mot0
D'une part, tu fais l'hypothèse d'une machine en complément à deux
(mais ça reste raisonnable comme hypothèse).
Après, si sizeof(char) == sizeof(int), je ne garantirais pas
le résultat pour un *t négatif (faudrait regarder la norme).
Enfin, tout ça pour éviter un warning qui vient du fait que
la déclaration est semble-t-il mauvaise.
Autant déclarer directement t comme un
unsigned char*
Marc Boyer
--
En prenant aux 10% des francais les plus riches 12% de leurs revenus,
on pourrait doubler les revenus des 10% les plus pauvres.
http://www.inegalites.fr/spip.php?a...amp;id_mot0
Pourquoi pas?
Oui bien sur mais comme je n'y connais pas grand chose en C je veux
essayer d'éviter au maximum les avertissements...
C'est mon cas...
Ok merci...
type n'est pas une chaine de caractère au sens strict du terme:
je m'en sers pour stocker des données associées à chaque point:
le premier "caractère" me donne le type de point et les deuxième,
troisième des infos (qui sont souvent un indice vers un tableau...).
A priori pour la couleur les fonctions que j'utilise sont déclarées
en demandant un char donc j'ai mis un char sans réfléchir...
couleur ne peut contenir que 0x00,0x11,...,0xFF (16 couleurs donc).
Je précise que mon programme n'est destiné qu'aux calculatrices
hp49g+/hp50 où la mémoire est très limitées. Je me suis mis
au C (via un petit livre de poche...) que pour continuer à programmer
ma calculatrice (avant je le faisais en assembleur sur un processeur 4
bits) maintenant le processeur est un ARM et il existe les librairies
qui vont bien pour programmer la calculatrice en C...
Tanguy Briançon
Bien sur pour moi programmer ma calculatrice est un loisir
(ce n'est pas plus idiot que de faire des mots croisés ou des
sudokus...)
Ben, parce que le nom d'un type doit correspondre à sa sémantique,
et que je vois rien dans ta déclaration qui spécifie que cela désigne
plusieurs points.
Bonne démarche.
Et est-ce bien utile d'en faire un pointeur dans ce cas ?
Est-ce une information partagée ?
Et en plus un pointeur sur un tableau de char, c'est un peu brut
comme information. Pourquoi ne pas faire un type spécifique ?
Si c'est l'API qui l'impose, en effet.
Marc Boyer
--
En prenant aux 10% des francais les plus riches 12% de leurs revenus,
on pourrait doubler les revenus des 10% les plus pauvres.
http://www.inegalites.fr/spip.php?a...amp;id_mot0