Fonction qui renvoie un tableau multidimensionnel

Fermé
maniqk - 18 juin 2013 à 17:04
 maniqk - 21 juin 2013 à 09:42
Bonjour,

Je cherche à mettre à jour les valeurs d'un tableau de float par appel à une fonction.
En fait je définis une matrice : float matrice[6][6] = {... (je ne mets pas les valeurs)};
Puis je fais appel à la fonction LU_simple dont je joins le code ci-dessous :

void LU_simple(float matrice[6][6]){
int j,k=0,l;
while(k<nb_lig_matrice-1){
for(j=k;j<min(nb_lig_matrice,nb_col_matrice)-1;j++){
matrice[j+1][k] = matrice[j+1][k]/matrice[k][k];
}
if(k<nb_col_matrice-1){
for(l=k;l<nb_col_matrice-1;l++){
for(j=k;j<nb_lig_matrice-1;j++){
matrice[j+1][l+1] = matrice[j+1][l+1]-matrice[j+1][k]*matrice[k][l+1];
}
}
}
k++;
}
}

Je ne pense pas qu'il soit important de comprendre ce qu'il y a derrière ce code mais en gros je traite les cases de la matrice...

Lorsque je compile, tout a l'air de bien se passer mais quand je lance le programme, le compilateur pense que l'on fait un traitement sur une matrice[6] et non une matrice[6][6].

Cela veut il dire que ma programmation de la fonction ci-dessus est incorrecte ?


D'autre part, je souhaite en fait traiter des matrices de taille quelconque. En fait je récupère une matrice créée via Matlab et celle-ci peut faire n'importe quelle taille (la taille est "choisie" tout de même). Ma question est : suis-je obligé de passer par une (ou plusieurs) allocations dynamiques de tableau ?

Merci d'avance...
A voir également:

6 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 841
18 juin 2013 à 21:49
Bonjour,

Lorsque je compile, tout a l'air de bien se passer mais quand je lance le programme, le compilateur pense que l'on fait un traitement sur une matrice[6] et non une matrice[6][6].
Qu'est-ce qui te fait penser que le compilateur pense ça ?

Ma question est : suis-je obligé de passer par une (ou plusieurs) allocations dynamiques de tableau ?
Tu parles de taille connue. Dans ce cas, il te suffit de faire une matrice statique : float matrice[][COLMAX] = {{...},...}; La première dimension est facultative.
Et en haut du programme #define COLMAX 6
Tu auras juste à changer la valeur.

Si par contre, la taille est connue à l'exécution, alors oui tu devras passer par l'allocation dynamique.

Cdlt,
0
Bonjour,

Euh pour le compilateur je ne sais pas trop, je pensais que c'est lui qui interprétait les lignes de code écrites... Mais c'est probablement un problème au niveau du code, vu que ce n'est pas bien interprété... Merci pour la réponse sur les allocations dynamiques !

Sinon en fait je ne comprenais pas pourquoi ça ne fonctionne pas, j'avais testé une fonction du même genre que j'ai trouvée sur le net :

