variables effacées

variables effacées - C - Programmation

Marsh Posté le 08-07-2004 à 14:44:07    

bonjour à tous, me revoilà encore une fois avec un problème à la noix ...
donc je m'explique : j'ai une fonction de base qui initialise quelques variables, enfin rien de très sorcier jusque là. Jái vérifié, elles sont bien toutes là, avec leur bonne valeur. Ensuite elle appelle une autre fonction, qui fait son bout de chemin tranquille, et une fois celle-ci terminée, plus de trace des mes variables de départ  :cry:  
 
Cf. GDB pour le message d'erreur

Citation :

Program received signal SIGSEGV, Segmentation fault.
0x000160ec in odeint (ystart=???, nvar=???, t1=???, t2=???, eps=Cannot access memory at address 0xffffffd8


 
J'ai pensé à des tableaux, qui auraient pu écraser des variables voisines, mais je ne vois pas à priori où cela se situerait ... quelqu'un aurait-il une idée (autre cause éventuelle par exemple ....) je ne sais plus trop où chercher là  :pt1cable:

Reply

Marsh Posté le 08-07-2004 à 14:44:07   

Reply

Marsh Posté le 08-07-2004 à 14:46:59    

tu voudrais pas donner du code STP ?

Reply

Marsh Posté le 08-07-2004 à 14:49:34    

bosse avec des pointeurs ou des variables static...


Message édité par fodger le 08-07-2004 à 14:50:04
Reply

Marsh Posté le 08-07-2004 à 14:53:52    

oui, bien sûr. Je l'ai pas mis de suite pour pas décourager lol  :ange:  
la fonction appelée est celle aui s'appelle systdiff. Voici le fichier qui la contient (c'est un petit peu long par contre)
 

