Tableau en C [Résolu]

Signaler
Messages postés
63
Date d'inscription
mardi 25 décembre 2001
Statut
Membre
Dernière intervention
11 février 2007
-
Messages postés
402
Date d'inscription
mardi 1 mai 2001
Statut
Membre
Dernière intervention
15 août 2011
-
Bonsoir a tous !
Voici ma question :

J'ai une fonction principale, main(), et une autre fonction tab(). Je voudrais déclarer un tableau dans la fonction main() et le remplir grace a la fonction tab() :

int main()
{
int tableau[15][20] = tab();
}

int tab()
{
//Lecture dans un fichier et remplissage du tableau
return tableau[15][20];
}

Or le message d'erreur que j'obtiens est :
impossible de convertire un int en int[15][20]

Voila, si vous pouvez m'aider j'en serai très reconaissant :)

9 réponses

Messages postés
402
Date d'inscription
mardi 1 mai 2001
Statut
Membre
Dernière intervention
15 août 2011

Tu as le choix, sois tu envoie ton tableau à ta
fonction ou sois tu retourne un tableau,
dynamiquement évidemment ...

Moi personnellement, je ferais comme ceci,
ou presque(ce n'est qu'un exemple):

void function( int *** tab )
{
int ** array;
int une_valeur; size_t x 0, y 0;

array = (int **) malloc( 15 * sizeof(int *) ); /* array[15][] */

while ( !EndOfFile && x < 15 ) /* tu lis dans le fichier dans cette boucle(exemple) */
{
array[x] = malloc( 20 * sizeof(int) ); /* array[x][20] */
for ( y 0; y < 20; ++y ) /* array[x][0 à 19> 20] */
{
LireDansFichier( id_du_fichier, &une_valeur );
array[x][y] = une_valeur;
}

++x; /* next( array[0 à 14 => 15][] */
}
/* fin ... */
(*tab) = array;
}

int main()
{

size_t i;
int ** tableau;
function( &tableau );
/* ... */
/* ... */
/* ... */

for ( i = 0; i < 15; ++i )
free( tableau[i] );

free( tableau );
return 0;
}

pour ton problème tu dois utiliser des `tableaux` dynamique et non `statique/fixe`

~(.:: NitRic ::.)~
Messages postés
415
Date d'inscription
samedi 4 janvier 2003
Statut
Membre
Dernière intervention
2 décembre 2005
3
Dynamiquement, ça donne :



#define MAX_COLS 20

#define MAX_ROWS 15

int** Tab()

{

int** Tab; // regarde dans main() pour plus de précision quant au remplissage

... // code qui lit ton fichier est récolte les infos

return Tab;

}



int main()

{

int** Tab; // créé le pointeur

Tab = (int**) malloc( MAX_ROWS* (int*) ); // alloue la mémoire pour le tableau

for(int i=0;i<MAX_COLS;i++)

{

Tab[i] = (int*) malloc( MAX_COLS*(int) );

}

Tab = Tab(); // et tu initialise le tableau à ta sauce

return 0;

}

Le CyberMonde nous offre une meilleur qualité de vie
CyberMan.inc The WebSite
Messages postés
402
Date d'inscription
mardi 1 mai 2001
Statut
Membre
Dernière intervention
15 août 2011

Ah non, désolé mais la, Tab = Tab() << tu fais comment pour faire un free() sur Tab !?!?!?

Tu `bousille` toutes les allocations mémoires !!!



char * ptr = malloc( size );

ptr = function();

free( ptr ); << bye bye ... ou encore => BOOM !!!



Il pourait faire l'allocation avant d'appeler sa fonction, ensuite, envoyer son tableau en paramètre:



void function( int *** tab, size_t x, size_t y )

{

(*tab][x][y] = value;

/* ... */

}



int main()

{

int ** tab;

tab = malloc( ... );

/* ... */



function( &tab, x, y );

/* ... */

return 0;

}



Ta méthode n'est pas fonctionnelle, désolé ...








~(.:: NitRic ::.)~
Messages postés
415
Date d'inscription
samedi 4 janvier 2003
Statut
Membre
Dernière intervention
2 décembre 2005
3
Et pourquoi free() ne marcherais pas avec ma méthode ? Je l'ai juste oublié !!!

Le CyberMonde nous offre une meilleur qualité de vie
CyberMan.inc The WebSite
Messages postés
402
Date d'inscription
mardi 1 mai 2001
Statut
Membre
Dernière intervention
15 août 2011

Regarde ton code:





int** Tab; // créé le pointeur


Tab = (int**) malloc( MAX_ROWS* (int*) ); // alloue la mémoire pour le tableau


for(int i=0;i<MAX_COLS;i++)


{


Tab[i] = (int*) malloc( MAX_COLS*(int) );


}


Tab = Tab(); // et tu initialise le tableau à ta sauce



Tab = Tab(); /* tu pers toutes les allocations mémoire */





/* Regarde ceci */

char * CopyString( const char * string )

{

char * ptr;

/* tu fais quoi ici !?!?!? */

return ptr;

}

int main()

{

char * string;



string =
malloc( 50 * sizeof(char) );


string = CopyString( "Bonjour" ); /* Et paf! Plus d'allocation mémoire */



free( string ); /* !!!BOOM!!! */

return 0;

}



ce petit exemple réprésente _Exactement_ ta méthode

qui est non fonctionnelle, désolé ...



soit tu envois ton pointeur à la fonction qui elle va faire

les allocations mémoire ou, tu fais les allocations mémoire

et ensuite tu envois ton pointeur à la fonction. Le fait de retourner

des `tableaux` n'est pas très safe, impossible de connaître les dimenssions

du `tableau` retourné ...





~(.:: NitRic ::.)~
Messages postés
415
Date d'inscription
samedi 4 janvier 2003
Statut
Membre
Dernière intervention
2 décembre 2005
3
exacte, le code pour l'allocation de la mémoire doit se faire dans la
fonction Tab() qui va ensuite renoyé le pointeur. désolé je suis allé
trop vite.

Le CyberMonde nous offre une meilleur qualité de vie
CyberMan.inc The WebSite
Messages postés
63
Date d'inscription
mardi 25 décembre 2001
Statut
Membre
Dernière intervention
11 février 2007

Merci ca fonctionne parfaitement,

j'en profite pour pauser une quelque petites question :

déja, quelle est la différence entre malloc et new;

ensuite dans ton premier exemple Nitric tu as utiliser size_t variable

pourquoi ne pas utiliser un int ? A quoi sert size_t ?

Merci encore !
Messages postés
415
Date d'inscription
samedi 4 janvier 2003
Statut
Membre
Dernière intervention
2 décembre 2005
3
new et delete sont des fonctions C++, alors que malloc et free sont des fonctions C, je n'ai jamais trop su

size_t est un type de variable pour les tailles d'objets en mémoire. Tu
peux mettre un int ça ne changera rien. Mais c'est un type de variable
spécifique pour les tailles

Le CyberMonde nous offre une meilleur qualité de vie
CyberMan.inc The WebSite
Messages postés
402
Date d'inscription
mardi 1 mai 2001
Statut
Membre
Dernière intervention
15 août 2011

size_t != int

typedef unsigned int size_t;

signé != non signé





new/delete sont une `surcouche` à malloc()/free(), cependant,
new/delete sont très important en C++ car il permettent l'appel
`automatique` des constructeurs/destructeurs des objets et ca, c'est
important ...






~(.:: NitRic ::.)~