Voir la version complète : Alors ca faut qu'on m'explique
relativist
02/08/2005, 12h29
Bonjour c'est encore moi. G un de c'est petit probleme incompréhensible qui vous pourrissent la vie ( je dois avoir un abonnement :00000013: )
Voila je vous montre le code ce sera plus simlpe
int main(int argc, char *argv[])
{
char f1[40],f2[40],f3[40];
cout <<"Enter source file \n";
cin >> f1 ;
cout << "Enter stress-energy tensor file \n";
cin >> f2 ;
cout << "combien de pas de temps?";
cin >>length[0];
cout << "\n Enter destination file \n";
cin >> f3;
if ((fp2 =fopen(f2, "rb"))==NULL){
cerr<<"Read error occurred";
exit(1);
}
if ((fp =fopen(f3, "wb"))==NULL){
cerr<<"Read error occurred";
exit(1);
}
OpenInit(f1);
CreateDeriv();
writeIt();
for (k=0;k<= length[0]-1;k++){
OpenEI();
Einstein();
integrate();
finalize();
writeIt();
decale();
}
fclose(fp2);
fclose(fp);
return 0;
}
Tout va bien jusu'a l'appel du second write it. Parce que la...
void writeIt(){
cout << "writing files \n";
double x,y,z,t,temp;
for (int l = 1;l<=length[1]-1;l++){
cout << "ting";
for (int m = 1;m<=length[2]-1;m++){
for (int n = 1;n<=length[3]-1;n++){
t = k * dt + min_max[0][0];
x = l * dx + min_max[1][0];
y = m * dx + min_max[2][0];
z = n * dx + min_max[3][0];
fwrite(&t, 8, 1, fp);
fwrite(&x, 8, 1, fp);
fwrite(&y, 8, 1, fp);
fwrite(&z, 8, 1, fp);
for( int i = 0;i<=3;i++){
for (int j = 0 ;j<=3;j++){
if (i==j) {
if (i!=0)
{met[i][j][0][l][m][n]=met[i][j][0][l][m][n]+1;}
else
{met[i][j][0][l][m][n]=met[i][j][0][l][m][n]-1;}}
temp = met[i][j][0][l][m][n];
fwrite(&temp,8,1,fp);
}}}}}
}
Il ne va meme pas jusqu'au "ting"....! (C'est un probleme a l'execution) Il m'affiche le petit curseur dos et il se bloque comme ca pouf. Si je met le ting avant le for, alors il me l'affiche, mais j'ai du mal a croire qu'un simple for puisse bugger comme ca. Si quelqu'un a une explication, et bien ca m'interesse bougrement.
Merci d'avance...
Difficile de répondre, surtout avec du code fragmenté comme ça (d'où vient length, par exemple ?).
Utilise le debugger, c'est fait pour.
Sinon, essaye aussi d'utiliser des mécanismes un peu plus C++ et un peu moins bidouille. Par exemple les tableaux à 6 dimensions, je t'avoue que j'ai rarement vu de cas où on l'on en avait besoin. Pareil au niveau des structures de données : string au lieu de char*, fstream au lieu de FILE*, vector pour les tableaux dynamiques, etc... Ton programme dera déjà nettement plus fiable et plus clair.
PS : c'est pas pour faire du zèle, mais je pense que ton titre pourrait être plus explicite.
PS2 : truc_tres_long = truc_tres_long + 1, c'est la même chose que ++truc_tres_long. Ce sera déjà un peu moins long.
relativist
02/08/2005, 13h05
Ben ouais je sais mais je ne maitrise pas encore azssez le C++ que pour m'amuser avec tous ces bazar la (en gros j'ai repris ce qu'on me donnait dans les docs que j'ai trouvees mais elles sont peut etre pas tres a jour) :00000012:
Pour le tableau a six dimensions, je peux pas faire autrement il represente un tenseur (c'est de la physique) et je le manipule dans tous les sens a travers le programme (le programme sert en fait a calculer les solutions d'un systeme d'équations aux derivees partielles, mais comme il fait 300 lignes, je vais pas vous le mettre d'un bloc...).
Est il possible que ca viennent de l'allocation de memoire? Parce que ca de la memoire j'en pompe!
Le length, il vient de dimension reperees dans une ouverture de fichier. Mais bon meme si il avait une erreur la, il devrait lancer la boucle non?
Ben ouais je sais mais je ne maitrise pas encore azssez le C++ que pour m'amuser avec tous ces bazar la (en gros j'ai repris ce qu'on me donnait dans les docs que j'ai trouvees mais elles sont peut etre pas tres a jour)
Ce n'est pas tant que ce n'est pas à jour, c'est surtout qu'il s'agit de C. Or tu codes en C++, tu peux donc utiliser des mécanismes plus sûrs et plus simples. Les gens s'imaginent toujours qu'il est plus compliqué d'utiliser les mécanismes du C++, mais le fait est qu'il est beaucoup plus dur d'utiliser (correctement) ceux du C dans un programme C++.
Est il possible que ca viennent de l'allocation de memoire? Parce que ca de la memoire j'en pompe!
Ca peut venir de n'importe quoi : mauvais indice (ça ne m'étonnerait pas), mauvaise gestion de la mémoire, ... Rien qu'a la troisième ligne tu as potentiellement une source de bug (qu'arrive t-il si le nom de fichier fait plus de 40 caractères ?).
Comme je te l'ai dit, seul le debugger peut t'aider efficacement à ce niveau. Si tu ne l'as jamais utilisé c'est le moment de s'y mettre.
relativist
02/08/2005, 13h39
Ok ben c'est reparti alors ....
Merci quand meme. Cela dit je ne sais pas trop quel sont les mecanisme du C et ceux du C++. Le bouquin de reference que j'ai utlise causait de c++, mais sans doute qu'il est mal foutu ou que j'ai rien capte. Ce qui est sur c'est que rien ne vaut le java, point de vue simplicite d'utilisation, meme si ca traine (parca que ca le C, ca pulse).
Lightness1024!
02/08/2005, 13h54
je conseille aussi de faire une structure pour passer toutes tes variables actuellement globales en parametres des fonctions ca vaudra mieux.
et un tableau à 6 dimensions, il suffit de mettre 50 elements par dimensions pour occuper 60 Go en mémoire.
Pour le tableau a six dimensions, je peux pas faire autrement il represente un tenseur (c'est de la physique) et je le manipule dans tous les sens a travers le programme (le programme sert en fait a calculer les solutions d'un systeme d'équations aux derivees partielles, mais comme il fait 300 lignes, je vais pas vous le mettre d'un bloc...).
Si, on peut toujours faire autrement, surtout en informatique.
Mets-toi dans la tête que les tableaux à 6 dimensions, ça n'existe pas en C++, ni en C. Tu peux regarder tous les codes existants de la planète (à part le tien) tu ne verras jamais personne utiliser ça. Pourquoi?
1- Parce que tu peux faire autrement.
2- Parce que les compilos, à partir d'une profondeur de 3, les résultats peuvent être indéterminés. Que ce soit pour les boucles ou pour les tableaux.
Tu ne verras jamais dans des codes de professionnels des boucles imbriquées sur 36 niveaux, même si la syntaxe le permet.
Comment faire: utilises un appel de fonction au niveau de la deuxième boucle par exemple et passes en paramètre l'indice de cette boucle.
Comme te l'a conseillé Lightness1024! utilises une structure et les vectors.
Rien que pour l'aspect illisible d'un tableau à 6 dimensions, personne ne les utiliserait.
Flamaros
07/08/2005, 12h31
Mets-toi dans la tête que les tableaux à 6 dimensions, ça n'existe pas en C++, ni en C.
Il n'y a pas de dimension dans la memoire tous les bloc de donnees se suivent. Donc le compilo traduit tout en tableaux simple dimension au final, c'est juste que pour passer directement d'une dimension a une autre il ajoute des un bloc qui pointe sur la dimension suivante. En gros ce que je veux dire c'est qu'il ajoute des donnees.
Plus tu rajoutes des dimensions plus c'est lent, car en fait ce ne sont que des pointeurs qui pointent sur d'autre (pour rien). Sur un tableau a 6 dimensions le prog fait environ 6 saut en memoire avant de trouver la valeur.
Ex sur un tableau 2 dim:
unsigned int x;
unsigned int y;
char tableau[20][20]; // prend plus 400 char en memoire
for (x = 0; x < 20; x++)
for (y = 0; y < 20; y++)
tableau[y][x] = 'a';
unsigned int x;
unsigned int y;
char tableau[400];
for (x = 0; x < 20; x++)
for (y = 0; y < 20; y++)
tableau[x * (y + 20)] = 'a';
J'ai deja fait des prog devant utiliser dans calculs complexes et avec des structures bien faites tu ne depasses jamais deux dimensions.
Lightness1024 a raison dans ce genre de situation seul les debugueurs sont efficace, tu pourras voir toutes les valeurs de tes tableaux jusqu'a ce que ca plante.
PS : Courage quand meme car la physique et l'une des choses les plus difficiles a retranscrire en code.
vBulletin® v.3.6.5, Copyright ©2000-2009, Jelsoft Enterprises Ltd. Tous droits réservés - Version française vbulletin-fr.org