Code :
  1. #include <math.h>
  2. #include <stdio.h>
  3. #include <stddef.h>
  4. #include <stdlib.h>
  5. #include "nrutil.h"
  6. #include "bandes.h"
  7. #include "fonctions.h"
  8. #include "data.h"
  9. typedef struct systeme {
  10. double h;
  11. double **a,**a1;
  12. unsigned long *indx;
  13. } Systeme;
  14. /* Calcul du champ electrique */
  15. double *calculE(long unsigned n, Systeme poisson, double *y)
  16. {
  17.   double *b;
  18.   double *_V;
  19.   double *E;
  20.   unsigned long i;
  21.   b=membre_poisson(y,n,poisson.h);
  22.   banbks(poisson.a,n-2,3,3,poisson.a1,poisson.indx,b);
  23.   _V=dvector(1,n);
  24.   for(i=2;i<n;i++) _V[i]=b[i-1];
  25.   free_dvector(b,1,n-2);
  26.   _V[1]=-V0;
  27.   _V[n]=-V1;
  28.   E=gradient(_V,n,poisson.h);
  29.   free_dvector(_V,1,n);
  30.   return E;
  31. }
  32. /* Generation des differents coefficients variant avec E */
  33. void coeffs(double *E, unsigned long n, double *Dn, double *Dp, double *Y)
  34. {
  35.   unsigned long i;
  36.  
  37.   *Dn=K*T/Q*MUn;
  38.   *Dp=K*T/Q*MUp0*exp(-0.6*Q/K/T);
  39.   for(i=1;i<=n;i++) {
  40.     Dp[i]=K*T/Q*MUp0*exp(-E[i]/K/T);
  41.     Y[i]=Y0+(1-Y0)*pow(E[i]/(1+Ec),1.1);
  42.   }
  43. }
  44. void sigma(double *E, unsigned long n, double *SIGMApt, double *SIGMApr, double *SIGMAnt, double *SIGMAnr)
  45. {
  46.   unsigned long i;
  47.  
  48.   for(i=1;i<=n;i++) {
  49.     SIGMApt[i]=8.83e-9*pow(fabs(E[i]),-0.6);
  50.     SIGMAnr[i]=SIGMApt[i];
  51.     if (fabs(E[i])<7e7) SIGMApr[i]=2.05e-5*pow(fabs(E[i]),-1.5);
  52.     else SIGMApr[i]=1.2e7*pow(fabs(E[i]),-3);
  53.   }
  54.   *SIGMAnt=3.1e-17;
  55. }
  56. /* Fonction donnant l'expression de l'EDO */
  57. void systdiff(double *y, double *dy, unsigned long n, Systeme poisson)
  58. {
  59.   double *E,*dE,*Y,*SIGMApt,*SIGMApr,*SIGMAnr;
  60.   double *N,*P,*Nt,*Pt,*dNdx,*dPdx,*dNtdx,*dPtdx,*d2Ndx2,*d2Pdx2;
  61.   double Dp,Dn,SIGMAnt;
  62.   unsigned long i;
  63.   /* allocation de memoire pour les coefficients et autres */
  64.   dE=dvector(1,n);
  65.   Y=dvector(1,n);
  66.   SIGMApt=dvector(1,n);
  67.   SIGMApr=dvector(1,n);
  68.   SIGMAnr=dvector(1,n);
  69.   N=dvector(1,n);
  70.   P=dvector(1,n);
  71.   Nt=dvector(1,n);
  72.   Pt=dvector(1,n);
  73.  
  74.   /* remplissage de ces coefficients */
  75.   for(i=1;i<=n;i++) {
  76.     N[i]=y[i];
  77.     P[i]=y[n+i];
  78.     Nt[i]=y[2*n+i];
  79.     Pt[i]=y[3*n+i];
  80.     dE[i]=Q/EPSILONox*(P[i]-N[i]+Pt[i]-Nt[i]);
  81.   }
  82.   dNdx=gradient(N,n,poisson.h);
  83.   dPdx=gradient(P,n,poisson.h);
  84.   dNtdx=gradient(Nt,n,poisson.h);
  85.   dPtdx=gradient(Pt,n,poisson.h);
  86.   d2Ndx2=lapl(N,n,poisson.h);
  87.   d2Pdx2=lapl(P,n,poisson.h); 
  88.  
  89.   E=calculE(n,poisson,y);
  90.   coeffs(E,n,&Dn,&Dp,Y);
  91.   sigma(E,n,SIGMApt,SIGMApr,&SIGMAnt,SIGMAnr);
  92.   /* generation du terme dy */
  93.   for(i=1;i<=n;i++) {
  94.     dy[i]=dNdx[i]*MUn*E[i] - N[i]*MUn*dE[i] - Dn*d2Ndx2[i] + g0*D*Y[i] -
  95.     fabs(N[i]*MUn*E[i]+Dn*dNdx[i])*(SIGMAnt*(Ntn-N[i])+SIGMAnr[i]*Pt[i]);
  96.     dy[n+i]=-dPdx[i]*MUp*E[i] - P[i]*MUp*dE[i] - Dp/K/T*dE[i] + Dp*d2Pdx2[i] + g0*D*Y[i] - fabs(P[i]*MUp*E[i]-Dp*dPdx[i])*(SIGMApt[i]*(Ntp-P[i])+SIGMApr[i]*Nt[i]);
  97.     dy[2*n+i]=SIGMAnt*fabs(N[i]*MUn*E[i]+Dn*dNdx[i])*(Ntn-Nt[i]) -
  98.     SIGMApr[i]*fabs(P[i]*MUp*E[i]-Dp*dPdx[i])*Nt[i];
  99.     dy[3*n+i]=SIGMApt[i]*fabs(P[i]*MUp*E[i]-Dp*dPdx[i])*(Ntp-Pt[i]) -
  100.     SIGMAnr[i]*fabs(N[i]*MUn*E[i]+Dn*dNdx[i])*Pt[i];
  101.   }
  102.   /* liberation de la memoire occupee par les vecteurs */
  103.   free_dvector(E,1,n);
  104.   free_dvector(dE,1,n);
  105.   free_dvector(Y,1,n);
  106.   free_dvector(SIGMApt,1,n);
  107.   free_dvector(SIGMApr,1,n);
  108.   free_dvector(SIGMAnr,1,n);
  109.   free_dvector(N,1,n);
  110.   free_dvector(P,1,n);
  111.   free_dvector(Nt,1,n);
  112.   free_dvector(Pt,1,n);
  113.   free_dvector(dNdx,1,n);
  114.   free_dvector(dPdx,1,n);
  115.   free_dvector(dNtdx,1,n);
  116.   free_dvector(dPtdx,1,n);
  117.   free_dvector(d2Ndx2,1,n);
  118.   free_dvector(d2Pdx2,1,n);
  119. }


 
