OVH Cloud OVH Cloud

Matrice

3 réponses
Avatar
Bajou
Bonjour,
j'ai =E9cris ce code, et j'ai eu une erreur, je sais pas quelle est la
raison!
Merci pour votre aide.

//D=E9claration:
void croisement(int*,int);
int gene[100][100]
int taille_popu=3D20;

//appel de la fonction croisement
croisement(gene,taille_popu);

la faute est:
error C2664: 'croisement' : cannot convert parameter 1 from 'int
[100][100]' to 'int *'

Est ce que j'ai fait une faute dans l'appel de la matrice gene?
Merci

3 réponses

Avatar
Marc Boyer
Le 26-09-2005, Bajou a écrit :
Bonjour,
j'ai écris ce code, et j'ai eu une erreur, je sais pas quelle est la
raison!
Merci pour votre aide.

//Déclaration:
void croisement(int*,int);
int gene[100][100]
int taille_popu ;

//appel de la fonction croisement
croisement(gene,taille_popu);


La variable 'gene' est une matrice 100x100 d'entiers,
soit en fait un tableau de 100 tableaux de 100 entiers.
La variable croisement attend un tableau d'entiers.
Un tableau d'eniers et un tableau de tableaux d'entiers
sont des choses différentes.

Marc Boyere
--
À vélo, prendre une rue à contre-sens est moins dangeureux
que prendre un boulevard dans le sens légal. À qui la faute ?

Avatar
Bajou
Ce qui est sure que un tableau d'eniers et un tableau de tableaux
d'entiers
sont des choses différentes. A ce que je comprends c'est que la
déclaration de la fonction croisement:
void croisement(int*,int); est fausse!???
Est ce que je dois faire comme ca?:
void croisement(int**,int);

Merci
Avatar
kanze
Bajou wrote:

Ce qui est sure que un tableau d'eniers et un tableau de
tableaux d'entiers sont des choses différentes. A ce que je
comprends c'est que la déclaration de la fonction croisement:
void croisement(int*,int); est fausse!???
Est ce que je dois faire comme ca?:
void croisement(int**,int);


Le mieux ne serait-il pas d'écrire littéralement ce que tu
attends :
croisement( int [100][100], int ) ;
Ce n'est pas effectivement ce que tu vas avoir, parce que le
langage à des règles spéciales pour ce cas-ci, mais ça doit
marcher. (Ce que la déclaration ci-dessus déclare exactement,
c'est :
croisement( int (*)[100], int ) ;
Mais à mon avis, la première écriture exprime plus clairement
l'idée que tu veux un tableau, et non l'adresse d'un élément
seul.)

Alternativement, on peut passer des tableaux par référence :
croisement( int (&)[100][100], int ) ;
Ça pose un peu le problème, en révanche, que ce n'est pas trop
naturel de les traiter comme ça s'ils sont alloués
dynamiquement, parce que le type complet est déjà perdu en
sortie de new. C-à-d :

int matriceLocale[ 100 ][ 100 ] ;
croisement( matriceLocale ) ; // Bon
int (*matriceDynamique)[ 100 ] = new int[ 100 ][ 100 ] ;
croisement( ??? ) ;

Note qu'avec la première solution, il faut que la deuxième
dimension soit une constante ; on peut écrire :
croisement( int [][ 100 ], int ) ;
mais non :
croisement( int [][], int ) ;
ni :
croisement( int (*)[], int ) ;
Et avec la deuxième solution, il faut que les deux dimensions
soient constantes.

Tout compte fait, je crois que la meilleur solution, c'est
d'écrire une classe Matrice, qui se base sur std::vector ou sur
std::valarray. Les tableaux à la C ne marchent pas très bien.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34