[C] pointeur tableau et fonction

Résolu/Fermé
lostprophet
Messages postés
7
Date d'inscription
lundi 9 octobre 2006
Statut
Membre
Dernière intervention
9 janvier 2007
- 27 oct. 2006 à 04:14
Char Snipeur
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
- 6 nov. 2006 à 08:34
Bonjour !

Je suis en train de programmer en C pour un logiciel, et je me retrouve face a un petit probleme de passage d'argument dans une fonction.
En fait je declare un pointeur de plusieurs entiers, et un pointeur de plusieurs tableaux de 10000 elements. Les elements sont alloues dynamiquement, et les valeurs calculees par une fonction. La fonction marche tres bien pour le pointeurs d'entiers, mais pas pour le pointeur de tableaux (en fait des qu'on sort du cadre du pointeur simple, je suis perdu ;) ) Petite precision, DEFINE_ON_DEMAND est une fonction propre au logiciel, et tout le programme fonctionne fonctionne a part le point que j'evoque.Sinon, ca plante a la compilation (passing arg 3 of 'PrintDetails' from incompatible pointer type)

Voici la fonction:

DEFINE_ON_DEMAND(InjectionTest)
{

int tru=0,j,i;

int NFcen,NFaceID[10000];
int *NFID,N;
NFID=NFaceID;
N=10000;
int *NodeFcen=NULL,(*NodeFaceID)[10000]=NULL;
int total=0;
for(j=39;j<41;j++)
{
ID=j;
tru=0;
if (total==0)
{
NodeFcen = calloc(1,sizeof(int));
NodeFaceID =(int (*)[10000])malloc(10000*1*sizeof(int));
}
else
{
NodeFcen = realloc(NodeFcen, (total+1)*sizeof(int));
NodeFaceID =(int (*)[10000])realloc(NodeFaceID,10000*total*sizeof(int));
}

-
-//Algo qui donne tru=0, ou tru > 1 => fonctionne
-
if(tru >> 1)
{
PrintDetails(ID,&NFcen,&NFID,N);
NodeFcen[total]=NFcen;
for(i=0;i<N;i++)
{
NodeFaceID[total][i]=NFID[i];
}
total++;
}
else{}
}

void PrintDetails(int ID,int *NFcen,int *NFID,int N)
{
int fcen,faceid[10000];

-
-//algo qui calcule fcen et faceid => fonctionne
-

*NFcen=fcen;
for(i=0;i<N;i++)
{
*NFID[i]=faceid[i];
}
}
Merci d'avance ! (ah oui et desole pour les accents, j'ai un clavier qwerty)

6 réponses

Char Snipeur
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 328
27 oct. 2006 à 08:50
Salut.
Je pense avoir vu une erreur.
Le '&' ça sert à renvoyer l'adresse d'une variable. Donc quand tu écrit :
PrintDetails(ID,&NFcen,&NFID,N)
avec NFID déclaer comme int*, c'est comme si tu passai un int**
Or ce n'est pas ce que PrintDetails attend.
de même pour une tableau, soit tu marque NFID[i], soit *(NFID+i); mais pas *NFID[i], ce qui revient à faire une indirection sur un int. Que renvérai l'expression "*15" ?
En plus, pointeur d'entier, pointeur de tableaux, je pense que c'est à pareil dans ton cas.
regarde ça, ça peut t'aider:
c liberation de la memoire
0
lostprophet
Messages postés
7
Date d'inscription
lundi 9 octobre 2006
Statut
Membre
Dernière intervention
9 janvier 2007

29 oct. 2006 à 22:27
Merci pour tes remarques ! je teste ca et je tiens au courant !
0
lostprophet
Messages postés
7
Date d'inscription
lundi 9 octobre 2006
Statut
Membre
Dernière intervention
9 janvier 2007

29 oct. 2006 à 22:51
Ca marche !!! merci bien !
0
lostprophet
Messages postés
7
Date d'inscription
lundi 9 octobre 2006
Statut
Membre
Dernière intervention
9 janvier 2007

1 nov. 2006 à 05:42
Bon en fatit maintenant je suis bloque, je n'arrive pas a desallouer la memoire pour NodeFaceID avec free().

J'ai tente une boucle for:
for i .....
free(NodeFaceID[i]);

mais je me retrouve avec une erreure de glibc.... une idee encore ? ;)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lostprophet
Messages postés
7
Date d'inscription
lundi 9 octobre 2006
Statut
Membre
Dernière intervention
9 janvier 2007

5 nov. 2006 à 21:53
un petit up

Quelqu'un aurait il une idee pour liberee cette fichue memoire ?

Merci !
0
Char Snipeur
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 328
6 nov. 2006 à 08:34
Salut.
je m'y connai pas beaucoup en allocartion dynamique.
Déjà, met l'erreur exact, 9/10 la réponse est dans l'affichage de l'erreur.
si NodeFaceID est bien de type int**, ce que tu as écris me semble juste.
0