void init_tab(int tab[3][3]){
int i,j;
for(i=0;i<3;i++){
for(j=0;j<3;j++){
tab[i][j] = 1;
}
}

avec le main :

void main(){
int tab[3][3] = {0};
init_tab(tab);
}

Et là mes valeurs sont bien mises à jour... Quelle est ou quelles sont les différences avec ma fonction ?



J'ai une autre petite question dans le même thème... :
Une fonction peut elle être appliquée à des tableaux de tailles différentes ?
Je veux dire, si j'ai deux tableaux tab1[6][6] et tab2[3][3], y a t'il un moyen d'appliquer la même fonction à ces deux tableaux ? (de façon indépendante)
Je demande parce que quand on déclare la fonction, on déclare la taille du tableau à traiter... A moins que quelque chose ne m'échappe, je suis relativement débutant.

Merci d'avance !
0
Bon en fait je n'ai pas trop compris pourquoi mais finalement ce code marche...
Par contre ma deuxième question sur l'applicabilité d'une fonction a des tableaux de taille variable est d'actualité
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 841
19 juin 2013 à 14:28
void main(){
Mauvais prototype du main(). Mets plutôt int main(void).
De plus main() renvoie un 0 lorsque tout s'est bien passé. Mets donc return 0; à la fin du main().

Une fonction peut elle être appliquée à des tableaux de tailles différentes ?
Je veux dire, si j'ai deux tableaux tab1[6][6] et tab2[3][3], y a t'il un moyen d'appliquer la même fonction à ces deux tableaux ? (de façon indépendante)

Oui, c'est possible. Mais dans ce cas, il faudra passer par un pointeur et envoyer la taille lors de l'appel à la fonction.
0

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

Posez votre question
Je ne suis pas très doué avec les pointeurs... (comme beaucoup de monde je pense)

Quand tu dis qu'il faut passer par un pointeur, tu parles pour le tableau j'imagine ? Parce qu'envoyer la taille peut se faire avec un int classique je pense..
Il faudrait donc que je mette dans la fonction l'adresse de la première case du tableau si je comprends bien ?
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 841
19 juin 2013 à 21:51
Quand tu dis qu'il faut passer par un pointeur, tu parles pour le tableau j'imagine ?
Yep. De toute façon, il est impossible d'envoyer des tableaux dans des fonctions. C'est automatiquement convertit en pointeur.

Il faudrait donc que je mette dans la fonction l'adresse de la première case du tableau si je comprends bien ?
Yep. Mais cela est fait automatiquement.

L'idée est d'envoyer un pointeur simple en entrée de paramètre ainsi que la taille (nb de colonnes et nb de lignes). Ensuite, il te suffira de parcourir tous les éléments du pointeur (2 boucles for).
0
Bonjour,

Merci je vais tenter ça aujourd'hui !
J'ai trouvé hier sur internet le protoype suivant : void maFonction(int *tableau, int tailleTableau);
Il faut juste que je change int *tableau en int **tableau non ? Vu que je veux traiter des tableaux multidimensionnels... Je demande mais de toute façon je vais tester !

Merci encore,
maniqk
0
Bon ben j'ai légèrement modifié le code, mon prototype est devenu :
void LU_simple(float **tableau, int nbLignes, int nbColonnes);
Le corps de ma fonction est le même, j'ai juste changé le nom des paramètres.

Dans mon main, je fais appel à la fonction de cette façon là :
LU_simple(matrice, nb_lig_matrice, nb_col_matrice);
où j'ai défini auparavant la matrice matrice[6][6], et le nombre de lignes et colonnes de la matrice..

Lors de la compilation j'obtiens l'erreur suivante :
argument of type "float (*)[6]" is incompatible with parameter of type "float **"

Si j'ai bien compris c'est une histoire de pointeurs... Mais j'ai du mal avec la syntaxe, peux tu me dire ce qui ne va pas là dedans ?
0
Bon j'ai rechangé, j'obtiens un truc qui marche :
void LU_simple(float *tableau, int nbLignes, int nbColonnes);

Avec appel de la fonction dans le main :
LU_simple(*matrice, nb_lig_matrice, nb_col_matrice);

Ca compile, j'obtiens ce que je veux, mais j'aimerais bien comprendre pourquoi...

La fonction attend un pointeur en premier paramètre, que signifie dans l'appel de la fonction " *matrice " ? C'est la première case du tableau ?
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 841
20 juin 2013 à 14:03
Avec un peu de retard :
void maFonction(int *tableau, ...); est le bon prototype. Il ne faut pas passer par la double dimension puisque le compilateur a besoin de connaître le nombre de colonne qui n'est pas fixe dans ton cas.
Le bon prototype est donc : void LU_simple(float *tableau, const int nbLignes, const int nbColonnes);
Ensuite, tu pourras faire une boucle for de ce genre :
for(i=0;<nbLignes; i++) {
    for(j=0;j<nbColonnes; j++) {
          /*la valeur de la case d'indice i j est : tableau[i*nbColonnes+j]*/
    }
}
0
Je pense avoir fait quelque chose de similaire dans mon programme.
Par contre, il y a quelque chose que je ne comprends pas.. (encore)

J'applique ma fonction à deux matrices différentes :
LU_simple(*matrice, nb_lig_matrice, nb_col_matrice);
LU_simple(*copie, nb_lig_copie, nb_col_copie);


Où les matrices sont déclarées de cette façon :
float matrice[6][3] = ...;
float copie[6][6] = ...;

Et je print les valeurs de chaque matrice après traitement (j'ai testé chaque matrice séparément pour le moment). Dans le premier cas, j'ai bien dans ma console les valeurs voulues après traitement, dans le deuxième cas je n'ai rien du tout. C'est forcément une erreur dans le corps de la fonction non ? Mais j'ai vérifié "à la main", mon algorithme semble correct...
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 841
20 juin 2013 à 18:25
L'erreur peut venir de différents endroits. Peux-tu poster ton code entre deux balises "code" (bouton <> à droite du bouton S : souligné).
0
Bonjour,

J'avais posté mon code mais je pense avoir trouvé mon erreur, il manquait un -1 quelque part ce qui faisait que je sortais du tableau à un moment donné... Ce qui a sûrement fait bugger le programme.
Je pense que je vais essayer de me débrouiller pour la suite, mais merci beaucoup pour toutes tes réponses, ça m'a vraiment bien aidé !

Cordialement,
maniqk
0