Problèmes diverses

Fermé
zam - 26 oct. 2015 à 16:32
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 26 oct. 2015 à 21:58
Bonjour,

Je vous expose mon problème. Je suis actuellement en train de créer un programme C pour mon université. Ce n'est pas le 1er programme que je fais, ni le plus dur. Ma question ne porte pas sur un détail précis mais j'espérais pouvoir m'appuyer sur votre expérience. Voilà, mon programme saute des instructions. Je demande des affichages qu'il "oublie". Après plein de vérifications sur la fermeture d'accolades, des parenthèses ou autres deux points oubliés, rien, pas une erreur apparente, pas même à la compilation.
Deuxième constatation, j'effectue a un moment une vérification sur la diagonale d'une matrice. Si une valeur est égale à 0, la fonction retourne 1. Cette fonction retournait toujours 0, j'ai donc mis des printf sur les valeurs ciblées et ils me retournent effectivement que des valeurs sont égales à 0, donc le programme devrait retourner 1, mais non. Encore plus bizarre, quand j'appelle cette fonctionp lus loin dans mon programme, avec la même matrice, elle me donne toujours le bon résultat. J'ai vérifié, la matrice est bien déclarée et remplie avant le 1er appel.
Enfin voilà, il y a ces erreurs plus d'autres qui sont pour moi dues à un bugg, même après réa allumage de l'ordi. Mais si ce problème, par expérience, parle à quelqu'un, je serais ravi qu'il m'éclaire.

1 réponse

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 841
Modifié par fiddy le 26/10/2015 à 16:52
Bonjour,

Pour ma part, j'opterais pour un problème dans ton code...
Peux-tu poster ton code en utilisant la balise code.
Exemple :
<code c>
ici tu mets ton code
</code>


Google is your friend
0
Bonjour Fiddy,
comme par magie, j'ai copié mon code dans un autre fichier.c je l'ai exécuté et hop aucune erreur. Miracle.. Mais j'ai récupéré d'autres erreurs, dont celle là que je te fais parvenir.


void resoluSyst(systeme *s,int taille)
{
  float somme;
  int i,j,k,ecart;
  float *tab;
  tab=calloc(taille,sizeof(float));
  verifieDiagonales(s,taille);
  printf("Quel écart minimale voulez-vous atteindre(pour la précision de vos résultats)?\t");scanf("%d",&ecart);videBuffer();
  for (k=0;k<ecart;k++)
  {
      for (i=0;i<taille;i++)
	{
	  somme=0;
	  for (j=0;j<taille;j++)
	    {
	        if (i!=j)
		{
		  somme=somme+(*s).matrice[i][j]*-1*tab[j];
		}
	    }
	  (*s).reponses[i]=(1/(*s).matrice[i][i])*((*s).vecteurB[i]+somme)
       	}
      tab=(*s).reponses;
   }


A chaque itération, tab[j] prend la valeur de somme, chose qui n'est absolument pas marquée dans ce code. Quand je ré-ouvre ce code dans un autre fichier.c, miracle, cette erreur disparait. Je perds foi en mon ordi..
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 841
26 oct. 2015 à 18:48
Déjà, j'aimerais bien voir comment tu as initialisé ta variable s ?

Ensuite sur ton code :
float *tab;
tab=calloc(taille,sizeof(float));

Pourquoi passer par un pointeur ?
D'autant qu'il y a une fuite de mémoire par la suite : tab=(*s).reponses;

Au plus simple : float tab;
Et tab=(*s).reponses;

Sinon, ton problème n'est pas bien clair. Je te conseille de faire le ménage au niveau de tes fichiers.c, de tout bien fermer, de tout supprimer les fichiers objets. Et de recompiler tout ça proprement.

Cdlt,
0
typedef struct {
float **matrice;
float *vecteurB;
float *reponses;
}


J'alloue mes matrices avec une taille n, qui donnera une matrice carrée pour la première. Je crois donc nécessaire de passer par un *tab pour stocker *reponses, non?
Que veux-tu dire par "fuite de mémoire"?
Pour ce qui est du reste, une chose est sûre, ça ne semble pas venir du code. A un moment donné, j'ai voulu décomposer mon code c en plusieurs codes c en les incluant dans le code principal. C'est à partir de là que ça a bugge, mais c'est bizarre car j'ai déjà fait ça plusieurs fois, avec les ifndef et la syntaxe qui va avec.
0
typedef struct {
float **matrice;
float *vecteurB;
float *reponses;
}systeme;

systeme s;


Je rectifie.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 841
26 oct. 2015 à 21:58
Et pourrait-on voir aussi l'allocation de matrice, vecteurB et reponses ?
C'est nécessaire d'avoir tous les éléments pour donner une réponse précise.

Pour la fuite mémoire, tu fais :
float *tab;
tab=calloc(taille,sizeof(float));
Ce qui signifie que tu crées une zone mémoire dans le heap et que tab pointe dessus.

tab=(*s).reponses;
Là, tu écrases l'adresse mémoire pointant vers la zone allouée. Mais cette zone existe toujours puisque tu n'as pas utilisé de free(tab)...

Pour le reste, il faut savoir qu'en C, ce n'est pas parce qu'un code fonctionne correctement, qu'il compile sans erreur qu'il n'en contient pas... C'est d'ailleurs souvent pour cette raison, qu'on a l'impression que son ordinateur a des comportements étranges...
0