les commandes dvector et free_dvector sont juste utilisées pour allouer et désallouer la mémoire. Elles sont sûres et ont déjà été testées (pas par moi loll).

Reply

Marsh Posté le 08-07-2004 à 14:55:59    

j'ai essayé de faire aussi clair que possible. les résultats des fonctions gradient et lapl sont alloués à l'intérieur de ces fonctions, donc ca nápparaît pas ici

Reply

Marsh Posté le 08-07-2004 à 15:02:15    

Code :
  1. for(i=1;i<=n;i++) {
  2.   N[i]=y[i];
  3. // ...


 
mmmh, je ne sais pas comment fonctionne ta fonction d'allocation, mais c'est déjà louche ...
 
ensuite, qu'elle soit fiable ou pas, cette fonction d'allocation, tu n'es pas à l'abris d'un manque de mem ... vérifie que tout a bien été alloué quoi :]
 
 
(Edit : étrange ce bug sur les paranthèses dans les sections de code -_-)


Message édité par theshockwave le 08-07-2004 à 15:03:36
Reply

Marsh Posté le 08-07-2004 à 15:07:46    

la question est bête, mais comment on fait ca ?

Reply

Marsh Posté le 08-07-2004 à 15:21:58    

:heink:  
 
been, tu regardes le retour de ta fonction, je suppose que le résultat sera NULL si la mémoire n'a pas pu être allouée
 
sinon, ... Pour tes tableaux, tu es sur que ce n'est pas plutôt de 0 à n-1 que tu devrais aller ?

Reply

Marsh Posté le 08-07-2004 à 15:25:39    

non, le pointeur a été bidouillé afin que les indices puissent commencer à une valeur quelconque. par contre, je n'ai jamais de résultat null... tout se passe bien pendant quelques itérations (en tout cas, ca en a l'air), et dún coup, j'ai une variable qui soit n'est plus trouvé, soit prend une valeur (genre 10e304 pour les doubles)

Reply

Marsh Posté le 08-07-2004 à 15:29:48    

déjà ça c'est dégueulasse :

Code :
  1. typedef struct systeme {
  2.     double h;
  3.     double **a,**a1;
  4.     unsigned long *indx;
  5.   } Systeme;


 
c'est

Code :
  1. typedef struct
  2. {
  3.     double h;
  4.     double **a,**a1;
  5.     unsigned long *indx;
  6.   } Systeme;


Message édité par fodger le 08-07-2004 à 15:30:17
Reply

Marsh Posté le 08-07-2004 à 15:29:48   

Reply

Marsh Posté le 08-07-2004 à 15:32:39    

les structures non nommées, c'est standard, ca ?
 
Edit : okok, ca l'est :]


Message édité par theshockwave le 08-07-2004 à 15:37:00
Reply

Marsh Posté le 08-07-2004 à 15:39:14    

bibi218 a écrit :

non, le pointeur a été bidouillé afin que les indices puissent commencer à une valeur quelconque. par contre, je n'ai jamais de résultat null... tout se passe bien pendant quelques itérations (en tout cas, ca en a l'air), et dún coup, j'ai une variable qui soit n'est plus trouvé, soit prend une valeur (genre 10e304 pour les doubles)


 
hum ... J'ai quelques doutes sur la manière dont ca a été fait, tu n'aurais pas le source de tes fonctions d'allocation ?

Reply

Marsh Posté le 08-07-2004 à 15:44:38    

Code :
  1. double *dvector(long nl, long nh)
  2. /* allocate a double vector with subscript range v[nl..nh] */
  3. {
  4. double *v;
  5. v=(double *)malloc((size_t) ((nh-nl+1+NR_END)*sizeof(double)));
  6. if (!v) nrerror("allocation failure in dvector()" );
  7. return v-nl+NR_END;
  8. }


