IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Stack around the variable 'R12' was corrupted.


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 22
    Points : 12
    Points
    12
    Par défaut Stack around the variable 'R12' was corrupted.
    Bonjour à toutes et à tous,

    J'ai fait une recherche avant de poser ma question, mais cela ne m'a pas vraiment éclairé (ici : http://www.developpez.net/forums/d12...was-corrupted/ )

    Je crée donc un Topic, en souhaitant l'avoir placé au bon endroit.

    Alors voilà, la compilation de mon projet créé sous VisualC++ 2008 se passe sans erreur, c'est quand je le fais tourner que cela "plante".

    Voici le message que j'obtiens :
    Run-Time Check Failure #2 - Stack around the variable 'R12' was corrupted.

    Et voici la fonction où cela foire, sachant que le "débuggeur" a positionné une flèche en face de l'accolade fermante située à l'extrémité.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    double recup_R12(int annee, int mois)
    {
       //fichier associé a R12
     
       FILE* fichier_R12 = NULL;
       int annee_R12[70];
       float R12[70][12];
       int choix_annee;
       int choix_mois;
       int j=0;
       double choix_R12;
     
     //traitement du fichier R12 (annee,mois)
     
         fichier_R12 = fopen("R12.dat", "r");
     
         if (fichier_R12!= NULL)
         {
                     // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL)
    while(fscanf(fichier_R12, "%i %f %f %f %f %f %f %f %f %f %f %f %f \n", &annee_R12[j],&R12[j][0],&R12[j][1],&R12[j][2],&R12[j][3],&R12[j][4],&R12[j][5],&R12[j][6],&R12[j][7],&R12[j][8],&R12[j][9],&R12[j][10],&R12[j][11])==13)     
                       {              
                       j++;              
                        }  
          choix_annee=annee-1931;
          choix_mois=mois-1;
          choix_R12=R12[choix_annee][choix_mois];
     
                      fclose(fichier_R12); 
         }
         else
         {
              //  message d'erreur 
                       printf("Impossible d'ouvrir le fichier R12.dat");
         }
     
    if(choix_R12>=150)//le maximum de R12 est fixé à 150 soit une limitation du flux solaire F10.7 à 193 units
    choix_R12=150;
     
    return choix_R12;
    }

    J'espère que je n'ai pas omis d'informations importantes.

    Je suis assez embêté, pour anecdote ce projet marchait très bien sous Dev-C++. Lorsque je l'ai adapté sous Visual, il m'a tout bonnement détecté de nombreuses erreurs de compilation que j'ai réussi à éradiquer... hélas je bloque ici.

    Je vous remercie de m'avoir lu et de vos lumières éventuelles sur l'affaire...

  2. #2
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    Peut-on voir ton fichier ?

    Pour la lisibilité de ton code tu pourrait peut-être mettre la lecture des 12 valeurs par ligne de R12 dans une boucle.

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    C ou C++ ?

  4. #4
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    Tu ne verifie pas la taille du fichier, si il depasse 70 ligne tu passe sur un overflow pour R12

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 22
    Points : 12
    Points
    12
    Par défaut
    Bonjour,

    Désolé de ma réponse tardive, j'ai eu une coupure internet, j'ai donc eu accès à votre solution que maintenant.
    Et je dois vous remercier car vous m'avez débloqué, en effet, le fichier contenait 71 lignes, c'est-à-dire, plus de 70.

    Seulement cela plante un peu plus tard, je vais donc encore vous solliciter.

    Cela m'a encore l'air de relever d'un problème de taille ou d'écriture illicite à une adresse mémoire vue l'erreur :
    Unhandled exception at 0x00253d22 in NeQuick_model.exe: 0xC0000005: Access violation reading location 0x00192000.
    Je suis désolé si ça pose un problème de continuer à écrire sur ce topic, je peux en faire un autre...

    Voici le code de la fonction, assez long :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    double gamma1_xm0(double modip, double latitude_u, double longitude_u, double UT,int taille_coeff,double* tab_coeff)
    {
    
    int nq[dimensionxm0+1];
    double c[nb_harmonicxm0+1];
    double s[nb_harmonicxm0+1];
    double x,s0,s1,s2,ss,s3;
    int i,j,k,index,L,np;
    int ligne;
    int colonne;
    int mi;
    double coeff[101];
    double xsinx[14];
    
    double sum;
    
    if(taille_coeff==988)
    {
     nq[0]=0;//rajout
     nq[1]=11;
     nq[2]=11;
     nq[3]=8;
     nq[4]=4;
     nq[5]=1;
     nq[6]=0;
     nq[7]=0;
     nq[8]=0;
     nq[9]=0;
     ligne=13;
     colonne=76;
     }
     if(taille_coeff==441)
    {
     nq[0]=0;//rajout
     nq[1]=6;
     nq[2]=7;
     nq[3]=5;
     nq[4]=2;
     nq[5]=1;
     nq[6]=0;
     nq[7]=0;
     ligne=9;
     colonne=49;
    }
    
    //conversion heure (0h&24h) en angle radians (-Pi&Pi) : UT->(15*UT-180)*Pi/180
    x=_Pi*UT/12-_Pi;
    
    for(k=0;k<=nb_harmonicxm0;k++)
    {
     s[k]=sin(k*x);
     c[k]=cos(k*x);
    }
    
    coeff[0]=0;//rajout
    
    for (i=1;i<=colonne;i++)
    {
    mi=(i-1)*ligne;
    coeff[i]=tab_coeff[mi];
        for (j=1;j<=nb_harmonicxm0;j++)
        {
        coeff[i]=coeff[i]+tab_coeff[mi+2*j-1]*s[j]+tab_coeff[mi+2*j]*c[j];
        }
    }
    
    sum=coeff[1];
    ss=sin(modip*_Pi/180);
    s3=ss;
    xsinx[0]=0;//rajout
    xsinx[1]=1;
    index=nq[1];
    
    for(j=1;j<=index;j++)
                  {
                         if((fabs(ss))>=1E-30)
                         {
                         sum=sum+coeff[1+j]*ss;
                         xsinx[j+1]=ss;
                         ss=ss*s3;
                         }
                         else
                         {      
                         xsinx[j+1]=0;
                         }
                  }
    
    if(fabs(ss)>=1E-30)
    {
    xsinx[nq[1]+2]=ss;
    }
    else
    {
    xsinx[nq[1]+2]=0;
    }
    
    np=nq[1]+1;
    ss=cos(latitude_u*_Pi/180);
    s3=ss;
    
              for(j=2;j<=dimensionFF0;j++)
                   {
                         s0=longitude_u*(j-1)*_Pi/180;
                         s1=cos(s0);
                         s2=sin(s0);
                         index=nq[j]+1;
                         for(L=1;L<=index;L++)
                         {
                         np=np+1;
                         sum=sum+coeff[np]*xsinx[L]*ss*s1;
                         np=np+1;
                         sum=sum+coeff[np]*xsinx[L]*ss*s2;
                         }
                         ss=ss*s3;
                    }
    
    return sum;
    }
    J'ai mis en rouge l'endroit où cela plante, pointé par le débuggeur de Visual.

    dimensionxm0, qui vaut 7, et nb_harmonicxm0, qui vaut 4, sont définis par des DEFINE dans un autre fichier source consacré à la définition des constantes, pour info...

    Sinon je suis surpris par les valeurs totalement délirantes qui s'affichent en rouge, elles devraient être comprises entre 1 et 20 maximum, et pas de l'ordre du millier. D'autant plus que ces valeurs bizarres varient d'une compilation+exécution à l'autre...



    Merci pour toute petite indication...

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 22
    Points : 12
    Points
    12
    Par défaut
    Hum, en fait j'ai trouvé tout seul.

    Il s'agissait d'une erreur commise dans les paramètres de la boucle FOR !

    for(j=2;j<=dimensionFF0;j++)

    Alors que la constante est dimensionxm0 !

    Bref, merci quand même !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. different object with the same identifier was already associated with the session
    Par lextaz33 dans le forum Développement Web en Java
    Réponses: 6
    Dernier message: 02/03/2009, 14h36
  2. Réponses: 1
    Dernier message: 08/02/2009, 11h54
  3. Réponses: 0
    Dernier message: 26/01/2009, 14h30
  4. Erreur:The input file was not found (jxl.read.biff.BiffException)
    Par impossibeulman dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 05/08/2008, 14h56
  5. Stack around the variable was corrupted
    Par tsp dans le forum C++
    Réponses: 8
    Dernier message: 05/04/2006, 16h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo