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

  FORUM HardWare.fr
  Programmation
  C

  cast vers un pointeur sur tableau

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

cast vers un pointeur sur tableau

n°1165457
Shabang
Posté le 30-07-2005 à 11:42:08  profilanswer
 

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

mood
Publicité
Posté le 30-07-2005 à 11:42:08  profilanswer
 

n°1165462
Emmanuel D​elahaye
C is a sharp tool
Posté le 30-07-2005 à 11:50:54  profilanswer
 

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/
n°1165463
Elmoricq
Modérateur
Posté le 30-07-2005 à 11:51:01  profilanswer
 

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
n°1165465
Emmanuel D​elahaye
C is a sharp tool
Posté le 30-07-2005 à 11:56:22  profilanswer
 

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/
n°1165467
mcjoedassi​n
Posté le 30-07-2005 à 11:57:38  profilanswer
 

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

n°1165468
Elmoricq
Modérateur
Posté le 30-07-2005 à 12:00:23  profilanswer
 

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
n°1165469
manatane
En vous remerciant, bonsoir
Posté le 30-07-2005 à 12:00:38  profilanswer
 

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

n°1165472
Shabang
Posté le 30-07-2005 à 12:02:43  profilanswer
 

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

n°1165474
Emmanuel D​elahaye
C is a sharp tool
Posté le 30-07-2005 à 12:11:09  profilanswer
 

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/
n°1165477
Shabang
Posté le 30-07-2005 à 12:12:36  profilanswer
 

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
mood
Publicité
Posté le 30-07-2005 à 12:12:36  profilanswer
 

n°1165478
Elmoricq
Modérateur
Posté le 30-07-2005 à 12:14:20  profilanswer
 

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 ?

n°1165483
Shabang
Posté le 30-07-2005 à 12:21:03  profilanswer
 

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.

n°1196520
omicron
Pas de bras, pas de caméra !
Posté le 10-09-2005 à 14:13:08  profilanswer
 

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


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

  cast vers un pointeur sur tableau

 

Sujets relatifs
Creation d'un tableau avec données issues de BDD AccessUn tableau en haut à gauche d'un tableau
[RESOLU] Recherche d'un string dans un tableau [debutant] enumeration et tableau de String
Entête de tableau fixe sous IE[HTML] alignement cellules d'un tableau.
Un tableau en Css/xhtml dans une include....[RESOLU] Envoi de POST vers un autre serveur avec HEADER
[.NET c#] exeption et probleme de castTransfert de données Excel vers une base MySQL
Plus de sujets relatifs à : cast vers un pointeur sur tableau


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR