need help pour un programme en "c"

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 ROTFL

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[i][j]=apuMatA[i][k]*apuMatB[k][j];
			temp = temp + apuMatC[i][j];
		}
		apuMatC[i][j]=temp;
	}
}

}

Tu veux faire le produit de trois matrices 2x2 ?

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 :wink: Là en l’occurence, chez moi, le compilateur refuse d’aller plus loin. Tu peux commencer par revoir tes calculs :wink:

:affraid:
Ici c’est grand :soleil: et même je crois que ça a encore bien :ppte: :wink:

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. :pouce: Bonne chance pour la suite.

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 :

 
l=l+1;

en C, c’est vraiment pas beau, mais c’est juste pour … …la forme ! :wink:

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…

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 :clown:

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 … :trinq:

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.

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^^.

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 :grat:

15 cm de neige à nancy!!! :affraid: :affraid: :affraid: :mrgreen:
et ouais, les gars pour skier, quittez les alpes pour la lorraine! :sors:

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.

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 ! :slight_smile:
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 ! :wink:

je comprend le principe, mais pas ce que tu entends par “spécifier les deux index” :oops: sorry pour ma “noob attitude” :canape:

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é :mrgreen:

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 ? :clown:

Sinon, question subsidiaire à 2€.


int x = 0;
int y[2] = {2,3};

qu’elle est la valeur de

x[y]

(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) :clown:

ouai, mais avec des pincettes alors. Si tu fais les choses bien en C, tu peux aussi avoir de très bonnes habitudes…

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 :mrgreen:

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.

Pour la lisibilité, faites donc du python
:speedy: :canape:

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 …

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 :wink:

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++)