Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide | Shop Recherche
1837 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Besoin d'aide en C

 



 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

Besoin d'aide en C

n°1997995
Petiois
Posté le 01-06-2010 à 15:13:33  profilanswer
 

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
mood
Publicité
Posté le 01-06-2010 à 15:13:33  profilanswer
 

n°1997998
ptitchep
Posté le 01-06-2010 à 15:26:35  profilanswer
 

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
n°1998001
Petiois
Posté le 01-06-2010 à 15:32:56  profilanswer
 

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.

n°1998004
Un Program​meur
Posté le 01-06-2010 à 15:43:53  profilanswer
 

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)
n°1998039
ptitchep
Posté le 01-06-2010 à 16:25:59  profilanswer
 

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
n°1998114
Petiois
Posté le 01-06-2010 à 20:15:07  profilanswer
 

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

n°1998127
ptitchep
Posté le 01-06-2010 à 21:45:55  profilanswer
 

Oui on peut t'aider. Pas faire le boulot.
 
Je peux avoir l'énoncé? Certaines choses éveillent ma curiosité.


---------------
deluser --remove-home ptitchep
n°1998132
Petiois
Posté le 01-06-2010 à 21:57:32  profilanswer
 

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


Message édité par Petiois le 01-06-2010 à 21:58:04
n°1998133
ptitchep
Posté le 01-06-2010 à 22:08:17  profilanswer
 

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


---------------
deluser --remove-home ptitchep
n°1998136
Petiois
Posté le 01-06-2010 à 22:09:07  profilanswer
 

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;

mood
Publicité
Posté le 01-06-2010 à 22:09:07  profilanswer
 

n°1998137
breizhbugs
Posté le 01-06-2010 à 22:23:29  profilanswer
 

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


Message édité par breizhbugs le 01-06-2010 à 22:24:07
n°1998138
Sve@r
Posté le 01-06-2010 à 22:24:12  profilanswer
 

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.
n°1998139
Petiois
Posté le 01-06-2010 à 22:28:01  profilanswer
 

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

n°1998140
Sve@r
Posté le 01-06-2010 à 22:30:15  profilanswer
 

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.
n°1998141
Petiois
Posté le 01-06-2010 à 22:31:18  profilanswer
 

ok merci

n°1998143
ptitchep
Posté le 01-06-2010 à 22:35:52  profilanswer
 

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
n°1998147
Petiois
Posté le 01-06-2010 à 22:58:27  profilanswer
 

je dois donc faire 3 malloc ?

n°1998156
ptitchep
Posté le 01-06-2010 à 23:10:58  profilanswer
 

On dirait bien.


---------------
deluser --remove-home ptitchep
n°1998160
Petiois
Posté le 01-06-2010 à 23:25:00  profilanswer
 

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

n°1998164
ptitchep
Posté le 01-06-2010 à 23:30:55  profilanswer
 

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
n°1998166
Sve@r
Posté le 01-06-2010 à 23:31:55  profilanswer
 

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.
n°1998173
ptitchep
Posté le 01-06-2010 à 23:47:35  profilanswer
 

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
n°1998174
Sve@r
Posté le 01-06-2010 à 23:52:55  profilanswer
 

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.
n°1998182
ptitchep
Posté le 02-06-2010 à 00:11:29  profilanswer
 

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
n°1998189
Sve@r
Posté le 02-06-2010 à 00:39:00  profilanswer
 

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.
n°1998190
ptitchep
Posté le 02-06-2010 à 00:45:07  profilanswer
 

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
n°1998191
Sve@r
Posté le 02-06-2010 à 00:50:31  profilanswer
 

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.
n°1998227
Petiois
Posté le 02-06-2010 à 09:27:08  profilanswer
 

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

n°1998380
Lan Wezel
Posté le 02-06-2010 à 14:45:23  profilanswer
 

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
n°1998425
ptitchep
Posté le 02-06-2010 à 15:56:48  profilanswer
 

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
n°1998461
Sve@r
Posté le 02-06-2010 à 17:27:07  profilanswer
 

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.
n°1998479
Un Program​meur
Posté le 02-06-2010 à 18:01:34  profilanswer
 

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)
n°1998489
Joel F
Real men use unique_ptr
Posté le 02-06-2010 à 18:53:22  profilanswer
 

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
n°1998519
snafu8
Posté le 02-06-2010 à 21:30:50  profilanswer
 

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

n°1998540
Joel F
Real men use unique_ptr
Posté le 02-06-2010 à 22:05:37  profilanswer
 

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:

n°1998558
tpierron
Posté le 02-06-2010 à 22:19:18  profilanswer
 

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.
 
 

n°1999095
ptitchep
Posté le 04-06-2010 à 13:17:35  profilanswer
 

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
n°2001014
Lan Wezel
Posté le 11-06-2010 à 18:51:21  profilanswer
 

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.

n°2001043
Joel F
Real men use unique_ptr
Posté le 11-06-2010 à 20:50:30  profilanswer
 

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

n°2001065
Sve@r
Posté le 11-06-2010 à 22:19:01  profilanswer
 

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.
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Besoin d'aide en C

 

Sujets relatifs
[R/Java/C++] Utiliser le moteur de rendu graphique R dans une appli[C] Probleme swap liste double chainée
Aide pour un slideshow (flash surement) avec changement background[C] Allumer LED avec PIC18F4580
Débutant aide C++Aide sur un Group by
[Objective-C] Gestion de la mémoireBesoin d'aide pour mon prog en C#
un mini projet en C (j ai besoin d aide)[ C ] Besoin d'aide pour afficher l'heure en temps réel
Plus de sujets relatifs à : Besoin d'aide en C


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite) / Groupe LDLC / Shop HFR