Rechercher : dans
Par :

[C] pointeur tableau et fonction

Dernière réponse le 6 nov 2006 à 08:34:18 lostprophet, le 27 oct 2006 à 04:14:51 
 Signaler ce message aux modérateurs

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)

Meilleures réponses pour « [C] pointeur tableau et fonction » dans :
Trier un tableau sans utiliser la fonction sort VoirTrier un tableau sans utiliser la fonction sort D'abord on initialise une variable $max avec la 1ère valeur de tableau. Ensuite on va faire une boucle tant que le tableau contient encore des éléments. C'est avec la fonction splice qui a le rôle...
Les fonctions en C++ : surcharge et paramètres par défaut. VoirLes fonctions en C++ : surcharge et paramètres par défaut. 1. La surcharge de fonctions et méthodes de classes, dont le constructeur 2. Utilisation des paramètres par défaut En C++, une même fonction ou méthode de classe peut être...
Inverser les éléments d'un tableau -Récursivité- VoirVoici une procédure récursive qui permet d’inverser les éléments d’une partie d’un tableau compris entre la position p et n : Procedure Inverser (Var t : Tab; p, n : Integer); Var aux : Real; Begin If p < n Then ...
Les chaînes de caractères en C++ VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C++, une...
Les structures en langage C VoirDifférence entre une structure et un tableau Un tableau permet de regrouper des éléments de même type, c'est-à-dire codés sur le même nombre de bits et de la même façon. Toutefois, il est généralement utile de pouvoir rassembler des éléments de...

1

Char Snipeur, le 27 oct 2006 à 08:50:38

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 Salutation !
Char Snipeur

Répondre à Char Snipeur

2

lostprophet, le 29 oct 2006 à 22:27:17

Merci pour tes remarques ! je teste ca et je tiens au courant !

Répondre à lostprophet

3

lostprophet, le 29 oct 2006 à 22:51:12

Ca marche !!! merci bien !

Répondre à lostprophet

4

lostprophet, le 1 nov 2006 à 05:42:46

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

Répondre à lostprophet

5

lostprophet, le 5 nov 2006 à 21:53:10

Un petit up

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

Merci !

Répondre à lostprophet

6

 Char Snipeur, le 6 nov 2006 à 08:34:18

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. Salutation !
Char Snipeur

Répondre à Char Snipeur