Passer l'adresse d'un tableau en parametre

Passer l'adresse d'un tableau en parametre - C - Programmation

Marsh Posté le 22-06-2004 à 14:01:32    

Bonjour.
 
Je cherche a passer l'adresse d'un tableau de char en parametre.
 
L'idee est de pouvoir, une fois la fonction effectuee, recuperer les infos contenues dans 2 tableaux, sans utiliser de variable globale.
 
Cependant, si avec un char * je n'ai aucun probleme, ce n'est pas la même chose avec char **.
 
Exemple fonctionnel avec char *
 

Code :
  1. int main()
  2. {
  3. char *str;
  4. fonction(&str);
  5. printf("%s\n", str);
  6. }
  7. void fonction(char *str)
  8. {
  9. str = strdup("Hello" );
  10. }


 
Le même (qui doit etre faux puisque ne foncitonne pas) avec char **
 

Code :
  1. int main()
  2. {
  3. char **tab;
  4. tab = malloc(255 * sizeof(char));
  5. fonction(&&tab);
  6. printf("%s\n", tab[0]);
  7. }
  8. void fonction(char **tab)
  9. {
  10. tab[0] = strdup("Bonjour" );
  11. tab[1] = strdup("Ca va ?" );
  12. }


 
Je sais que strdup n'est pas une "bonne" fonction, car ne retourne pas de code d'erreur propre.
 
Mais la fonction est suffisante pour cet exemple.
 
Je dois avoir mal saisi qqch sur les pointeurs, et comme je ne trouve pas la solution, si qqun peut me donner une piste.
 
Merci


Message édité par fargo_01 le 22-06-2004 à 14:02:20
Reply

Marsh Posté le 22-06-2004 à 14:01:32   

Reply

Marsh Posté le 22-06-2004 à 14:04:03    

passe un pointeur de pointeur  
 
un pointeur de tableau n'a rien à voir avec ce que tu veux
 
 
et revois tes pointeurs, tu délires commplètements là avec tes &&&&&&& à n'en plus savoir qu'en faire

Reply

Marsh Posté le 22-06-2004 à 14:11:51    

si je suis pas englué je dirais fait un truc plustôt comme ça:
 

Code :
  1. int main()
  2. {
  3.    char *ptrs[2];
  4.    fontion( ptrs );
  5.    printf("%s %s", ptrs[0], ptrs[1] );
  6. }

Reply

Marsh Posté le 22-06-2004 à 14:19:33    

Déjà, pour l'allocation :

Code :
  1. tab = malloc(255 * sizeof(char));


Ici tu alloue 255 caractères et pas un tableau de chaine ( du char** )
Il faut faire:  

Code :
  1. tab = malloc(255 * sizeof(char*));


où tu constuit un tableau de 255 chaines de caratères
 
Ensuite :  

  • tab   désigne l'adresse du premier élément du tableau
  • &tab  désigne donc un pointeur sur l'adresse du premier élément
  • &&tab désigne donc un pointeur sur un pointeur sur l'adresse de l'adresse du premier élément (suis-je bien clair :pt1cable: ?)


Donc il faut que tu écrives : fonction( tab );
De toute façon, c'est logique. tab est du type char**, ta fonction prend des char** donc c'est bon...

Reply

Marsh Posté le 22-06-2004 à 14:20:39    

bjone a écrit :

si je suis pas englué je dirais fait un truc plustôt comme ça:
 
 


 
Oui, c'est bon.

Reply

Marsh Posté le 22-06-2004 à 14:26:06    

Pour l'allocation, je suis ok, j'ai juste pense allocation averc la chaine de caractere, et pas avec le tableau.
 
Pas de soucis non plus pour passer le rableau en parametre.
 
Mais ce qui m'interesse, c'est que les modifications qui seront faites dans fonction() soient lisibles dans le main. D'ou la necessite de passer l'addresse du tableau.
 
Apres, je m'embrouille encore avec les pointeurs ...

Reply

Marsh Posté le 22-06-2004 à 14:33:00    

un tableau n'est pas un pointeur :o
faire la différence, c'est comprendre la moitié du problème

Reply

Marsh Posté le 22-06-2004 à 14:35:52    

ok.
 
Donc, si j'ai bien compris, il n'est pas possible de recuperer mon tableau autrement qu'en le renvoyant, ou en passant par une structure, ou une variable globale.

Reply

Marsh Posté le 22-06-2004 à 14:37:04    

j'ai vu nulle par que tu avais un tableau ...

Reply

Marsh Posté le 22-06-2004 à 14:50:33    

ok
 
Je comprends surtout que si ce n'est pas 200% limpide, les pointeurs, c'est assez prise de tête :)
 
Mais merci de votre aide, j'ai déjà fait un grand pas dans l'abysse des pointeurs ... :D

Reply

Marsh Posté le 22-06-2004 à 14:50:33   

Reply

Marsh Posté le 17-08-2009 à 11:04:13    

Bonjour,
 
Voilà je suis un peu nouveau dans le c, et je ne comprend pas encore toutes les subtilités.
J'aimerai declarer un tableau de pointeur de type float, déjà est ce correct?!
ensuite j'aimerai passer ce tableau de pointeur en parametre dans une fonction permetant d'initialiser tout les pointeurs du tableau à NULL puis par la suite à une autre valeur.
 
en gros je fais ça :
 
#include blablabla
#define NB 10
...
//prototypes
void Initialisation(float fTabPointeur, int inombre);
 
int main (void)
{
   float* fTabPt[NB];
   int inb;// c'est normal nb<NB ne pas tiquer la dessus ^^
 
   Initialisation(*fTabPt, inb);
 
...
}
 
void Initialisation(float* fTabPointeur, int inombre)
{
     int iBoucleInit;// variable de boucle pour l'initialisation des pointeurs
     fTabPointeur=NULL;// celui là je pense qu'il ne sert à rien ?!
 
     for (iBoucleInit = 0 ; iBoucleInit < inombre ; iBoucleInit++)
     {
         fTabPointeur[iBoucleInit]= NULL;
     }      
}
 
j'obtiens une erreur à la compilation :
"incompatible types in assignment" :(  
ps : j'utilise un IDE DevC++ et je suis sous windows.
 
merci, si vous avez un ti exemple ou un conseil. :)  


---------------
De tous ceux qui n'ont rien à dire, les plus agréables sont ceux qui se taisent.
Reply

Marsh Posté le 17-08-2009 à 11:12:31    

float fTabPointeur
 
 
c'est bien la peine de faire de la notation à la con qui ta variable n'est ni un tableau ni un pointeur.
 
float** a;

Reply

Marsh Posté le 17-08-2009 à 11:44:19    

donc ce que j'ai fait c'est totalement nimportequoi... :/
comme je voulais faire un tableau de "inb" pointeurs, je devrais faire :
int inb=3;//par exemple
float** fTabPointeur = malloc(sizeof(float)*nb);
et je passe en paramètre :
Initialisation(**fTabPt, inb);  
 
...  
}  
 
void Initialisation(float** fTabPointeur, int inombre)  
{  
     int iBoucleInit;// variable de boucle pour l'initialisation des pointeurs  
 
     for (iBoucleInit = 0 ; iBoucleInit < inombre ; iBoucleInit++)  
     {  
         *fTabPointeur= NULL;  
          fTabPointeur++;
     }      
}
 
est ce que c'est correct comme ça ? :/

Reply

Marsh Posté le 17-08-2009 à 13:00:38    

Non.

 

Tu donnes à malloc sizeof(float) * nb, ce qui sous-entend que tu vas créer un pointeur sur des float, donc un float*. Et tu stockes ça dans un... float**, qui est un pointeur vers des pointeurs de float. Il y a donc une erreur.

 

edit : ouch, j'avais pas fait attention à la fonction d'initialisation... À ce stade, je préconiserais plutôt l'achat du livre "Le Langage C" (de Kernighan et Ritchie) et de potasser un peu la notion de pointeurs.


Message édité par Elmoricq le 17-08-2009 à 13:03:10
Reply

Marsh Posté le 17-08-2009 à 14:45:44    

à vrai dire la notion de pointeur je comprend quand même (malgrés des lacunes), mais la ou je me perds completement c'est dans la notion de pointeur de pointeurs.
D'autre part je crois comprendre la notion de tableau:
ex: int A[10];
va creer une zone mémoire de 40 octets avec un pointeur A pointant sur la première case mémoire de mon tableau.
(vous m'arrêtez si je vais dans le mur... :/ )
maintenant je veut créer un tableau de N cases dont chaque case est un pointeur, comment dois-je m'y prendre?

Reply

Marsh Posté le 17-08-2009 à 15:28:45    

De la même façon.

Code :
  1. int * A[10]


Cela va créer une zone mémoire de 10 pointeurs sur entier. Avec A qui pointe au début de ce tableau.
 
Ta zone mémoire ne fera pas 40 octets mais 40*sizeof(int) octets. Soit 160 octets pour des entiers codés sur 4 octets.


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

Marsh Posté le 17-08-2009 à 15:52:56    

ptitchep a écrit :

De la même façon.

Code :
  1. int * A[10]


Cela va créer une zone mémoire de 10 pointeurs sur entier. Avec A qui pointe au début de ce tableau.
 
Ta zone mémoire ne fera pas 40 octets mais 40*sizeof(int) octets. Soit 160 octets pour des entiers codés sur 4 octets.


 
int A[10];
non : ma zone mémoire fera 10*sizeof(int) octets: soit 40 octets!
 
mais merci de ta reponse :)  
et comment initialise t on ces pointeur du coup? :??:  
on fait un  
int * A[10]
for {i=0;i<10;i++}
   A[i]= NULL;
???
il va comprendre que c'est des pointeur dans le tableau là?

Reply

Marsh Posté le 17-08-2009 à 16:00:35    

Oups désolé. On est lundi...
Oui, il va "comprendre".


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

Marsh Posté le 17-08-2009 à 16:13:11    

merci beaucoup. Ouaip lundi erff, moi aussi, dejà que je débute mais là en plus c'est lundi ---> je sorts des trucs qui me font même peur à moi-même :/ :)
 
"Suite au fait que lundi tombe un mardi ce mercredi, notre réunion du jeudi se tiendra vendredi ce samedi car dimanche est un jour férié."
  [Red Skelton]

Reply

Marsh Posté le 17-08-2009 à 16:15:07    

ProGrammeHeure a écrit :


 
int A[10];
non : ma zone mémoire fera 10*sizeof(int) octets: soit 40 octets!
 
mais merci de ta reponse :)  
et comment initialise t on ces pointeur du coup? :??:  
on fait un  
int * A[10]
for {i=0;i<10;i++}
   A[i]= NULL;
???
il va comprendre que c'est des pointeur dans le tableau là?


 
Ceci dit, ta zone ne fera 40 bytes que si ton binaire est compilé en 32 bits.  
Dans tous les cas, ta zone fera 10 * sizeof(int), c'est encore le plus simple.

Reply

Marsh Posté le 17-08-2009 à 16:20:53    

ouaip, c'est ça.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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