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

  FORUM HardWare.fr
  Programmation
  C

  Passer l'adresse d'un tableau en parametre

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Passer l'adresse d'un tableau en parametre

n°772674
fargo_01
Posté le 22-06-2004 à 14:01:32  profilanswer
 

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
mood
Publicité
Posté le 22-06-2004 à 14:01:32  profilanswer
 

n°772680
Taz
bisounours-codeur
Posté le 22-06-2004 à 14:04:03  profilanswer
 

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

n°772708
bjone
Insert booze to continue
Posté le 22-06-2004 à 14:11:51  profilanswer
 

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

n°772731
pascal_
Posté le 22-06-2004 à 14:19:33  profilanswer
 

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

n°772735
pascal_
Posté le 22-06-2004 à 14:20:39  profilanswer
 

bjone a écrit :

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


 
Oui, c'est bon.

n°772747
fargo_01
Posté le 22-06-2004 à 14:26:06  profilanswer
 

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

n°772754
Taz
bisounours-codeur
Posté le 22-06-2004 à 14:33:00  profilanswer
 

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

n°772758
fargo_01
Posté le 22-06-2004 à 14:35:52  profilanswer
 

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.

n°772762
Taz
bisounours-codeur
Posté le 22-06-2004 à 14:37:04  profilanswer
 

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

n°772788
fargo_01
Posté le 22-06-2004 à 14:50:33  profilanswer
 

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

mood
Publicité
Posté le 22-06-2004 à 14:50:33  profilanswer
 

n°1915640
ProGrammeH​eure
Posté le 17-08-2009 à 11:04:13  profilanswer
 

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.
n°1915645
Taz
bisounours-codeur
Posté le 17-08-2009 à 11:12:31  profilanswer
 

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;

n°1915668
ProGrammeH​eure
Posté le 17-08-2009 à 11:44:19  profilanswer
 

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 ? :/

n°1915699
Elmoricq
Modérateur
Posté le 17-08-2009 à 13:00:38  profilanswer
 

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
n°1915758
ProGrammeH​eure
Posté le 17-08-2009 à 14:45:44  profilanswer
 

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

n°1915808
ptitchep
Posté le 17-08-2009 à 15:28:45  profilanswer
 

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
n°1915823
ProGrammeH​eure
Posté le 17-08-2009 à 15:52:56  profilanswer
 

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

n°1915836
ptitchep
Posté le 17-08-2009 à 16:00:35  profilanswer
 

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


---------------
deluser --remove-home ptitchep
n°1915851
ProGrammeH​eure
Posté le 17-08-2009 à 16:13:11  profilanswer
 

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]

n°1915852
Elmoricq
Modérateur
Posté le 17-08-2009 à 16:15:07  profilanswer
 

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.

n°1915860
ProGrammeH​eure
Posté le 17-08-2009 à 16:20:53  profilanswer
 

ouaip, c'est ça.

mood
Publicité
Posté le   profilanswer
 


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

  Passer l'adresse d'un tableau en parametre

 

Sujets relatifs
faire un tableau de ce style ....PHP + MYSQL >> tuto pour faire un tableau avec des donnée
[C#] Passer des paramètres à un Thread ? [Résolu]Mettre un bmp (ses données ) ds un tableau
Pb Iframe dans tableauScript Dos extinction Pc allumés depuis liste passée en paramètre
[VBA] Enlever les bordure a toutes les cellules d'un tableauCurseur Main sur la cellule d'un Tableau
connaitre la taille d'un tableau à 2 dimensions ??[c] Passer l'adresse d'un tableau a 2 dim en parametre [OK]
Plus de sujets relatifs à : Passer l'adresse d'un tableau en parametre


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