c'est normal que ça ne marche pas. Ta fonction retourne un "couple" mais la valeur n'est pas utilisé par ton main...
__________________________
............ Curtis: RTS 3D .............. ......
........... TeamMoteurProg...........
En gros, les valeurs qui s'affichait selon ta méthode était des valeurs aléatoires. Je te montre : tu dois corrigé ton programme ainsi :
#include <stdio.h>
#include <stdlib.h>
#include <math.h> //bibliothèque contenant les fonctions log, log10 et pow dont on a besoin
const double R=8.314;
const long F=96500;
struct couple
{
double pot;
char ox[10];
double C_ox;
char red[10];
double C_red;
long x1;
long x2;
long x3;
long x4;
long n;
char acide[10];
double C_acide;
char base[10];
double C_base;
double pka;
};
struct couple chargement_manuel( void )
{
struct couple redox;
printf("Quel est le nombre d'electrons ?\n");
scanf("%ld", &redox.n);
if (redox.n == 0) //si couple acido-basique
{
printf("Quel est l'acide?\n");
scanf("%s", &redox.acide);
printf("Quel est la concentration de l'acide?\n");
scanf("%lf", &redox.C_acide);
printf("Quel est la base?\n");
scanf("%s", &redox.base);
printf("Quel est la concentration de la base?\n");
scanf("%lf", &redox.C_base);
printf("Quel est le pka du couple?\n");
scanf("%lf", &redox.pka);
}
else // sinon couple redox
{
printf("Quel est le potentiel redox?\n");
scanf("%lf", &redox.pot);
printf("Quel est l'oxydant? (n'oubliez pas d'indiquer la charge et sans espace)\n");
scanf("%s", redox.ox);
printf("Quelle est la concentration de l'oxydant (en mol/L)?\n");
scanf("%lf", &redox.C_ox);
printf("Quel est le reducteur? (n'oubliez pas d'indiquer la charge et sans espace)\n");
scanf("%s", redox.red);
printf("Quelle est la concentration du reducteur (en mol/L)?\n");
scanf("%lf", &redox.C_red);
printf("Quel est le coefficient stoechiometrique de H+ ?\n");
scanf("%ld", &redox.x1);
printf("Quel est le coefficient stoechiometrique de l'oxydant ?\n");
scanf("%ld", &redox.x2);
printf("Quel est le coefficient stoechiometrique du reducteur ?\n");
scanf("%ld", &redox.x3);
printf("Quel est le coefficient stoechiometrique de l'eau ?\n");
scanf("%ld", &redox.x4);
}
return redox;
}
int main( void )
{
long choix, menu=1;
double T=0, var=0;
long i=0, j=0;
long pH=0;
while (menu)
{
printf("=== Menu ===\n\n");
printf("1. Chargement manuel\n");
printf("2. Chargement depuis un fichier\n");
printf("3. Affichage de l'equation redox et calcul du potentiel apparent\n");
printf("4. Affichage du diagramme\n");
printf("5. Enregistrement des resultats dans un fichier\n");
printf("6. Chargement des resultats depuis un fichier sauvegarde\n");
printf("7. Quitter\n");
printf("\nVotre choix : ");
scanf("%ld", &choix);
printf("\n");
switch (choix)
{
case 1:
printf("\n === Chargement manuel ===\n\n");
printf ("Quel est le nombre de couples? : ");
scanf ("%ld", &j);
printf ("Quelle est la temperature? : ");
scanf ("%lf", &T);
var = (R*T*log(10))/F;
struct couple redox; // creation d'un tableau de structure.
for (i=0;i<=j-1;i++)
{
printf("\n== Parametres pour le couple numero %ld ==\n",i+1);
redox = chargement_manuel( );
//verification;
if (redox.n == 0)
printf("l'acide est %s, la base est %s et le pka du couple est %.2lf\n", redox.acide, redox.base, redox.pka);
else
printf("l'oxydant est %s, le reducteur est %s et coefficient de l'eau est %ld\n", redox.ox, redox.red, redox.x4);
}
break;
case 2:
printf("\n === Chargement depuis un fichier ===\n\n");
break;
case 3:
printf("\n === Affichage de la demi equation redox et calcul du potentiel apparent ===\n\n");
break;
case 4:
printf("\n === Affichage du diagramme ===\n\n");
break;
case 5:
printf("\n === Enregistrement des resultats dans un fichier ===\n\n");
break;
case 6:
printf("\n === Chargement des resultats depuis un fichier sauvegarde ===\n\n");
break;
case 7:
printf("\n === Quitter ===\n\n");
menu=0;
break;
default:
printf("\nVotre choix n'est pas correct.\n");
break;
}
printf("\n\n");
}
system("PAUSE");
}
Ton problème était le suivant :
Tu créais un tableau de couple (inutile), puis tu lançait la fonction en lui envoyant une copie de ton objet couple. La fonction demandait les infos, les stockait dans la copie envoyé, puis retournait le couple (mais la valeur de retour n'était pas utilisé !!!). Autrement dit, les valeurs intéressantes étaient dans la copie qui ne te parvenait pas (elle était uniquement retourné par la fonction).
J'ai procédé autrement :
Je créé un seul couple déjà, qui sera utilisé plusieurs fois, (enfin si tu préfère faire avec plusieurs c'est pas plus compliqué mais dans l'intérêt actuel, il n'y a aucun avantage à le faire), et qui s'initialise par la valeur de retour de ta fonction:
Aucun dit : redox = chargement_manuel( );
Tu remarques que j'ai enlevé l'argument de ta fonction qui ne sert à rien, car je créé le couple qui va recevoir les données dans la fonction (l'envoie de ton couple actuel ne sert à rien si tu veux utiliser la valeur de retour et non un pointeur). Ensuite, je demande toutes les infos que tu voulais. J'ai rectifié 2 'ti trucs : t'avais du te planté t'avais écris :
Aucun dit : printf("Quel est l'acide?\n");
scanf("%s", &redox.acide);
printf("Quel est la concentration de l'acide?\n");
scanf("%lf", &redox.acide);
printf("Quel est la base?\n");
scanf("%s", &redox.base);
printf("Quel est la concentration de la base?\n");
scanf("%lf", &redox.base);
au lieu (je suppose) de :
Aucun dit : printf("Quel est l'acide?\n");
scanf("%s", &redox.acide);
printf("Quel est la concentration de l'acide?\n");
scanf("%lf", &redox.C_acide);
printf("Quel est la base?\n");
scanf("%s", &redox.base);
printf("Quel est la concentration de la base?\n");
scanf("%lf", &redox.C_base);
C'est bien ;) tes noms de variables sont explicites ;)
Et pour finir on indique
Aucun dit : return redox;
pour donner une valeur de retour à ta fonction.
J'espère que les résultats affichés cette fois sont les bons (théoriquement côté programmation c'est OK mais je comprend rien au fonctionnement de ton programme mais bon ^^ les valeurs qu'il donne semblent OK (m'explique pas je suis loin de la prépa :D))
c'est bon, je m'en suis sorti, j'suis arrivé a faire une fonction qui me renvoie la structure sans a avoir à envoyer les pointeurs de chaque variable composant la structure!!!!
Ton dernier programme marchait bien mais je ne t'avais pas stipuler que je devais, pour la suite du programme, avoir acces a toutes les variables de chaque couple et donc que je devais obligatoirement avoir un tableau de structure.
merci pour tout
a+