Besoin d'aide en C - C - Programmation
Marsh Posté le 01-06-2010 à 15:26:35
Salut
Le 1er: 1004 (enfin un pointeur de short qui pointe sur 1004) je pense mais je ne vois pas trop l'intérêt de tout ça.
Le 2e: pas compris. Exemple stp
Marsh Posté le 01-06-2010 à 15:32:56
Ok, merci donc si je comprends bien le cast (int*) ne sert à rien ?
Pour l'exemple voila :
typedef struct {
int W, H ;
unsigned char *rgb;
unsigned char *mask;
} Sprite ;
Je veux interdire l'accès aux champ de Sprite à l'utilisateur dans la suite de prog.
Marsh Posté le 01-06-2010 à 15:43:53
Tu ne manipules que des pointeurs vers Sprite et tu n'en exposes pas la definition. (Le C++ permet d'etre plus fin, pas le C).
Marsh Posté le 01-06-2010 à 16:25:59
Je dirais même
(short*)(1000 + 4)
ou
(short*) (1004)
Pour les valeurs immédiates on peut raccourcir (c'est plutôt rare des valeurs immédiates pour des pointeurs). Sur un pointeur, le cast en (char*) permet d'ajouter 4 octets au lieu de 4*sizeof(pointeur)
Code :
|
Marsh Posté le 01-06-2010 à 20:15:07
Merci pour toute vos réponse. Mais voila je n'y arrive toujours pas.
Je souhaite créer un Sprite à partir de ce code à trou pouvez-cous m'aider.
code : http://petiois.free.fr/Public/sprite.c
Merci
Marsh Posté le 01-06-2010 à 21:45:55
Oui on peut t'aider. Pas faire le boulot.
Je peux avoir l'énoncé? Certaines choses éveillent ma curiosité.
Marsh Posté le 01-06-2010 à 21:57:32
Voila le sujet http://petiois.free.fr/Public/sujet.pdf
Marsh Posté le 01-06-2010 à 22:08:17
Montre ce que tu as fait et dis où tu bloques.
Marsh Posté le 01-06-2010 à 22:09:07
j'ai fait ça pour la création du Sprite mais je ne sais pas si ca fonctionne :
Sprite * createSprite(int w, int h){
Sprite * newSprite;
newSprite = malloc (sizeof (Sprite));
newSprite.W -> w ;
newSprite.H -> h;
return newSprite;
Marsh Posté le 01-06-2010 à 22:23:29
L'affectation c'est "=", pas "->"
Manque aussi l'accolade fermante:} .
Marsh Posté le 01-06-2010 à 22:24:12
Petiois a écrit : Ok, merci donc si je comprends bien le cast (int*) ne sert à rien ? |
Tu peux pas. Tu le pourrais en C++ mais pas en C. Mais tu parles de "utilisateur"... les champs sont accessible au programmeur, pas à l'utilisateur (qui n'aura accès, lui, qu'à ton programme compilé).
Petiois a écrit : j'ai fait ça pour la création du Sprite mais je ne sais pas si ca fonctionne : |
J'ai pas lu le sujet ni le code. Mais si newSprite est un pointeur, alors le membre W sera adressé par newSprite->W et non newSprite.W.
Tu voulais sans-doute écrire
newSprite->W=w ;
newSprite->H=h;
PS: si tu nommais ton type "t_sprite", tu pourrais mieux faire la différence entre "type" et "variable"...
Marsh Posté le 01-06-2010 à 22:28:01
Ok donc je dois plus faire un truc du genre :
Sprite * createSprite(int w, int h){
Sprite * newSprite;
newSprite = malloc (sizeof (Sprite));
newSprite->W=w ;
newSprite->H= h;
return newSprite;
??
Marsh Posté le 01-06-2010 à 22:30:15
Petiois a écrit : Ok donc je dois plus faire un truc du genre : |
Un poil plus professionnel...
Code :
|
Marsh Posté le 01-06-2010 à 22:35:52
Petiois a écrit : j'ai fait ça pour la création du Sprite mais je ne sais pas si ca fonctionne : Sprite * createSprite(int w, int h){ |
J'aimerais bien savoir où ton prof est allé chercher sa vérification de l'allocation... En tout cas quoi qu'il ait voulu faire, ça n'a pas l'air de fonctionner chez moi...
Pour ceux qui n'ont pas le sujet:
Code :
|
Citation : Attention, il risque d’avoir plusieurs malloc à faire. |
Tu n'en fais qu'un. Où vas-tu mettre tes pixels et tes informations de transparence?
Plusieurs malloc = plusieurs free... Où est la fonction destroySprite?
Citation : Pour simplifier le travail ulté́rieur, la largeur du sprite est arrondie au multiple de 8 supé́rieur |
donc newSprite->W = w c'est faux.
je suppose que dans la fonction erreur, c'est
printf("%s\n",s) ;
et non
printf("%s\n" ) ;
Marsh Posté le 01-06-2010 à 23:10:58
On dirait bien.
Marsh Posté le 01-06-2010 à 23:25:00
Et si je fais un truc du genre est-ce bon ?
Sprite * createSprite(int w, int h){
Sprite * newSprite;
char* color;
char* transparence;
newSprite = malloc (sizeof (Sprite));
color=malloc(3*sizeof(Sprite));
transparence=malloc(Sprite));
newSprite.W -> w ;
newSprite.H -> h;
return newSprite;
Car si j'ai bien compris, il faut 3 octets pour définir la couleur donc il y a en tout 3*octet*sizeof(Sprite) ?
Marsh Posté le 01-06-2010 à 23:30:55
Le pointeur rgb est un tableau de pixels. En effet, il faut 3 octets pour la couleur (rouge, vert et bleu). Donc tu auras bien 3*qqchose dans ton malloc.
Par contre sa taille n'a rien à voir avec celle de la structure Sprite. Il doit simplement être capable de stocker autant de pixels qu'en contient ton image. Combien de pixels contient ton image?
Pour le masque, un seul octet par pixel suffit.
Tu n'as pas besoin de créer de nouveaux pointeurs color et transparence, tu as déjà rgb et mask dans ta structure
Marsh Posté le 01-06-2010 à 23:31:55
ptitchep a écrit :
|
Ouaip. J'avais pas lu l'énoncé et j'ai juste voulu corriger "newSprite.W->w". Bah, suffit d'écrire
Code :
|
et c'est réglé.
Petiois a écrit : Et si je fais un truc du genre est-ce bon ? |
Fuite de mémoire. Tu alloues de la mémoire et tu stockes les pointeurs associés dans des variables qui disparaissent une fois la fonction terminée. Les pointeurs sont perdus et la mémoire allouée reste allouée pour rien.
Petiois a écrit : Car si j'ai bien compris, il faut 3 octets pour définir la couleur donc il y a en tout 3*octet*sizeof(Sprite) ? |
T'as vraiment rien pipé à l'énoncé !!! Un sprite c'est une structure permettant de gérer une image dans son intégralité. Je vois pas pourquoi rgb contiendrait 3 structures sprites (sous-entendu 3 structures permettant de gérer chacune une image !!!)
rgb est un tableau contenant 3 octets par pixel !!!
PS: si j'étais toi, je définirais aussi une structure rgb...
Petiois a écrit : |
Ouais t'as raison. Je me demande vraiment pourquoi j'écris des trucs parfois...
Marsh Posté le 01-06-2010 à 23:47:35
Sve@r a écrit : PS: si j'étais toi, je définirais aussi une structure rgb... |
Impossible c'est un sujet pourri à trous. Il faut remplir certaines fonctions en fait...
Petiois tu veux faire ça pour rendre en cours en respectant les consignes ou faire un truc bien?
Marsh Posté le 01-06-2010 à 23:52:55
ptitchep a écrit : |
Ouaip, je suis en train de le regarder (et j'édite mon post précédent au fur et à mesure). Bon, c'était pas primordial de toute façon. Au lieu d'avoir une structure qui découpe elle-même ses couleurs ben faut les découper soi-même en divisant ou en multipliant par 3 selon si on lit ou si on va lire les composantes RGB. Pas catastrophique à coder...
ptitchep a écrit :
|
A mon avis, vu cette nullité qu'il s'obstine à réécrire sans même avoir eu la politesse de lire les posts de ceux qui tentent d'apporter de la clarté dans sa mélasse, vaut mieux qu'il se contente de répondre pile-poil à l'énoncé...
Marsh Posté le 02-06-2010 à 00:11:29
Sve@r a écrit : Bah, suffit d'écrire
et c'est réglé. |
Ah bon?
Code :
|
Citation : 16 |
Cest pas beau à voir mais j'avais fait
w + ((8-w%8) % 8)
Bon je n'ai pas cherché mieux j'ai rempli les fonctions vite fait pour que ça m'affiche les sprites.
Sve@r tu as une idée pour la vérif du prof? Il regarde à l'indice -1 pour trouver la taille du tableau (je pense...) ? Mais je n'ai jamais vu quelqu'un faire ça, ça ne fonctionne pas chez moi (architecture?) et si c'est bien ça, pourquoi encadrer la valeur avec des inégalités?
Je trouve que ça sent fort le prof qui lance le programme et regarde le résultat sans vérifier le code... Ça ne lui prendrait pas plus de temps de regarder comment est allouée la mémoire.
Marsh Posté le 02-06-2010 à 00:39:00
ptitchep a écrit :
|
Erreur de ma part. J'ai tapé de tête en croyant que le décalage avait la même priorité que la multiplication.
Bon, pour le fun, voici la bonne opération que j'aurais dû écrire
(((w - 1) >> 3) + 1) << 3
ptitchep a écrit : Cest pas beau à voir mais j'avais fait |
Non, j'aime bien aussi. C'est juste pour se faire plaisir quoi.
ptitchep a écrit : Sve@r tu as une idée pour la vérif du prof? Il regarde à l'indice -1 pour trouver la taille du tableau (je pense...) ? Mais je n'ai jamais vu quelqu'un faire ça, ça ne fonctionne pas chez moi (architecture?) et si c'est bien ça, pourquoi encadrer la valeur avec des inégalités? |
Tu veux parler de
Code :
|
Incompréhensible. On dirait que lui-aussi il se fait plaisir. Mais comme tu dis c'est probablement lié à l'architecture de sa machine. Autrement dit, ce qu'il a écrit c'est tout sauf portable. En plus, je me demande la tronche qu'aura sa variable "sz" si malloc a renvoyé NULL...
ptitchep a écrit : Je trouve que ça sent fort le prof qui lance le programme et regarde le résultat sans vérifier le code... Ça ne lui prendrait pas plus de temps de regarder comment est allouée la mémoire. |
Bah oui. Il alloue son sprite et remplit les pointeurs à null. Ensuite il alloue les pointeurs internes et si une des allocations se passe mal, alors il appelle freeSprite() qui se charge de libérer les pointeurs internes qui ne sont pas à null. C'est sûr qu'avec un prof pareil, Petiois a du soucis à se faire...
Marsh Posté le 02-06-2010 à 00:45:07
Sve@r a écrit : |
En effet.
Sve@r a écrit : |
C'est bien ce que je pensais.
Ça doit servir à expliquer aux élèves ce qu'il ne faut pas faire, c'est volontaire.
Sve@r a écrit : |
On est d'accord.
Marsh Posté le 02-06-2010 à 00:50:31
ptitchep a écrit : On est d'accord. |
Et en plus, si jamais il y a un pb interne, il appelle "erreur()" qui fait un exit brutos. Sortir proprement il connait ça le prof ??? Bah c'est pas la peine. On a qu'à laisser zindow gérer le caca...
Marsh Posté le 02-06-2010 à 09:27:08
Ah ok j'ai compris, merci ptitchep.
Citation : A mon avis, vu cette nullité qu'il s'obstine à réécrire sans même avoir eu la politesse de lire les posts de ceux qui tentent d'apporter de la clarté dans sa mélasse, vaut mieux qu'il se contente de répondre pile-poil à l'énoncé... |
Et pour ta gouverne Sve@r, je prends le temps de lire tous les posts. C'est juste que je ne pige pas tout en C sinon je ne viendrais pas poser des question sur ce topic !!
Marsh Posté le 02-06-2010 à 14:45:23
Citation : |
J'ai déjà entendu parler de ça, des archis sur lesquelles des informations sont stockées à l'indice -1.
D'ailleurs si je ne me trompe pas, les std::vector du C++ stockent aussi des infos à l'indice -1 auxquelles ils ne faut généralement surtout pas toucher. Mais je n'ai jamais approfondi la question pour pouvoir vous en dire plus.
Marsh Posté le 02-06-2010 à 15:56:48
Mouais, ça pue la bidouille...
En tout cas pas mal de ses étudiants doivent pleurer devant le pc parce qu'ils ne passent pas la première question...
Marsh Posté le 02-06-2010 à 17:27:07
Petiois a écrit : Et pour ta gouverne Sve@r, je prends le temps de lire tous les posts. |
La preuve que non puisque t'as réécrit un truc que je t'avais corrigé. Et ça, c'est incontournable.
Petiois a écrit : C'est juste que je ne pige pas tout en C sinon je ne viendrais pas poser des question sur ce topic !! |
Ah oui, j'oubliais l'excuse facile du "je pige pas tout" . Me dit pas qu'on te fait faire du travail avec des structures sans t'avoir expliqué la différence entre "->" et ".". Et me dit pas qu'on t'a jamais informé qu'une affectation se faisait via l'opérateur "="...
Lan Wezel a écrit : |
Le Pascal fait ça aussi. Il stocke la taille allouée dans la case mémoire située juste avant la variable allouée. Ptet que le prof vient du Pascal...
Marsh Posté le 02-06-2010 à 18:01:34
Sve@r a écrit : |
Le Pascal ne fait pas ca plus que le C. En C comme en Pascal, c'est l'utilisation d'un detail d'implementation vraisemblablement meme pas documente pour l'implementation utilisee.
Marsh Posté le 02-06-2010 à 18:53:22
Lan Wezel a écrit :
|
Tu te trompes
Marsh Posté le 02-06-2010 à 21:30:50
ReplyMarsh Posté le 02-06-2010 à 22:05:37
snafu8 a écrit : Putain Joel, on t'a jamais dit d'être cool avec les gens? |
je suis cool, j'ai pas dit "tu te trompes boulard"
Marsh Posté le 02-06-2010 à 22:19:18
Petiois a écrit : Merci pour toute vos réponse. Mais voila je n'y arrive toujours pas. |
Elle vaut son pesant de cacahuète cette fonction :
Code :
|
Il alloue une colormap de 64Mo . Ils sont au courant tes profs que c'est juste en 8bits que t'a besoin d'une colormap ? Ce n'est qu'un cas d'école certes, mais tout de même.
Marsh Posté le 04-06-2010 à 13:17:35
Vous croyez qu'on a fait peur à Petiois à force de dire que son prof est nul ou bien qu'il a réussi son exercice?
Marsh Posté le 11-06-2010 à 18:51:21
Joel F a écrit : |
Peux-tu m'expliquer le comportement suivant alors :
Attention code vraiment crado pour mettre en évidence le comportement des vectors.
Code :
|
Provoque l'envoi d'un SIGABRT lors de la désallocation du vector. Par contre si l'on ne touche pas à l'indice -1 (même en modifiant le -2 ou le size+1) le programme s'exécute et se termine correctement.
Donc on peut toucher à tous les indices sans provoquer de problème (enfin faut le dire vite) sauf l'indice -1.
Marsh Posté le 11-06-2010 à 20:50:30
tu ecrases simplement le pointeur de fin du vector qui est stockée à coté du pointeur de début. Aucun rapport avec stocker des trucs en v[-1].
RTFM
Marsh Posté le 11-06-2010 à 22:19:01
ptitchep a écrit : Vous croyez qu'on a fait peur à Petiois à force de dire que son prof est nul ou bien qu'il a réussi son exercice?
|
Là Petiois a maintenant vraiment de quoi avoir peur. Je pense même que c'est susceptible de le dégoûter du C
Marsh Posté le 01-06-2010 à 15:13:33
Salut,
Je viens de me lancer dans le langage C, et je rencontre deux petit problème.
Le 1er : Je n'arrive pas à savoir ce que vaut (short *)(int *)(((char *)1000)+4)
Le 2e : C'est un problème de syntaxe, j'aimerai limiter l'accès aux champs d'un bout de programme en C ?
Merci
Message édité par Petiois le 01-06-2010 à 15:14:11