ca c'est pour l'allocation
 
et pour désallouer ...

Code :
  1. void free_dvector(double *v, long nl, long nh)
  2. /* free a double vector allocated with dvector() */
  3. {
  4. free((FREE_ARG) (v+nl-NR_END));
  5. }

Reply

Marsh Posté le 08-07-2004 à 15:45:27    

j'avoue ne pas comprendre toutes les subtilités ...

Reply

Marsh Posté le 08-07-2004 à 15:57:04    

que vaut NR_END, juste pour info ?

Reply

Marsh Posté le 08-07-2004 à 16:01:13    

d'après les instructions en préprocesseur, la valeur est à 1

Reply

Marsh Posté le 08-07-2004 à 16:06:24    

bon, quoi qu'il en soit, j'ai de sérieux doutes sur la personne qui a écrit ca (qui caste le retour de malloc :o )
Utilise des indices plus "classiques", ce sera mieux pour tout le monde.
 
... ou alors utilise plutôt quelque chose de ce genre, même si je n'ai pas envie de le conseiller tant c'est risqué -_- (cas où le retour pourrait être négatif ....)
 
Edit en fait, je cache, c'est encore mieux ... Utilise des indices conventionnels, c'est pas la mort d'utiliser i-nl au lieu de i, quand même


Message édité par theshockwave le 08-07-2004 à 16:07:40
Reply

Marsh Posté le 09-07-2004 à 10:22:01    

J'ai eu un problème similaire, j'avais un indice de tableau (i) que je mettais à jour en fonction du résultat d'une recherche, entre 0 et N-1 si l'element recherché existait dans mon tableau ou -1 sinon et donc quand je voulais incrémenter le nombre d'apparitions de l'element je faisais liste[i].nb++; mais j'avais oublié de vérifier que i était bien supérieur à -1 !
 
Et en fait dans le cas où i était à -1 ça modifiait une autre variable ce qui foutait le bordel dans mon code ! Je n'avais ce problème que sur la machine de production, sur mon PC ça fonctionnait "bien" ! :sweat:


Message édité par darkoli le 09-07-2004 à 10:23:42
Reply

Marsh Posté le 10-07-2004 à 17:35:41    

"nrutil.h" --> tu utilises Numerical Recipes, c'est ça ?
Si oui, je suppose que les fonctions d'alloc et de désalloc de vecteurs sont bonnes. Par contre, il faut se méfier parce qu'il me semble qu'ils utilisent la convention Fortran, à savoir que les indices commencent à 1 et non 0 (d'ailleurs c'est bien ce que tu fais).
 
Pour la détection d'écrasements mémoire ou de memory leaks, utilise un malloc debugger comme Valgrind si t'es sous Linux.
Sinon mpatrol, ou autre truc du même genre.
Pour le genre d'applis que tu fais, ça ne sera pas inutile.


Message édité par el muchacho le 10-07-2004 à 17:48:23

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 11-07-2004 à 10:38:39    

Y a quoi dans membre_poisson() ? Je veux dire la déclaration et allocation de b ? Si on fait un free_dvector(), il faut espérer que la déclaration interne est conforme/compatible avec le free (on peut pas débobiner qq chose bobiné autrement).
 
      b=membre_poisson(y,n,poisson.h);
      ....  
      free_dvector(b,1,n-2);
-------------------------
dy[3*n+i] : dy est suffisament alloué en taille pour pas risquer de déborder ?
-----------------
les for i = sans (, ça fait bizarre
 
calculE(long unsigned n, faut que j'essaie, long et unsigned doivent être interchangeables. Quand on n'a pas l'habitude de lire dans ce sens..
 
 
C'est le code affiché qui, une fois exécuté, provoque la disparition des variables mentionnées ? En inhibant ce traitement, c'est bon ?
Elles sont globales les variables qui disparaissent ? C'est pas le compilo qui les a optimisées (servent plus => pschittt) ?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed