cast vers un pointeur sur tableau

cast vers un pointeur sur tableau - C - Programmation

Marsh Posté le 30-07-2005 à 11:42:08    

bonjour,
j'ai:

Code :
  1. char (*toto)[256], (*tata)[256];


je veux faire pointer tata sur le 42eme octet de toto (quelle idée, je sais) sans warning.

Code :
  1. tata = &((char *)toto)[42]

mais il manque le cast qui va bien. Merci d'avance ;)

Reply

Marsh Posté le 30-07-2005 à 11:42:08   

Reply

Marsh Posté le 30-07-2005 à 11:50:54    

Shabang a écrit :

bonjour,
j'ai:

Code :
  1. char (*toto)[256], (*tata)[256];


je veux faire pointer tata sur le 42eme octet de toto (quelle idée, je sais) sans warning.

Code :
  1. tata = &((char *)toto)[42]

mais il manque le cast qui va bien. Merci d'avance ;)


C'est une manip sacrément glaiseuse... A éviter.


#include <stdio.h>
 
int main (void)
{
   char a[256] = {0};
   char (*toto)[256], (*tata)[256];
 
   toto = &a;
   a[42] = 'x';
 
   /* plus gore, tu meurs... */
   tata = (char (*)[256])((*toto) + 42);
   
   printf ("%c\n", *(tata)[0]);
 
   return 0;
}


Attention quand même aux risques de débordement au-delà de tata[256-42] (à une vache près)


Message édité par Emmanuel Delahaye le 30-07-2005 à 12:13:39

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 30-07-2005 à 11:51:01    

Citation :

sans warning.


Ouhla. Normal qu'il y ait un warning.
Tes variables toto et tata sont des "char **", et pour pointer sur une partie de toto il faut un "char *".
 

char *toto[256], *tata;
<entre ces deux lignes, du code qui défini le contenu de toto>
tata = toto[42];


 
 
EDIT : j'ai un doute de newbie : toto c'est un pointeur vers n zones de 256 char, ou c'est 256 pointeurs vers des chaînes de caractères ?


Message édité par Elmoricq le 30-07-2005 à 11:52:51
Reply

Marsh Posté le 30-07-2005 à 11:56:22    

Elmoricq a écrit :

Citation :

char (*toto)[256], (*tata)[256];



Tes variables toto et tata sont des "char **"


Non. Elles sont de type 'pointeur sur tableau de 256 char'. Rien à voir.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 30-07-2005 à 11:57:38    

tata = (void*) &((char *)toto)[42]

Reply

Marsh Posté le 30-07-2005 à 12:00:23    

Elmoricq a écrit :

EDIT : j'ai un doute de newbie : toto c'est un pointeur vers n zones de 256 char, ou c'est 256 pointeurs vers des chaînes de caractères ?


 
Ok alors j'ouvre mon autre paupière et je regarde la précédence : le monsieur avait défini sa variable avec des parenthèses.
 
Je retourne me pieuter maintenant. [:elmoricq]
 
 

Emmanuel Delahaye a écrit :

Non. Elles sont de type 'pointeur sur tableau de 256 char'. Rien à voir.


 
J'avais généralisé son type à dessein. Par contre, dans ma réponse j'ai mal interprété ce que voulait le posteur initial.


Message édité par Elmoricq le 30-07-2005 à 12:03:12
Reply

Marsh Posté le 30-07-2005 à 12:00:38    

ton code est bien compliqué, sachant que tab[i] correspond à *(tab + i) tu peux peut etre te contenter de faire un truc dans le style  

Code :
  1. #include <stdio.h>
  2. int main(){
  3.   char tab[3] = {0, 1, 2};
  4.   char * ptab;
  5.   // tab[i] equivaut à *(tab + i)
  6.   ptab = (tab + 1);
  7.   printf("%d\n", *ptab ); // affiche 1
  8.   ++ptab;
  9.   printf("%d\n", *ptab ); // affiche 2
  10.  
  11.   return 0;
  12. }


comme l'a montré Emmanuel

Reply

Marsh Posté le 30-07-2005 à 12:02:43    

oui, pas con le cast en void * effectivement...
bon c'est tellement gorre que de toute maniere je vais repenser la structure du truc. Mais par curiosité j'aimerais bien connaitre la réponse =]
un autre probleme du meme genre tiens: j'ai toto défini comme au-dessus, malloc-é de disons 10 * sizeof(*toto), et je veux copier n octets d'une source quelconque vers l'adresse du 6ème octet de chaque tableau de 256...
clairement,

Code :
  1. memcpy(&toto[i][6], stream, n)


mais imaginons que le [6] m'embete, et que je veux faire pointer tata de telle facon que je puisse remplacer &toto[i][6] par tata[i]: de quelle type sera alors déclaré tata?
encore merci ;)

Reply

Marsh Posté le 30-07-2005 à 12:11:09    

Shabang a écrit :

un autre probleme du meme genre tiens: j'ai toto défini comme au-dessus, malloc-é de disons 10 * sizeof(*toto), et je veux copier n octets d'une source quelconque vers l'adresse du 6ème octet de chaque tableau de 256...
clairement,

Code :
  1. memcpy(&toto[i][6], stream, n)


mais imaginons que le [6] m'embete, et que je veux faire pointer tata de telle facon que je puisse remplacer &toto[i][6] par tata[i]: de quelle type sera alors déclaré tata?
encore merci ;)


Mal à la tête. Avec des raisonnements aussi tordus, tu vas te casser les dents. Le secret de la réussite en informatique, c'est la simplicité.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 30-07-2005 à 12:12:36    

ok, j'étudie ton exemple Emmanuel... merci
[Edit]Oui mais la j'ai envie de me casser la tete, et meme si je pourrais resoudre le pb assez facilement avec des structures adaptées, c'est par curiosité que je me pose la question (et puis le prog que je fais est loin d'etre simple a mettre en place, seule la partie initialisation est codée en C, les structures de données sont tordues car la partie qui suit l'init doit etre tres optimisée en vitesse, mais c'est un autre sujet)[/Edit]


Message édité par Shabang le 30-07-2005 à 12:18:20
Reply

Marsh Posté le 30-07-2005 à 12:12:36   

Reply

Marsh Posté le 30-07-2005 à 12:14:20    

Shabang a écrit :

o
un autre probleme du meme genre tiens: j'ai toto défini comme au-dessus, malloc-é de disons 10 * sizeof(*toto), et je veux copier n octets d'une source quelconque vers l'adresse du 6ème octet de chaque tableau de 256...
clairement,

Code :
  1. memcpy(&toto[i][6], stream, n)


mais imaginons que le [6] m'embete, et que je veux faire pointer tata de telle facon que je puisse remplacer &toto[i][6] par tata[i]: de quelle type sera alors déclaré tata?
encore merci ;)


 
Pourquoi tu veux faire pointer &toto[i][6] ?
Pas plus simple de parcourir toto tout bêtement ? Et manier ainsi des chaînes toutes bêtes, au lieu de pointeurs sur chaînes ?
 
Quant au 6, tu l'auras toujours dans un coin si c'est du pré-défini.
A moins qu'il ne faille de temps en temps le changer, tu peux éventuellement en faire un #define.
 
'fin bon, j'ai le sentiment que tu te compliques les choses pour pas grand chose, là.  
C'est pour faire quoi au juste ?

Reply

Marsh Posté le 30-07-2005 à 12:21:03    

Emmanuel Delahaye a écrit :

C'est une manip sacrément glaiseuse... A éviter.


#include <stdio.h>
 
int main (void)
{
   char a[256] = {0};
   char (*toto)[256], (*tata)[256];
 
   toto = &a;
   a[42] = 'x';
 
   /* plus gore, tu meurs... */
   tata = (char (*)[256])((*toto) + 42);
   
   printf ("%c\n", *(tata)[0]);
 
   return 0;
}


Attention quand même aux risques de débordement au-delà de tata[256-42] (à une vache près)


gorre a souhait, mais c'est vu, thx.

Reply

Marsh Posté le 10-09-2005 à 14:13:08    

tu as essayé :
 
tata = toto + 42-1
 
 ?

Reply

Sujets relatifs:

Leave a Replay

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