Fonction renvoyant plrs tableaux [Résolu]

Signaler
Messages postés
52
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
5 juin 2007
-
Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Statut
Membre
Dernière intervention
9 avril 2008
-
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

Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Statut
Membre
Dernière intervention
9 avril 2008
1
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];
Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Statut
Membre
Dernière intervention
9 avril 2008
1
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;
}
Messages postés
52
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
5 juin 2007

oki merci,
mais comment tu fais ensuite pour l'utiliser?
Par exemple tu le lances dans ton main.
Thomas
Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Statut
Membre
Dernière intervention
9 avril 2008
1
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;
}
Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Statut
Membre
Dernière intervention
9 avril 2008
1
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;
}
Messages postés
52
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
5 juin 2007

Merci,
quand je suis tes conseils, j'ai des erreurs :
'new' undeclared (first use in this function)
Faut-il utiliser une librairie?
Messages postés
52
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
5 juin 2007

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;

}
Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Statut
Membre
Dernière intervention
9 avril 2008
1
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);
Messages postés
52
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
5 juin 2007

oki pour le malloc mais dans mon cas j'ai des tableaux à 2 entrées
Merci
Messages postés
52
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
5 juin 2007

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!
Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Statut
Membre
Dernière intervention
9 avril 2008
1
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
}
}