Fonction renvoyant plrs tableaux

Résolu
tomalille Messages postés 52 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 5 juin 2007 - 24 janv. 2006 à 22:54
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 - 31 janv. 2006 à 22:12
Bonjour,
je travaille sur un programme minupulant des tableaux.
Est-il possible de faire une fonction renvoyant plusieurs tableaux à la fois.
Concrêtement peut-on faire un :
return tab1,tab2;
Deplus, si cela est possible, comment faire ensuite pour les réutiliser.
Merci
Thomas

11 réponses

Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
25 janv. 2006 à 17:15
Si c'est un tableau à plusieurs dimensions, il faut utiliser un pointeur de pointeurs (pointeur double).
En fait, un seul tableau de pointeur de type int.
Chaque pointeur de ce tableau pointe de la mémoire.

// int avec 2 '*' allocation tableau de pointeurs de type int*
int **tempDemandes = new int*[nbChemins];

// Allocation de 5 int pour chacun des nbChemins pointeurs du tableau int**
for (i=0; i<nbChemins; i++)
tempDemandes[i] = new int[5];
3
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
24 janv. 2006 à 23:06
Impossible de renvoyer plusieurs paramètres.
Par contre, tu peux donner en paramètres des adresses dans la mémoire où il y a des pointeurs vers des tableaux.


void tableau(char** tab1, int** tab2)
{
char *array1 = new char[128];
int *array2 = new int[14];

*tab1 = array1;
*tab2 = array2;
}
0
tomalille Messages postés 52 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 5 juin 2007
25 janv. 2006 à 16:14
oki merci,
mais comment tu fais ensuite pour l'utiliser?
Par exemple tu le lances dans ton main.
Thomas
0
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
25 janv. 2006 à 16:41
void tableau(char** tab1, int** tab2)
{
char *array1 = new char[128];
int *array2 = new int[14];

*tab1 = array1;
*tab2 = array2;
}

int main()
{
// Les pointeurs
char *chartab;
int *inttab;

// On donne a la fonction les adresses de ces pointeurs pour qu'elle y stocke les données allouées
tableau(&chartab, &inttab);

// ....

// Libération des mémoires allouées dans la fonctions
delete [] chartab;
delete [] inttab;

return 0;
}
0

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

Posez votre question
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
25 janv. 2006 à 16:44
C'est mal dit.
Les pointeurs initialement ne pointent rien du tout.
La fonction alloue de la mémoire dont les adresses sont stockées dans ces pointeurs.

Ca revient à faire:
int main()
{
char *chartab = new char[128];
int *inttab = new int[14];

// ...

delete [] chartab;
delete [] inttab;

return 0;
}
0
tomalille Messages postés 52 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 5 juin 2007
25 janv. 2006 à 16:50
Merci,
quand je suis tes conseils, j'ai des erreurs :
'new' undeclared (first use in this function)
Faut-il utiliser une librairie?
0
tomalille Messages postés 52 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 5 juin 2007
25 janv. 2006 à 16:59
voici une partie de mon code:



void lectureDemandes(int **demandes)

{

int i,

j;



int *tempDemandes = new int[nbChemins][5];



for(i=0;i<nbDemandes;i++)

{

for(j=0;j<4;j++)

fscanf(fichierEntree,"%d",&tempDemandes[i][j]);

}



*demandes = tempDemandes;

}
0
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
25 janv. 2006 à 17:04
new est un opérateur d'allocation de mémoire.

#include <windows.h> devrait te charger tous les headers nécessaires et bien d'autres encore.

sinon malloc = memory allocation


int *inttab new int[14];

int *inttab = malloc(14*sizeof(int));

et

delete [] inttab;

free(inttab);
0
tomalille Messages postés 52 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 5 juin 2007
25 janv. 2006 à 17:09
oki pour le malloc mais dans mon cas j'ai des tableaux à 2 entrées
Merci
0
tomalille Messages postés 52 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 5 juin 2007
31 janv. 2006 à 19:43
Salut,

je reviens vers toi pour te poser une petite question.

J'ai essaye de faire la meme chose en utilisant des struct pour que ce soit plus claire.

A la compilation je n'ai pas de pb mais les donnees ne sont pas sauvegarder>

Voici une partie de mon code:



struct TYPELIENS{

int nbCanaux;

int prixKm;

int tpsNettoyage;

int tpsConnexion;

};

void lectureTypes(struct TYPELIENS *types[nbTypesLiens]);

void ecrireModel(void);



void lectureTypes(struct TYPELIENS *types[nbTypesLiens])

{

int i;



struct TYPELIENS tempTypes[nbTypesLiens];



for(i=0;i<nbTypesLiens;i++)

{

fscanf(fichierEntree,"%d",&tempTypes[i].nbCanaux);

fscanf(fichierEntree,"%d",&tempTypes[i].prixKm);

fscanf(fichierEntree,"%d",&tempTypes[i].tpsNettoyage);

fscanf(fichierEntree,"%d",&tempTypes[i].tpsConnexion);

}

*types = tempTypes;

}



void ecrireModel(void)

{

int i;



struct TYPELIENS typesLiens[nbTypesLiens];



lectureTypes(&typesLiens);



for(i=0;i<nbTypesLiens;i++)

{

printf("%d ",typesLiens[i].nbCanaux);

printf("%d ",typesLiens[i].prixKm);

printf("%d ",typesLiens[i].tpsNettoyage);

printf("%d ",typesLiens[i].tpsConnexion);

printf("\n");

}

}

J'espere que tu pourras m'aider.

merci d'avance!
0
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
31 janv. 2006 à 22:12
Pour définir un tableau de structure, pas besoin de répéter struct.
TYPELIENS tempTypes[nbTypesLiens];


Quand tu fais TYPELIENS tempTypes[nbTypesLiens]; dans une fonction, de la mémoire est allouée pour les structures mais effacée aussitôt la fonction quittée. Donc, tu renvoies une adresse qui ne pointe pas de donnée 'sûre'. Il se peut que l'ordinateur ait écrit dessus puisqu'elle est libre.

Tu as défini la structure à l'exterieur et tu passes à la fonction le pointeur vers les données. Utilise-le ainsi:

void lectureTypes(TYPELIENS *types)
{
int i;
for(i=0;i<nbTypesLiens;i++)
{
fscanf(fichierEntree,"%d",&(types[i].nbCanaux));
fscanf(fichierEntree,"%d",&(types[i].prixKm));
fscanf(fichierEntree,"%d",&(types[i].tpsNettoyage));
fscanf(fichierEntree,"%d",&(types[i].tpsConnexion));
}
}

ou mieux:

void lectureTypes(TYPELIENS *types)
{
int i;
for(i=0;i<nbTypesLiens;i++)
{
fscanf(fichierEntree,"%d",&(types->nbCanaux));
fscanf(fichierEntree,"%d",&(types->prixKm));
fscanf(fichierEntree,"%d",&(types->tpsNettoyage));
fscanf(fichierEntree,"%d",&(types->tpsConnexion));
types++; // car types est une copie que tu peux modifier
}
}
0