Besoin d'aide en C

Besoin d'aide en C - C - Programmation

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
Reply

Marsh Posté le 01-06-2010 à 15:13:33   

Reply

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


---------------
deluser --remove-home ptitchep
Reply

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.

Reply

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


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

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 :
  1. int* lala;
  2. short *pouet;
  3. ...
  4. pouet = (short*)(lala + 4); /* pouet = lala + 4*sizeof(int) */
  5. pouet = (short*)( ((char*)lala) + 4); /* pouet = lala + 4 enfin pouet = lala + 4*sizeof(char) mais sizeof(char) = 1*/


---------------
deluser --remove-home ptitchep
Reply

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

Reply

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


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 01-06-2010 à 21:57:32    

Voila le sujet   http://petiois.free.fr/Public/sujet.pdf


Message édité par Petiois le 01-06-2010 à 21:58:04
Reply

Marsh Posté le 01-06-2010 à 22:08:17    

Montre ce que tu as fait et dis où tu bloques.


---------------
deluser --remove-home ptitchep
Reply

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;

Reply

Marsh Posté le 01-06-2010 à 22:09:07   

Reply

Marsh Posté le 01-06-2010 à 22:23:29    

L'affectation c'est "=", pas "->"
Manque aussi l'accolade fermante:} .


Message édité par breizhbugs le 01-06-2010 à 22:24:07
Reply

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


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 :
 
