Tableau en C

Résolu
Mickylord Messages postés 63 Date d'inscription mardi 25 décembre 2001 Statut Membre Dernière intervention 11 février 2007 - 3 avril 2005 à 21:48
NitRic Messages postés 402 Date d'inscription mardi 1 mai 2001 Statut Membre Dernière intervention 15 août 2011 - 6 avril 2005 à 02:56
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

NitRic Messages postés 402 Date d'inscription mardi 1 mai 2001 Statut Membre Dernière intervention 15 août 2011
4 avril 2005 à 05:08
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 ::.)~
3
minet03 Messages postés 415 Date d'inscription samedi 4 janvier 2003 Statut Membre Dernière intervention 2 décembre 2005 3
4 avril 2005 à 18:37
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
0
NitRic Messages postés 402 Date d'inscription mardi 1 mai 2001 Statut Membre Dernière intervention 15 août 2011
4 avril 2005 à 20:27
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 ::.)~
0
minet03 Messages postés 415 Date d'inscription samedi 4 janvier 2003 Statut Membre Dernière intervention 2 décembre 2005 3
4 avril 2005 à 22:13
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
0

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

Posez votre question
NitRic Messages postés 402 Date d'inscription mardi 1 mai 2001 Statut Membre Dernière intervention 15 août 2011
5 avril 2005 à 03:30
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 ::.)~
0
minet03 Messages postés 415 Date d'inscription samedi 4 janvier 2003 Statut Membre Dernière intervention 2 décembre 2005 3
5 avril 2005 à 19:08
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
0
Mickylord Messages postés 63 Date d'inscription mardi 25 décembre 2001 Statut Membre Dernière intervention 11 février 2007
5 avril 2005 à 19:41
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 !
0
minet03 Messages postés 415 Date d'inscription samedi 4 janvier 2003 Statut Membre Dernière intervention 2 décembre 2005 3
5 avril 2005 à 22:44
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
0
NitRic Messages postés 402 Date d'inscription mardi 1 mai 2001 Statut Membre Dernière intervention 15 août 2011
6 avril 2005 à 02:56
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 ::.)~
0
Rejoignez-nous