makumba961
Invité
|
|
« le: 16 Février 2009 - 15:01:31 » |
|
salut à tous en cette journée "neigeuse", je dois finir un prog d'info de calcul matriciel en "c", et ca foire sans que je ne comprenne pourquoi, le programme s'arrete de fonctionner et même mon prof d'info n'a pas su trouver l'erreur, donc je m'adresse aux geek en espérant qu'ils soient à la hauteur de leur réputation je pense que ca vient de la fonction principale, mais impossible de trouver l'erreur: (PS: j'ai rajouté un "sketch" qui s'incrémente pour savoir si le disfonctionnement est avant ou apres) merci d'avance! olivier /** ** ** Nom du fichier : simulation numérique ** ** Version: 1 ** ** Auteur : perrin olivier ** ** Date : 11/02/09 ** ** Sujet : ** ** Objet: ** ** ** ** ------------------------------------------------------------------------------- */ #include <stdio.h> #include <math.h> #include <string.h> #define TAILLE_MAX 10 /*PROTOTYPE DES FONTIONS*/ void ProduitMatriciel (double apuMatA[TAILLE_MAX][TAILLE_MAX],double apuMatB[TAILLE_MAX][TAILLE_MAX],double apuMatC[TAILLE_MAX][TAILLE_MAX], int ainSize); //int RechercheIndices (double apuMatA[TAILLE_MAX][TAILLE_MAX],int p,int q); /*FONTION PRINCIPAL*/ void main () { double apuMatA[TAILLE_MAX][TAILLE_MAX]={{1,0},{0,1}}; double apuMatB[TAILLE_MAX][TAILLE_MAX]={{-1,5},{2,3}}; double apuMatC[TAILLE_MAX][TAILLE_MAX]={{0,0},{0,0}}; ProduitMatriciel (apuMatA,apuMatB,apuMatC,2); } void ProduitMatriciel (double apuMatA[TAILLE_MAX][TAILLE_MAX],double apuMatB[TAILLE_MAX][TAILLE_MAX],double apuMatC[TAILLE_MAX][TAILLE_MAX], int ainSize) { int i=0; int j=0; int k=0; int l=0; double temp=0; for (i=0;i<2;i++) { for (j=0;j<2;i++) { l=l+1; printf ("sketch %d\n", l); temp=0; for (k=0;k<ainSize;k++) { apuMatC [j]=apuMatA[k]*apuMatB[k][j]; temp = temp + apuMatC[j]; } apuMatC[j]=temp; } } }
|
|
|
|
Robou
Rampant
Hors ligne
Aile: Ozone Buzz S
pratique principale: vol / site
vols: j'aime trop voler pour m'embetter à compter les vols
Messages: 0
|
|
« Répondre #1 le: 16 Février 2009 - 15:12:12 » |
|
Tu veux faire le produit de trois matrices 2x2 ?
|
Mon plus beau vol ? Le dernier !
|
|
|
marc
G33k, option ligne de commande
Rampant
Hors ligne
Aile: Freestyle2, Aspen2, BiStromboli
pratique principale: vol / site
Messages: 0
Aime le jus de betterave ! Plouf !
|
|
« Répondre #2 le: 16 Février 2009 - 15:12:52 » |
|
Faut lire les erreurs du compilateurs s'il en donne: test.c: In function ‘ProduitMatriciel’: test.c:57: error: invalid operands to binary * (have ‘double *’ and ‘double’) test.c:58: error: invalid operands to binary + (have ‘double’ and ‘double *’) test.c:60: error: incompatible types in assignment
et il faut toujours vérifier qu'il dit pas n'imp. Mais effectivement, tu multiplies des choux et des carottes ensemble: apuMatC[j]=apuMatA[k]*apuMatB[k][j]; temp = temp + apuMatC[j]; } apuMatC[j]=temp;
si tu regardes les types, ça donne: (double*) = (double *) * (double); (double) = (double) + (double *); } (double*)=(double);
La magie du C fait que ça compile souvent, pour des raisons qui sont connues. Ça demande au developpeur de faire attention à ce qu'il écrit Là en l'occurence, chez moi, le compilateur refuse d'aller plus loin. Tu peux commencer par revoir tes calculs
|
|
|
|
manu
Invité
|
|
« Répondre #3 le: 16 Février 2009 - 15:22:03 » |
|
salut à tous en cette journée "neigeuse" [...]
Ici c'est grand et même je crois que ça a encore bien Bon sinon pas mieux que Marc... Juste par contre si à l'avenir tu pouvais mettre ton code entre les balises prévues à cet effet (comme l'a fait Marc dans sa réponse) pour facilité la lecture. Bonne chance pour la suite.
|
|
|
|
Man's
Médaille en chocolat du 20millionième
enrouleur(se) de thermique
Hors ligne
Aile: Zeno 2
pratique principale: cross
vols: Plusieurs milliers de vols
Messages: 105
Up, up, and away !
|
|
« Répondre #4 le: 16 Février 2009 - 15:53:46 » |
|
Ho la vache... ...du C !!! Ca se fait encore en école ? En effet, je crois que Marc a déjà bien déblayé... Sinon, ca : en C, c'est vraiment pas beau, mais c'est juste pour ... ...la forme !
|
Plus nous nous élevons et plus nous paraissons petits à ceux qui ne savent pas voler - F. Nietzsche
|
|
|
akira
Invité
|
|
« Répondre #5 le: 16 Février 2009 - 15:59:42 » |
|
Ho la vache... ...du C !!! Ca se fait encore en école ?
Bah pourquoi ?? C'est encore un des langages qui tournent le plus vite, non ?
|
|
|
|
manu
Invité
|
|
« Répondre #6 le: 16 Février 2009 - 16:05:20 » |
|
Ho la vache... ...du C !!! Ca se fait encore en école ?
Bah pourquoi ?? C'est encore un des langages qui tournent le plus vite, non ? ha bon ? Remarque oui, rien d'étonnant à celà... En tout cas je suis pas étonné pour le C en école. C'est tout de même un langage idéal pour mettre un premier pied dans la programmation. Enfin je suis passé par là à mes débuts et je regrette pas...
|
|
|
|
marc
G33k, option ligne de commande
Rampant
Hors ligne
Aile: Freestyle2, Aspen2, BiStromboli
pratique principale: vol / site
Messages: 0
Aime le jus de betterave ! Plouf !
|
|
« Répondre #7 le: 16 Février 2009 - 16:08:31 » |
|
Ho la vache... ...du C !!! Ca se fait encore en école ?
Bah pourquoi ?? C'est encore un des langages qui tournent le plus vite, non ? Tu te lances dans un débat digne des trucs les plus stériles qu'on voit ici... Rien n'empêche de prendre du java et de le compiler de manière à obtenir un code aussi efficace qu'un truc en C. Et de toute manière, C "le plus rapide" est un peu un mythe... Un peu comme "java c'est lent et lourd". C'est souvent vrai, mais ce n'est pas la faute du langage, mais plus des developpeurs d'applis ou d'outils mal taillés. Du java sur microcontrolleur 8bits et 4KiB de RAM, ça existe et ça marche bien. M'enfin, là on s'égare. Moi je trouve ça bien de faire du C en école, parceque là, les gens que je vois sortir d'école, ils ont pas beaucoup de recul. Ils pensent que java=objet (même si java n'est qu'un langage parmis d'autres, et ce n'est pas lui qui dicte ce qu'est l'objet). Alors le C, ça permet de manipuler des trucs bas niveau, y'a rien de cacher sous le capo comme dans beaucoup de langage plus "sympa" (java, ada, c++, etc) , et ça permet de faire des erreurs avec les pointeurs, hein makumba
|
|
|
|
akira
Invité
|
|
« Répondre #8 le: 16 Février 2009 - 16:14:41 » |
|
Ne t'enflamme pas Marc, j'ai juste dit que le C etait AUSSI rapide que la plupart des autres langages, pas plus. Et comme il est plusbas niveau, ca doit etre plus facile d'optimiser qu'en laissant un compilateur JAVA faire le boulot. Je voulais pas faire le troll, hein ...
|
|
|
|
makumba961
Invité
|
|
« Répondre #9 le: 16 Février 2009 - 16:16:53 » |
|
Tu veux faire le produit de trois matrices 2x2 ?
en fait, juste de 2 matrices 2*2, la troisième, je ne fais que l'initialiser à 0 pour la remplir du produit des deux autres. Ho la vache... ...du C !!! Ca se fait encore en école ? En effet, je crois que Marc a déjà bien déblayé... Sinon, ca : en C, c'est vraiment pas beau, mais c'est juste pour ... ...la forme ! ouais du C, c'est quand même l'un des langages les plus répandus je crois. on a aussi du java et bientot de l'html, mais bon, c'est vrai que l'on en est encore aux rudiments de l'info et on y restera surement, mon école est généraliste et la partie "info" est ridicule^^. Faut lire les erreurs du compilateurs s'il en donne: test.c: In function ‘ProduitMatriciel’: test.c:57: error: invalid operands to binary * (have ‘double *’ and ‘double’) test.c:58: error: invalid operands to binary + (have ‘double’ and ‘double *’) test.c:60: error: incompatible types in assignment
et il faut toujours vérifier qu'il dit pas n'imp. Mais effectivement, tu multiplies des choux et des carottes ensemble: apuMatC[j]=apuMatA[k]*apuMatB[k][j]; temp = temp + apuMatC[j]; } apuMatC[j]=temp;
si tu regardes les types, ça donne: (double*) = (double *) * (double); (double) = (double) + (double *); } (double*)=(double);
La magie du C fait que ça compile souvent, pour des raisons qui sont connues. Ça demande au developpeur de faire attention à ce qu'il écrit Là en l'occurence, chez moi, le compilateur refuse d'aller plus loin. Tu peux commencer par revoir tes calculs okay! j'ai compris! par contre, tu pourrais m'expliquer pourquoi il met du (double *)? ca désigne un pointeur? si c'est le cas, c'est bizarre, je ne l'ai pas initialisé en pointeur salut à tous en cette journée "neigeuse" [...]
Ici c'est grand et même je crois que ça a encore bien Bon sinon pas mieux que Marc... Juste par contre si à l'avenir tu pouvais mettre ton code entre les balises prévues à cet effet (comme l'a fait Marc dans sa réponse) pour facilité la lecture. Bonne chance pour la suite. 15 cm de neige à nancy!!! et ouais, les gars pour skier, quittez les alpes pour la lorraine!
|
|
|
|
ParaPasquall
Rampant
Hors ligne
Aile: Ozone - Buzz
pratique principale: vol / site
vols: 70 vols
Messages: 0
Holidays in the rain
|
|
« Répondre #10 le: 16 Février 2009 - 16:29:02 » |
|
Salut,
Quand tu déclare un tableau bidimensionnel en C, c'est comme si tu déclarait un pointeur de pointeur. en gros: apuMatA[k][j] est un double apuMatA[K] est un double* apuMatA est un double **
Il faut que tu spécifie les deux indexes.
|
Si vis pacem, para pentum
|
|
|
Man's
Médaille en chocolat du 20millionième
enrouleur(se) de thermique
Hors ligne
Aile: Zeno 2
pratique principale: cross
vols: Plusieurs milliers de vols
Messages: 105
Up, up, and away !
|
|
« Répondre #11 le: 16 Février 2009 - 16:29:25 » |
|
Heu que ce soit clair, perso, j'adorais le C, je trouvais ca bien plus fun que le C++ par exemple, et en effet, c'est un langage qui reste un des plus proches du langage machine (comme dit Marc si le compilateur est bien fait), tout en étant relativement de haut niveau. Enfin bon, ca dépend pour quoi, je prefere de loin écrire une connexion reseau en Java qu'en C, mais je ne veux pas tomber dans le débat stérile... bref, le C, c'est sympa ! Je suis juste étonné de le voir enseigné encore maintenant, car c'est avec ce type de langage qu'on prend de mauvaises habitudes (par rapport à de l'ada ou du même du java*) et il trouve sa puissance entre des mains qui ont un peu plus d'expérience. My 2 cents. * Je parle même pas du Scheme, hein Marc !
|
Plus nous nous élevons et plus nous paraissons petits à ceux qui ne savent pas voler - F. Nietzsche
|
|
|
makumba961
Invité
|
|
« Répondre #12 le: 16 Février 2009 - 16:36:16 » |
|
Salut,
Quand tu déclare un tableau bidimensionnel en C, c'est comme si tu déclarait un pointeur de pointeur. en gros: apuMatA[k][j] est un double apuMatA[K] est un double* apuMatA est un double **
Il faut que tu spécifie les deux indexes.
je comprend le principe, mais pas ce que tu entends par "spécifier les deux index" sorry pour ma "noob attitude"
|
|
|
|
marc
G33k, option ligne de commande
Rampant
Hors ligne
Aile: Freestyle2, Aspen2, BiStromboli
pratique principale: vol / site
Messages: 0
Aime le jus de betterave ! Plouf !
|
|
« Répondre #13 le: 16 Février 2009 - 16:36:28 » |
|
Ne t'enflamme pas Marc, j'ai juste dit que le C etait AUSSI rapide que la plupart des autres langages, pas plus. Et comme il est plusbas niveau, ca doit etre plus facile d'optimiser qu'en laissant un compilateur JAVA faire le boulot. Je voulais pas faire le troll, hein ... maichant troll. Concernant l'optimisation automatique, c'est pas sûr qu'être bas niveau aide (même sûr que non), le compilateur ne sait pas ce que tu veux faire. C'est plus simple d'attaquer des problèmes bas niveau (genre écrire dans un registre mappé en mémoire), par contre, le langage fait qu'il est difficilement analysable automatiquement. C'est la même raison qui fait que tu n'aura sans doute jamais un outils aussi complet qu'eclipse+java pour du C. A partir du moment où tu commences à faire des manips avec les pointeurs, y'a des chances que tu mettes les batons dans les roues de ton "optimisateur". Je diverge, désolé makumba: tu as une variable du genre: double plop[x][y] = {...};
au début. Et bien le 'type' de plop, c'est un pointeur de pointeur de double, donc double**. Après, niveau type, tu as: plop[x] ou *(plop+x) == double* plop[x][y] ou *(*(plop+x)+y) == double
j'veux dire, c'est super simple non ? Sinon, question subsidiaire à 2€. int x = 0; int y[2] = {2,3};
qu'elle est la valeur de (non, je n'ai rien inversé). C'est ça aussi la beauté du langage: tu peux écrire des trucs qui ressemble à rien, et qui marche (c'est d'ailleurs tout un art, y'a même des concours) Je suis juste étonné de le voir enseigné encore maintenant, car c'est avec ce type de langage qu'on prend de mauvaises habitudes (par rapport à de l'ada ou du même du java*)
ouai, mais avec des pincettes alors. Si tu fais les choses bien en C, tu peux aussi avoir de très bonnes habitudes...
|
|
|
|
marc
G33k, option ligne de commande
Rampant
Hors ligne
Aile: Freestyle2, Aspen2, BiStromboli
pratique principale: vol / site
Messages: 0
Aime le jus de betterave ! Plouf !
|
|
« Répondre #14 le: 16 Février 2009 - 16:38:47 » |
|
je comprend le principe, mais pas ce que tu entends par "spécifier les deux index" sorry pour ma "noob attitude" quand tu utilises ton tableau, tu dois avoir autant de [] derrière que quand tu le déclares. Si t'en as moins, c'est que tu manipules des pointeurs, et dans ton cas, tu veux pas. Il t'a pas fait le dessin avec les petites flèches ton prof ? Si même les profs savent plus faire de C
|
|
|
|
Man's
Médaille en chocolat du 20millionième
enrouleur(se) de thermique
Hors ligne
Aile: Zeno 2
pratique principale: cross
vols: Plusieurs milliers de vols
Messages: 105
Up, up, and away !
|
|
« Répondre #15 le: 16 Février 2009 - 16:51:35 » |
|
ouai, mais avec des pincettes alors. Si tu fais les choses bien en C, tu peux aussi avoir de très bonnes habitudes...
C'est vrai, mais bon l'exemple avec x[y] que tu donnes montre bien la permissivité du langage. Personnellement, ca me dérange pas, mais à des fins pédagogiques, vaut peut-être mieux un langage plus strict. surtout que les notions de lisibilité et maintenance sont un peu les parents pauvres et souvent en opposition avec l'optimisation... m'enfin bon, on va pas troller.
|
Plus nous nous élevons et plus nous paraissons petits à ceux qui ne savent pas voler - F. Nietzsche
|
|
|
thibaud
Rampant
Hors ligne
Aile: brave petite mojo remisée au placard
pratique principale: autre (?)
Messages: 0
Y a pas que le parapente pour voler...
|
|
« Répondre #16 le: 16 Février 2009 - 16:57:28 » |
|
Pour la lisibilité, faites donc du python
|
|
|
|
stepson
Rampant
Hors ligne
Aile: ex NK1 et Spantik M, Morea Bivouac M
pratique principale: vol / site
vols: enfin passé les 100, accidenté vers les 150 vols
Messages: 0
|
|
« Répondre #17 le: 16 Février 2009 - 17:09:33 » |
|
moi ca me rappelle un TP de compil en ecole.... plus de 6 semaines avec plusieurs scéances par semaine pour écrire un compilateur..... en C... pour bien comprendre le fonctionnement.
et a la fin en 2 heures on a refait la meme chose avec lex & yacc ....
|
|
|
|
Man's
Médaille en chocolat du 20millionième
enrouleur(se) de thermique
Hors ligne
Aile: Zeno 2
pratique principale: cross
vols: Plusieurs milliers de vols
Messages: 105
Up, up, and away !
|
|
« Répondre #18 le: 16 Février 2009 - 17:23:28 » |
|
ben te plains pas, j'y ai eu droit aussi, mais en Ada au lieu du C... et comme je disais, Ada est vraiment moins permissif et moins rigolo... Bon, nous aussi on a eu droit au coup du Lex/Yacc juste après
|
Plus nous nous élevons et plus nous paraissons petits à ceux qui ne savent pas voler - F. Nietzsche
|
|
|
ppa
Rampant
Hors ligne
Aile: Sky EOS
pratique principale: apprends à voler
vols: trop peu de vols
Messages: 0
|
|
« Répondre #19 le: 16 Février 2009 - 17:34:27 » |
|
Hug,
J'ai pas tout lu, j'ai pas trop le temps là mais il me semble que "j" ne bouge jamais => boucle infinie (for (j=0;j<2;i++)) Pour le style : Tu peux aussi économiser une ligne en faisant for (j=0;j>2;j++,l++)
|
|
|
|
makumba961
Invité
|
|
« Répondre #20 le: 16 Février 2009 - 17:44:05 » |
|
Hug,
J'ai pas tout lu, j'ai pas trop le temps là mais il me semble que "j" ne bouge jamais => boucle infinie (for (j=0;j<2;i++)) Pour le style : Tu peux aussi économiser une ligne en faisant for (j=0;j>2;j++,l++)
ca marche!!!!!!!!!!!!!!!!!!!!!!!!! grand merci à toi pierre!!!!! c'est ce ridicule petit "i" qui faisait planter mon programme!!! (ca m'apprendra à faire du copier coller ) pour le reste, j'ai amélioré suivant les conseils de marc tous les détails de définition des variables et c'est nettement plus présentable merci à vous
|
|
|
|
stepson
Rampant
Hors ligne
Aile: ex NK1 et Spantik M, Morea Bivouac M
pratique principale: vol / site
vols: enfin passé les 100, accidenté vers les 150 vols
Messages: 0
|
|
« Répondre #21 le: 16 Février 2009 - 17:57:28 » |
|
ben te plains pas, j'y ai eu droit aussi, mais en Ada au lieu du C... et comme je disais, Ada est vraiment moins permissif et moins rigolo... Bon, nous aussi on a eu droit au coup du Lex/Yacc juste après on avait fait un truc en LISP aussi (Langage Incomprehensible Surchargé de Parenthèses ) t'as fait ca ou man's comme ecole pour le tp de compil ? c'est un grand "classique" hyper formateur mais il n'y a pas tant d'écoles que ca qui le proposaient et/ou qui le proposent encore.
|
|
|
|
Man's
Médaille en chocolat du 20millionième
enrouleur(se) de thermique
Hors ligne
Aile: Zeno 2
pratique principale: cross
vols: Plusieurs milliers de vols
Messages: 105
Up, up, and away !
|
|
« Répondre #22 le: 16 Février 2009 - 18:10:27 » |
|
ouais, Lisp, on y a eu droit aussi, enfin Scheme, un dialecte encore pire.... J'ai fait ça à l'Ensimag (je crois que Marc y a eu droit aussi, quelques années plus tard), et toi ?
|
Plus nous nous élevons et plus nous paraissons petits à ceux qui ne savent pas voler - F. Nietzsche
|
|
|
marc
G33k, option ligne de commande
Rampant
Hors ligne
Aile: Freestyle2, Aspen2, BiStromboli
pratique principale: vol / site
Messages: 0
Aime le jus de betterave ! Plouf !
|
|
« Répondre #23 le: 16 Février 2009 - 18:17:17 » |
|
Le lisp j'en ai fait quand j'étais à Lausanne, pas à Grenoble. Moi j'aime bien ce langage, d'ailleurs j'en fais encore de mon plein gré, mais un autre dialecte, le elisp. Ce qui manque parfois en école, c'est la diversité. C'est bien de voir différentes approches et différents paradigmes... Souvent les étudiants manquent de curiosité c'est un grand "classique" hyper formateur mais il n'y a pas tant d'écoles que ca qui le proposaient et/ou qui le proposent encore.
toutes les écoles/fac que j'ai cotoyées faisaient ce genre de chose. De mon côté, j'ai écris un compilateur pour un dialecte java (misc - scala) en école d'ingé. En fac à grenoble, il y avait la même chose pour un compilateur lisp écrit en java. A l'ensimag il y a toujours le projet "compil". Je crois que "polytec grenoble" fait ça aussi. Bref, tout le monde quoi... C'est un exo formateur et très très courant...
|
|
|
|
ppa
Rampant
Hors ligne
Aile: Sky EOS
pratique principale: apprends à voler
vols: trop peu de vols
Messages: 0
|
|
« Répondre #24 le: 16 Février 2009 - 19:19:11 » |
|
LISP = lists in stupid parenthesis Mieux : le lambda calcul pareil pour les parenthèses mais avec lambda en plus, non y avait une histoire d'évaluation des arguments il me semble : languages des récursivités de ouf en une minuscule ligne ADA a un typage fort => tu passes ta vie à faire des conversions
|
|
|
|
|