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 :

décalage dans les tableaux, comment avancer?


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 24
    Points : 12
    Points
    12
    Par défaut décalage dans les tableaux, comment avancer?
    Bonjour.

    J'ai ecris un programme fournissant des statistiques a partir de données fournies dans un fichier.

    Le prog se compile trés bien et marche, mais en affichant des resultat legerement faux....

    Pour calculer les stat, je manipule des tableaux de double, et il semble qu'il y ai des décalages inexpliqués de lignes/colones dans mes tableaux.

    par exemple j'ai un tableau tab[1000][21].
    Lorsque je donne une valeur a tab[x][21] , la variable tab[x+1][0] se voit automatiquement attribué la meme valeur!

    Quand je manipule tab[x][21] on dirait que le compilateur comprend tab[x+1][0]

    De plus j'arrive a afficher la valeur tab[x][25] alors que mon tableau n est déclaré que jusqu'a [21].


    J'ai déja passé pas mal de temps a relire, a re ecrire des parties du code mais en vin.

    C'est ici que j'ai besoin de votre experience, que me conseillez vous de faire? Retaper le code en entier sans me servire de ce que j'ai déja fais? continuer a chercher comme ca?

    ou si vous avez une idée d'ou peut venir ce \{@#|\]! de décalage dans les tableaux...
    MDS 97 - Visual C++ 5.0 - Win XP - C++ & C

  2. #2
    Membre actif
    Homme Profil pro
    Inscrit en
    Août 2003
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 235
    Points : 269
    Points
    269
    Par défaut
    Slt, faudrait que tu mettes une parti de ton code, car sinon ca va être dur de t'aider.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    ah... en fait je crois que j'ai trouvé... la solution la plus logique est que un de mes tableau n'est pas assez grand ou que je me suis trompé de +1 ou -1 dans une boucle, resultat, la variable devant etre stoké en tab[x][21] est stoquée aprés en tab[x+1][0].

    reste a trouver le bon tableau...
    MDS 97 - Visual C++ 5.0 - Win XP - C++ & C

  4. #4
    Membre actif
    Homme Profil pro
    Inscrit en
    Août 2003
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 235
    Points : 269
    Points
    269
    Par défaut
    Un conseil, fais 2 boucles imbriqués pour afficher les résultats de ton tableau, et affiches les. Cela te permttra de + facilement débugger ton tableau. Tu verras si les résultats sont incohérents, si ca bug par colonne,...
    A+

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    C bon j suis arrivé!
    Juste pour te montrer a quoi ca ressemble mon programme:

    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
     
    void use_file()
    {
    	for(int w=0; w<nbrdestat; w++)
    	{
    		for(int x=0; x<20; x++)
    		{
     
    			tab_stat[w][x] = - (tab_read[w][x+8]);
     
    			if( tab_read[w][4] <= - (tab_stat[w][x]) )
    			{
    				tab_stat[w][x] = tab_stat[w][x] + tab_read[w][7];
    			}
     
    		}
     
    		tab_stat[w][21] = tab_read[w][0];
    	}
    }
     
    void comp_tab_rn()
    {
     
     
    	for (int k=0; k<10; k++)
    	{
    		tab_new_rn[k][21] = 9+k;
     
    		for (int s=0; s<nbrdestat; s++)
    		{
    			if( tab_stat[s][21] == 9+k )
    			{
    				tab_new_rn[k][22] ++;
    			}
    		}
    	}
     
    	// mise en place des esperences
     
    	for (int c=0; c<10; c++)
    	{
    		for (int s=0; s<nbrdestat; s++)
    		{
    			if( tab_stat[s][21] == 9+c )
    			{
    				for ( int v=0; v<20; v++)
    				{
    					tab_new_rn[c][v] = tab_new_rn[c][v] + tab_stat[s][v];
    				}
    			}
    		}
    	}
    }
    Faire du traitement de statistique c'est faire des boucles et encore des boucles!
    MDS 97 - Visual C++ 5.0 - Win XP - C++ & C

  6. #6
    Membre actif
    Homme Profil pro
    Inscrit en
    Août 2003
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 235
    Points : 269
    Points
    269
    Par défaut
    Bon ben si ca marche c bien alors Par contre un conseil, commente bien ton code, car si ce sont des stats, tu vas vite t'embrouiller si tu reprends le code plus tard.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    ok.

    Sinon a part ca, il est bo mon code non ?

    enfin je veux dire pas trop bordélique?
    MDS 97 - Visual C++ 5.0 - Win XP - C++ & C

  8. #8
    Membre actif
    Homme Profil pro
    Inscrit en
    Août 2003
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 235
    Points : 269
    Points
    269
    Par défaut
    Ben c un code tout simple, y'a que des imbrications. c'est juste les commentaires qui manques car tu ne fais des traitements qu'a partir des tes indices.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    des imbrications? C'est des algorythmes?

    Moi c'est ce que j'aime bien faire, ca fait réflechire c cool...

    genre ecrire des fonctions de tri, de classement, etc...

    C des algo ca non?
    MDS 97 - Visual C++ 5.0 - Win XP - C++ & C

  10. #10
    Membre actif
    Homme Profil pro
    Inscrit en
    Août 2003
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 235
    Points : 269
    Points
    269
    Par défaut
    Les imbrication sont les encastrement que tu fais, par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if(...)
    {
       if(...)
       {
          if(...)
          {
              ...
          }
       }
    }
    Ce que tu as fais, ce sont des boucles imbriquées. On ne peut pas parler d'algos à proprement parlé. Va faire un ptit tour ds la rubrique algorithmes, tu verras des exemples plus ou moins simple.

  11. #11
    Membre éclairé
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Points : 742
    Points
    742
    Par défaut
    Salut

    Juste une petite remarque !

    En C, si tu déclares un tableau de tab[1000][21], les valeurs des index du tableau doivent aller de 0 à 999 et 0 à 20. Sinon il risque d'avoir des dépassement en mémoire.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int tab[1000][21] ;
    void main(void)
      { int i, j ;
     
      // Init du tableau
      for(i=0; i<1000; i++)  // i prend les valeurs 0 à 999
        for(j=0; j<21; j++)  // j prend les valeurs 0 à 20
          tab[i][j] = 0 ;
     
      tab[0][21] = 10 ;  // Dépassement de mémoire (null pointer assigment)
      tab[0][20] = 10 ;  // Ok, on est dedans
      }
    C'était juste une petite remarque.

    Voila...
    - Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
    - Travailler dur n'a jamais tué personne, mais pourquoi prendre le risque (Edgar Bergen)

  12. #12
    Membre actif
    Homme Profil pro
    Inscrit en
    Août 2003
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 235
    Points : 269
    Points
    269
    Par défaut
    Oui je l'avais pensé aussi, mais comme il avait mis "tab[x+1][0]", je pense qu'il le sait.

  13. #13
    Membre éclairé
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Points : 742
    Points
    742
    Par défaut
    Salut

    Petite erreur de ma part ! Dans le code, j'ai mis que tab[0][21] = 10 impliquait un 'null pointer assigment' : faux, il attribut 10 à tab[1][0].
    Il pourrait avoir un 'null pointer assigment' seulement dans le cas tab[999][21] = 10. Dans ce cas seul, on tape à l'exterieur du tableau en mémoire.

    Je ne pourrais pas affirmer une erreur dans son code, car les déclarations de tableau n'y sont pas, mais on peut extrapoler que dans sa fonction 'void use_file()' la ligne tab_stat[w][21] = tab_read[w][0]; si tab_stat est déclaré alors il aura une erreur; premièrement dans son algorithme, et deuxièmement un 'null pointer assigment' lorsque ces 2 boucles attendront la fin du tableau (ouf, j'y suis arrivé) :o .
    Pour corrigé (s'il y a a corriger) sa déclaration doit êtreVoila....
    - Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
    - Travailler dur n'a jamais tué personne, mais pourquoi prendre le risque (Edgar Bergen)

  14. #14
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par Elijha
    Salut

    Petite erreur de ma part ! Dans le code, j'ai mis que tab[0][21] = 10 impliquait un 'null pointer assigment' : faux, il attribut 10 à tab[1][0].
    Il pourrait avoir un 'null pointer assigment' seulement dans le cas tab[999][21] = 10. Dans ce cas seul, on tape à l'exterieur du tableau en mémoire.
    La consequence de ce type d'erreur va dependre du compilateur, des options de compilation et du systeme. Tu ne peux pas a priori etre certain de l'erreur que ca va generer.

  15. #15
    Membre éclairé
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Points : 742
    Points
    742
    Par défaut
    Salut

    Exacte pour les options de compilations et mille excuses pour le 'null pointer assignment' (je viens de le tester).
    Mais il y a des grandes chances que si l'index dépasse la taille total du tableau (dans notre cas 1000x21 cases mémoires), que le programme écrive à un endroit non définit.
    Je travail sur micro-contrôleur, et une erreur de ce type est fatal à l'execution du programme (du moins à son bon fonctionnement).

    Voila et merci de la précision.
    - Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
    - Travailler dur n'a jamais tué personne, mais pourquoi prendre le risque (Edgar Bergen)

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

Discussions similaires

  1. Fractions dans les tableaux
    Par oliv314 dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 3
    Dernier message: 24/05/2007, 08h58
  2. [Tableaux] Manipulation d'entrées dans les tableaux
    Par Phenol dans le forum Langage
    Réponses: 3
    Dernier message: 28/02/2007, 17h53
  3. Décalage dans les pages html sous Internet explorer 7
    Par mouna201 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 9
    Dernier message: 21/01/2007, 09h59
  4. Etat : lignes dans les tableaux
    Par oceanediana dans le forum Access
    Réponses: 2
    Dernier message: 09/08/2006, 08h34
  5. [W3C] saut de ligne dans les tableaux
    Par zulul dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 11/09/2005, 22h22

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