probléme : passage de l'adresse d'une matrice - C - Programmation
Marsh Posté le 28-04-2006 à 15:56:02
ReplyMarsh Posté le 28-04-2006 à 16:04:42
_darkalt3_ a écrit : renseigne toi sur l'utilisation des pointeurs |
mais c'est que le problaime n'est que deans cette ligne
Code :
|
je ne suis renseigner : et j'est trouver qu'il faut utiliser la matrice comme un vecteur de dimention (m*n) .
ca s'est bien
mais le prob , est que je dois absolument l'utiliser sous forme de matrice , pour faire ensuite dans l'exercice l'adition de deux poly (avec 2 variable x,y) , et la multiplication ...
Marsh Posté le 28-04-2006 à 16:06:43
- corrige tes fautes de français, tu fais mal aux yeux.
- quel est le problème ? plantage ? compilation impossible ? ...
- renseigne toi sur l'utilisation des pointeurs
Marsh Posté le 28-04-2006 à 16:11:15
_darkalt3_ a écrit : - corrige tes fautes de français, tu fais mal aux yeux. |
un liens pour se renseigner sur ce truc ? svp
Marsh Posté le 28-04-2006 à 16:16:30
ReplyMarsh Posté le 28-04-2006 à 22:50:11
big_dadi_fat,
je doutes que le cast de int [][] en int * est propre
si tu tiens absolumment a utiliser 2 dim pour ta matrice alors
void constructeur( int a[][30] ) /*a c'est le nom de la matrice*/
{
int i,j,maxi,maxj; /*maxi et maxj : les plus grand exposant de X et Y (dans le polynôme)*/
printf("donnez le plus grand exposant de X : " );
scanf("%d",&maxi);
printf("donnez le plus grand exposant de Y : " );
scanf("%d",&maxj);
for(i=0 ; i<=maxi ; i++)
for(j=0 ; j<=maxj ; j++)
{
printf(" la coeficien du monome ( x^%d * y^%d ) : " , i , j );
scanf(" %d " , &a[i][j] ); /*c'est la qu'il y a un probléme*/
}
}
int main()
{
int t1[30][30];
constructeur( t1 );
return 0;
}
Marsh Posté le 29-04-2006 à 20:36:04
big_dadi_fat a écrit : salut |
1 : il faut absolument que tu te rachètes une orthographe et une grammaire ou une méchante dose de concentration.
2 : je te conseille vivement d'écrire du code structuré et donc, réutilisable. Parce que il y a au moins dix façons différentes de résoudre ton problème mais il te faut une solution plus ou moins élégante.
Personellement, le premier truc que j'aurais fait serait la création d'un type matrice :
Code :
|
comme tu remarques, on est pas obligé d'avoir un tableau à double dimensions, pourquoi ?
Dans un tableau à 2 dimensions, j'ai cols*rows éléments, avec un tableau à une dimension de cols*rows indexs, il est possible de ranger tous les éléments de la matrice à 2 dimensions et d'atteindre l'élément [i][j] (avec i la colonne et j la ligne) par la notation tab[j*cols + i]
Exemple dans la matrice M de 3 colonnes par 4 lignes :
Code :
|
Elle est représenté par le tableau T :
Code :
|
et l'élement à M[2][1] (=6 parce que les index commencent à 0) est bien égale à T[1*3 + 2] soit T[5] (tjs avec les index commençant à 0, c'est à dire que T[0]=1)
Le gain est qu'on utilise un tableau simple, l'inconvénient est que l'accès à une case de la matrice nécessite forcément un calcul de l'index dans le tableau (1 multiplication + 1 addition).
Nous savons qu'il est possible de représenter une matrice à 2 dimensions dans un tableau à simple dimensions, maintenant, on a juste besoin de 4 fonctions :
1 : allocation de structure.
2 : désallocation de structure
3 : assignation de valeur dans la matrice
4 : récupération de valeur.
allocation de structure : prend en paramètre le nombre de colonnes, de lignes et renvoit un pointeur vers une structure matrix allouée en mémoire (c'est un exemple, on peut faire autrement):
Code :
|
la désallocation prend juste un pointeur vers une matrice :
Code :
|
maintenant, verrais-tu comment écrire :
Code :
|
??
et
Code :
|
??
et surtout, vois-tu l'intérêt de faire ainsi ???
Marsh Posté le 29-04-2006 à 21:02:30
brojnev a écrit : comme tu remarques, on est pas obligé d'avoir un tableau à double dimensions, pourquoi ?
|
Remarquablement bien expliqué. Seul détail à rectifier: que tu travailles en une dimension ou en plusieurs, le calcul "j * col + i" se fera de toute les manières car, en mémoire, il n'y a toujours qu'une seule dimension. Soit c'est toi qui écrit le calcul, soit c'est l'assembleur...
brojnev a écrit : allocation de structure : prend en paramètre le nombre de colonnes, de lignes et renvoit un pointeur vers une structure matrix allouée en mémoire (c'est un exemple, on peut faire autrement):
|
Là, je suis moins d'accord. Tu considères d'office que le programmeur n'utilisera que des pointeurs et tu lui interdis d'utiliser un "matrix m"
Moi, ma fonction "alloc" et "free" ne s'occuperaient que de l'allocation et libération de "tab" et je laisserais au programmeur le choix d'utiliser une variable de type "matrix m" en appelant "alloc_matrix(&m)" ou un pointeur "matrix *pt" et en appelant "alloc_matrix(pt)" (en laissant au programmeur le soin d'allouer "pt" )...
Marsh Posté le 30-04-2006 à 00:27:06
Sve@r a écrit : Remarquablement bien expliqué. Seul détail à rectifier: que tu travailles en une dimension ou en plusieurs, le calcul "j * col + i" se fera de toute les manières car, en mémoire, il n'y a toujours qu'une seule dimension. Soit c'est toi qui écrit le calcul, soit c'est l'assembleur... |
tout à fait exact.
Sve@r a écrit : |
Complètement d'accord, c'est pour cette raison que j'ai spécifié que l'on peut faire autrement
Mais, cependant, je n'aime pas trop l'idée de laisser le soin au programmeur. Évidemment, c'est un choix qui dépend principalement de ce que l'on veut faire. Mon idée de base était surtout de présenter comment fonctionnaliser et aussi, programmer de façon orientée objet en C : Un type de donnée (matrix) + des fonctions pour y accéder.
Dans cette optique, il faut aussi rajouter les fonctions :
Code :
|
Le problème avec les pointeurs est principalement la vérification de leur validité à effectuer à chaque fois qu'on les utilise, mais, dans notre cas, les vérifications se font dans les 4 fonctions d'accès et la fonction de désallocation.
big_dadi_f at !!! c'est pour toi qu'on se prend la tête là ! un feedback serait fort apprécié Tu comprends ce qu'on raconte là où tu fais ça à l'arrache sans structures de données ????
Marsh Posté le 30-04-2006 à 10:16:31
Citation : |
merci les gas , mais je ne comprend pas trop , ce vous raconter (je sis débutant en C)
par contre j'ai fais le code suivant:
Code :
|
ditent moi comment je peux l'améliorer
merci
[i]notte: je ve aussi afficher le poly.
Marsh Posté le 30-04-2006 à 11:10:45
big_dadi_fat a écrit :
|
Hum... je suis horrifié de tout ça et surtout que cela fonctionne...
Bon, les gros pb
1) scanf("%d",a+(n*i+j)); => là, je comprends rien à ce que tu veux faire. Probablement que le compilo non plus...
2) t1 est un tableau en 2 dimensions. Quand tu passes "t1" à "constructeur", tu lui passes un "int[n][n]" (on pourrait être tenté d'écrire "int **" mais lorsque tu ferais "t[i][j]", le compilo ne connaissant pas la taille d'une ligne ne pourra pas calculer "i * nbcol + j" donc non) mais en aucun cas un "int *" => Evidemment, tu le castes en (int*) pour éviter les warning mais vaut mieux, pour éviter les warning, supprimer la cause du warning que masquer cette cause => soit tu bosses en 1 dimension du début à la fin, soit tu bosses en 2D mais tu mélanges pas les 2 façons de faire...
Pour améliorer:
- tu fais 2 fois une saisie "plus grand exposant" etc. Autant programmer une fonction qui fasse ça et tu appelles cette fonction pour t1 et pour t2 (une surcouche à "constructeur" en fait)
- c'est dommage qu'à chaque fois tu sois obligé de passer à tes fonctions ton tableau, l et c (3 paramètre par matrice). Si, comme l'a dit brojnev tu créais une structure "s_matrix" contenant
Il te suffirait de passer juste l'adresse de cette structure à tes fonctions (un seul paramètre par matrice) qui auraient automatiquement accès à l'ensemble des éléments de la matrice et dans le main() ça t'éviterait 6 variables "t1, t2, l1, l2, c1, c2" là où on pourrait n'en mettre que 2
- "main" est de type "int"
Voilà en gros. Ensuite, des commentaires expliquant ta façon de voir l'algo seraient appréciés...
Marsh Posté le 30-04-2006 à 12:00:54
Sve@r > je crois que tu n'as pas compris ce qu'est un tableau 2d, un 'int **' peux contenir l'adresse d'un 'int *' ou l'adresse d'un tableau 'int *', mais certainement pas l'adresse d'un tableau 2d
l'adresse d'un tableau 'int [n][n]' est typée 'int (*)[n]'
le prototype correcte pour constructeur est
void constructeur( int (*a)[n] , int pl , int pc )
ou (strictement equivalent)
void constructeur( int a[][n] , int pl , int pc )
Marsh Posté le 30-04-2006 à 12:06:22
skelter a écrit : Sve@r > je crois que tu n'as pas compris ce qu'est un tableau 2d, un 'int **' peux contenir l'adresse d'un 'int *' ou l'adresse d'un tableau 'int *', mais certainement pas l'adresse d'un tableau 2d |
J'ai dit "on pourrait" => c'est un conditionnel sous entendant "si on ne savait pas ce qu'est un tableau 2d on pourrait..."
skelter a écrit : ou (strictement equivalent) |
Oui, c'est ce que j'ai écrit (sauf que j'y ai mis le nb d'éléments de la première dimension puisqu'il est connu...)
Marsh Posté le 30-04-2006 à 19:20:38
mais je ne comprend pas bien ce que
void constructeur( int a[][30] )
veut dire !
et méme si je l'utilise comme ca:
Code :
|
ca me permetra peut etre de diminuer les argument de constructeur ,
mais les autre fonction (addition et soustraction) reste -aubligatoirement- avec tout ses argument ?
et pour l'utilisation des structure je ne vois pas comment je peut faire ! ( une peutite proposition de votre part pourait me permetre de commencer )
merci
Marsh Posté le 30-04-2006 à 23:51:58
marre des fautes de français, malgré le fait que je te l'ai signalé plusieurs fois, tu t'en fous.
Marsh Posté le 28-04-2006 à 15:46:25
salut
j'ai un probléme avec une partie d'un exercice (dans le passage de l'adresse ... etc) , et je ne vois pas comment je peut faire , alors si quelqu'un peut m'aider :
Il faut faire une fonction qui construis une matrice à partire d'un polynôme ,
donc je dois saisir les valeur (les coeficiens) dans une matrice .
voici le code que j'ai fait :
merci