Sprite * createSprite(int w, int h){
Sprite * newSprite;
newSprite = malloc (sizeof (Sprite));
newSprite.W -> w ;
newSprite.H -> h;
return newSprite;


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


Message édité par Sve@r le 01-06-2010 à 22:28:36

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

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;
 
??

Reply

Marsh Posté le 01-06-2010 à 22:30:15    

Petiois a écrit :

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;
 
??


 
Un poil plus professionnel...
 

Code :
  1. t_sprite* createSprite(int w, int h){
  2.    t_sprite* newSprite;
  3.    newSprite = malloc(sizeof (t_sprite));
  4.    if (newSprite == NULL) return NULL;
  5.  
  6.    newSprite->W=w ;
  7.    newSprite->H= h;
  8.    return newSprite;
  9. }


Message édité par Sve@r le 01-06-2010 à 22:30:58

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 01-06-2010 à 22:31:18    

ok merci

Reply

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){
Sprite * newSprite;
newSprite = malloc (sizeof (Sprite));
newSprite.W -> w ;
newSprite.H -> h;
return newSprite;

 

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 :
  1. Sprite *spr = createSprite(17, 32) ;
  2.    int sz = ((int *)(spr))[-1] ;
  3.    if((sz<16)||(sz>50)) erreur("Allocation" ) ;
  4.    sz = ((int *)(spr->rgb))[-1] ;
  5.    if((sz<2300)||(sz>2400)) erreur("Allocation RGB" ) ;
  6.    sz = ((int *)(spr->mask))[-1] ;
  7.    if((sz<96)||(sz>130)) erreur("Allocation mask" ) ;
 
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? :pfff:

 
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" ) ;

Message cité 1 fois
Message édité par ptitchep le 01-06-2010 à 22:43:47

---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 01-06-2010 à 22:58:27    

je dois donc faire 3 malloc ?

Reply

Marsh Posté le 01-06-2010 à 23:10:58    

On dirait bien.


---------------
deluser --remove-home ptitchep
Reply

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

Reply

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


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 01-06-2010 à 23:31:55    

ptitchep a écrit :

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.


Ouaip. J'avais pas lu l'énoncé et j'ai juste voulu corriger "newSprite.W->w". Bah, suffit d'écrire  

Code :
  1. newSprite->W = ((w - 1) >> 3) << 3 + 1

et c'est réglé.
 

Petiois a écrit :

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


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 :


newSprite.W -> w ;
newSprite.H -> h;


Ouais t'as raison. Je me demande vraiment pourquoi j'écris des trucs parfois...  :o  :o  :o

Message cité 1 fois
Message édité par Sve@r le 01-06-2010 à 23:56:20

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

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?

Message cité 1 fois
Message édité par ptitchep le 01-06-2010 à 23:49:41

---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 01-06-2010 à 23:52:55    

ptitchep a écrit :


Impossible c'est un sujet pourri à trous. Il faut remplir certaines fonctions en fait...


 
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 :

Petiois a écrit :


newSprite.W -> w ;
newSprite.H -> h;


Petiois tu veux faire ça pour rendre en cours en respectant les consignes ou faire un truc bien?


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

Message cité 1 fois
Message édité par Sve@r le 02-06-2010 à 00:01:00

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 02-06-2010 à 00:11:29    

Sve@r a écrit :

Bah, suffit d'écrire

Code :
  1. newSprite->W = ((w - 1) >> 3) << 3 + 1

et c'est réglé.


Ah bon?

 
Code :
  1. printf("%d\n", ((16 - 1) >> 3) << 3 + 1 );
  2.         printf("%d\n", ((17 - 1) >> 3) << 3 + 1 );
  3.         printf("%d\n", ((21 - 1) >> 3) << 3 + 1 );
  4.         printf("%d\n", ((23 - 1) >> 3) << 3 + 1 );
  5.         printf("%d\n", ((24 - 1) >> 3) << 3 + 1 );
  6.         printf("%d\n", ((25 - 1) >> 3) << 3 + 1 );
 
Citation :

16
32
32
32
32
48

 

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.

Message cité 1 fois
Message édité par ptitchep le 02-06-2010 à 00:30:13

---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 02-06-2010 à 00:39:00    

ptitchep a écrit :


Ah bon?  
 

Code :
  1. printf("%d\n", ((16 - 1) >> 3) << 3 + 1 );
  2.         printf("%d\n", ((17 - 1) >> 3) << 3 + 1 );
  3.         printf("%d\n", ((21 - 1) >> 3) << 3 + 1 );
  4.         printf("%d\n", ((23 - 1) >> 3) << 3 + 1 );
  5.         printf("%d\n", ((24 - 1) >> 3) << 3 + 1 );
  6.         printf("%d\n", ((25 - 1) >> 3) << 3 + 1 );


 

Citation :

16
32
32
32
32
48



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
w + ((8-w%8) % 8)


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 :
  1. int sz = ((int *)(spr))[-1] ;
  2.   if((sz<16)||(sz>50)) erreur("Allocation" ) ;
  3.   sz = ((int *)(spr->rgb))[-1] ;
  4.   if((sz<2300)||(sz>2400)) erreur("Allocation RGB" ) ;
  5.   sz = ((int *)(spr->mask))[-1] ;
  6.   if((sz<96)||(sz>130)) erreur("Allocation mask" ) ;


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... [:pingpetrus]
 

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

Message cité 1 fois
Message édité par Sve@r le 02-06-2010 à 00:41:50

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 02-06-2010 à 00:45:07    

Sve@r 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
 


En effet.
 

Sve@r a écrit :


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... [:petrus]


C'est bien ce que je pensais.
Ça doit servir à expliquer aux élèves ce qu'il ne faut pas faire, c'est volontaire. :o  
 
 

Sve@r a écrit :


 C'est sûr qu'avec un prof pareil, Petiois a du soucis à se faire...


 
On est d'accord.


---------------
deluser --remove-home ptitchep
Reply

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...[:alain_wakbar]


Message édité par Sve@r le 02-06-2010 à 00:51:42

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

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

Reply

Marsh Posté le 02-06-2010 à 14:45:23    

Citation :


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?


 
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.

Message cité 2 fois
Message édité par Lan Wezel le 02-06-2010 à 14:47:14
Reply

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


---------------
deluser --remove-home ptitchep
Reply

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


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.


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

Message cité 1 fois
Message édité par Sve@r le 02-06-2010 à 17:36:42

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 02-06-2010 à 18:01:34    

Sve@r 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...


 
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.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 02-06-2010 à 18:53:22    

Lan Wezel a écrit :


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

 

Tu te trompes

 

Message cité 1 fois
Message édité par Joel F le 02-06-2010 à 18:55:42
Reply

Marsh Posté le 02-06-2010 à 21:30:50    

Putain Joel, on t'a jamais dit d'être cool avec les gens?

Reply

Marsh 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" :o ;)  :whistle:

Reply

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.
Je souhaite créer un Sprite à partir de ce code à trou pouvez-cous m'aider.  
 
code : http://petiois.free.fr/Public/sprite.c
 
Merci


 
 [:tinostar] Elle vaut son pesant de cacahuète cette fonction :
 

Code :
  1. struct tbl {
  2.   int t[256][256][256] ;
  3. };
  4.  
  5. void drawPoint(int x, int y, int r, int g, int b){
  6.   static struct tbl *t=NULL ;
  7.   if(!t){
  8.      t=malloc(sizeof(struct tbl)) ;
  9.      memset(t, 0, sizeof(struct tbl));
  10.   }
  11.   XColor color ;
  12.   color.red = r<<8 ;
  13.   color.green = g<<8 ;
  14.   color.blue = b<<8 ;
  15.   if(!(t->t[r][g][b])) {
  16.      XAllocColor(display, colormap, &color) ;
  17.      t->t[r][g][b] = color.pixel ;
  18.   }
  19.   XSetForeground(display, gc, t->t[r][g][b]) ;
  20.   XDrawPoint(display, window, gc, x, y) ;
  21. }


 
Il alloue une colormap de 64Mo  [:pingouino] . 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.
 
 

Reply

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?


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 11-06-2010 à 18:51:21    

Joel F a écrit :


 
Tu te trompes
 


 
Peux-tu m'expliquer le comportement suivant alors :  
 
Attention code vraiment crado pour mettre en évidence le comportement des vectors.
 

Code :
  1. int main(int argc, char* argv[]){
  2.   vector<int> v;
  3.   for(int i = 0 ; i < 5; i++)
  4.     v.push_back(10*i);
  5.   v[-1] = 42; // instruction critique
  6.   v[-2] = 3;
  7.   v[5] = 4;
  8.   }
  9.   return 0;
  10. }


 
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.

Reply

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

Reply

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?
 

Lan Wezel a écrit :


 
Peux-tu m'expliquer le comportement suivant alors :  
 
Attention code vraiment crado pour mettre en évidence le comportement des vectors.
 

Code :
  1. int main(int argc, char* argv[]){
  2.   vector<int> v;
  3.   for(int i = 0 ; i < 5; i++)
  4.     v.push_back(10*i);
  5.   v[-1] = 42; // instruction critique
  6.   v[-2] = 3;
  7.   v[5] = 4;
  8.   }
  9.   return 0;
  10. }


 
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.


 
 

Joel F a écrit :

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



 
Là Petiois a maintenant vraiment de quoi avoir peur. Je pense même que c'est susceptible de le dégoûter du C [:petrus75]


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed