1

Bonjour tout le monde! Je suis actuellement en train de me mettre au C sur Ti68k, et j'ai un petit problème, qui vient probablement de l'utilisation des pointeurs avec les listes chaînées. Voilà mon code :
int PushOpponent(Opponent **opponents, int x, int y, int mov_x, int mov_y, int shield, int points, int dmg, unsigned char *sprite) {
Opponent *tmp = malloc(sizeof(Opponent));
if(!tmp) return 0;
tmp->x = x;
tmp->y = y;
tmp->mov_x = mov_x;
tmp->mov_y = mov_y;
tmp->shield = shield;
tmp->points = points;
tmp->dmg = dmg;
tmp->sprite = sprite;
tmp->prev = *opponents; // Avertissement : Assignment from incompatible pointer type
*opponents = tmp;
return 1; }

Le problème, c'est que quand j'utilise cette fonction pour ajouter un objet dans la liste, le programme crashe (au moins sur Virtual Ti), et me dit "Protected Memory Violation". Le compilateur me donne par ailleurs un avertissement à la ligne marquée sur le code, ce que je ne comprend pas, puisque, normalement, on passe à la fonction l'adresse (donc un double référence sur le premier élément de la liste) du tableau : **opponents devrait donc être le premier élément, et donc *opponents son adresse. Donc on déclare "struct Opponent *prev" dans la structure, et on utilise "tmp->prev = *opponents;" pour mettre dans le pointeur prev l'adresse du premier élément (qui devient le deuxième après l'ajout). La même erreur se retrouve dans la fonction censée libérer tous les éléments de la liste. Est-ce que j'ai faux quelque part? Merci de m'aider! Je joins également au post mon code source complet, donc si vous pouviez me donner quelques trucs pour l'améliorer, je vous en remercie!

tromb Fichier joint : Main.ctromb Fichier joint : Main.h

2

non si la déclaration de la structure est bien celle que tu dis alors il ne devrait pas y avoir de problème... (ni warning ni crash, en tout cas pas dans le code que tu as posté)
tu peux poster la définition exacte de ta structure ?

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

3

Elle est dans le fichier joint, mais sinon, la voilà :
// Enemies ship structure
typedef struct {
int x;
int y;
int shield;
int points;
int dmg;
int mov_x;
int mov_y;
unsigned char *sprite;
struct Opponent *prev; } Opponent;

4

euh alors c'est parce que tu as une struct Opponent définie ailleurs ; c'est un peu bête mais en C les types "Opponent" et "struct Opponent" n'ont a priori rien à voir, sauf si tu le dis explicitement au compilo (donc là il faudrait changer le "typedef struct" en "typedef struct Opponent" smile)

EDIT : et en général pour éviter ce genre de problème on écrit "struct opponent" au lieu de "struct Opponent", ça clarifie un peu la différence avec "Opponent" ^^

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

5

Bah en fait j'ai trouvé, c'était tout bête couic ... Je m'étais trompé dans la déclaration du pointeur vers l'instance de la structure. Je ne me rappelais plus trop les listes chaînées, et j'ai mis "Opponent **var", alors qu'il fallait écrire "Opponent *var" et utiliser &var pour le passer dans les fonctions. Ouf! Une bonne chose de résolue wink
A présent, j'aimerais savoir si vous connaissez des trucs complets sur ces sujets :
- Les niveaux de gris
- Un programme pour faire des sprites (j'ai essayé TiPaint, mais il fait des sprites bizarres en "unsigned long" alors qu'il les faudrait en "unsigned char".

Voilà c'est à peu près tout wink

6

ThunderFX (./5) :
Bah en fait j'ai trouvé, c'était tout bête couic ... Je m'étais trompé dans la déclaration du pointeur vers l'instance de la structure. Je ne me rappelais plus trop les listes chaînées, et j'ai mis "Opponent **var", alors qu'il fallait écrire "Opponent *var" et utiliser &var pour le passer dans les fonctions. Ouf! Une bonne chose de résolue wink

oui enfin ça ça ne résoud pas le warning j'imagine ?

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

7

ThunderFX (./5) :
- Les niveaux de gris

Hmmm, à part http://tigcc.ticalc.org/doc/gray.html, je ne vois pas ce qu'il te faudrait de plus.
- Un programme pour faire des sprites (j'ai essayé TiPaint, mais il fait des sprites bizarres en "unsigned long" alors qu'il les faudrait en "unsigned char".

Si c'est du 32×y, c'est bien en unsigned long qu'il te les faut. Si c'est du 16×y, c'est en unsigned short. unsigned char n'est que pour du 8×y. (En général, les sprites sont carrés, mais les routines de sprites prennent n'importe quelle hauteur.)
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

Pollux (./6) :
oui enfin ça ça ne résoud pas le warning j'imagine ?


Bien sûr que non, mais le programme fonctionne wink
Kevin Kofler (./7) :
Si c'est du 32×y, c'est bien en unsigned long qu'il te les faut. Si c'est du 16×y, c'est en unsigned short. unsigned char n'est que pour du 8×y. (En général, les sprites sont carrés, mais les routines de sprites prennent n'importe quelle hauteur.)


Effectivement, mais quand je mets un fichier 7*12 dans TiPaint, il me donnait un tableau gigantesque en unsigned long, donc je sais pas trop comment faire wink
EDIT : j'y pense, peut-être bien que le prog n'aime pas le 7*12 mais que TIGCC compile quand même et fonctionne avec... je vais essayer en 8*12