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 :

vecteurs en C++ probémes Aidez moi


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Inscrit en
    Décembre 2006
    Messages
    1
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1
    Par défaut vecteurs en C++ probémes Aidez moi
    bonjour à tous, je suis toute debutante en c++ et c
    je voudrais créer un vecteur de 512 elements que j'ai nommé carralleven et un autre de 360 nommé permuteven.
    mon vecteur carralleven est composé des valeurs -2 sur les 46 premières positions et les 46 dernières postions puis est composé des blocs de 14 élements dont le 5éme et 9émes sont des -1, et les sutres ont des valeurs qui vont de 0 à 360.
    le vecteur permuteven devrai contenir comme élements les indices du vecteurs carralleven qui ont comme élements les valeurs de 0à 360.
    j'ai creé ce programme qui devrait fonctionnait mais j'ai des erreures de segmentations et des valeurs erronés,surtout au debut du premier blocs et pour ii =3 pour vectoreven[511-ii],j'ai essayè de considerer comme valeur int w = 511-ii, mais ça ne me resout pas les choses.
    j'épère que quelque'un sur ce forum reussira à me donner un coup de pouce.
    merci.

    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
    #include <iostream>
    #include <iomanip>
    #include <stdio.h>
     
    using namespace std;
       int main () {
      int vectoreven[512], permuteven[360];
      int ii=0;
      int portante ;
      int blocs ; 
      int datii;
      int m =-1 ;
    int k;
     	for(int ii=0 ;ii<46;ii++)
            {
    		vectoreven[ii]=-2;
                    vectoreven[511-ii]=-2;    
            }
     
    	//int m =-1;
     
    	for (int blocs =1;blocs<31 ;blocs++){
    		for(int portante =1;portante<14;portante++){
    		datii =(blocs-1)*30+portante+45;
    			if(portante ==5 || portante ==9)
    			{vectoreven[datii]=-1;}
    	  		else 
    	  	 	 {m=m+1;	
    	     		vectoreven[datii]=m;
    	    		}
                 if (datii > 5 || datii< 5 || datii <9 ||datii > 9){
                            m  = m +1;
    			permuteven[m]=k;}
     
    		}
    	}	
     
        cout << setw(7) 
    	 << ii 
     
     
    	 << setw(13)
    	 << vectoreven[ii] << endl;
     
     
      cout << "element"<< setw (13) << "value"<< endl;
      for ( int ii = 0; ii < 512; ii++)
        cout << setw(7)<< ii <<setw (13)<< vectoreven[ii] << endl;
     
     
    cout<< setw(7)
         <<m
         <<setw(13)
         <<permuteven[m]<<endl;
     
    cout << "element"<< setw (13) << "value"<< endl;
      for ( int m = 0;  m< 360; m++)
        cout << setw(7)<< m <<setw (13)<< permuteven[m] << endl;
      // char c;
      //cin>> c;
      return 0;
    }

  2. #2
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Soit la bienvenue.

    J'avoue que j'ai un peu de mal à me plonger dans ton problème pour plusieurs petites raisons:
    - indentation aléatoire

    - des variables déclarées et jamais utilisées (ii), ou déclarées bien trop tôt, ou jamais initialisées (k). J'ai une règle toute bête: si je ne suis pas capable d'initialiser une variable (à sa valeur finale, ou à sa valeur de première initialisation) alors soit elle sera initialisée à l'issue d'un test/d'une fonction, soit je n'ai pas à la déclarer si tôt.

    - des boucles sur [1,14[ (au lieu de [0,13[, voire même [1,13]), ce sont des détails qui me distraient. Surtout avec des specs qui laissent sous-entendre [0,14[.


    Ton problème vient très certainement du fait que tu cherches à accéder à une valeur hors bornes de ton tableau. Tu peux dans un premier temps utiliser des assertions pour t'assurer que tu ne dépasses jamais -- le débuggueur sera ton ami dans le cas contraire grâce à l'assertion.
    Mais il est plus que probable que tu doives reprendre tranquillement et à la main tes indices et ton algo.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  3. #3
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      int vectoreven[512], permuteven[360];
    .....
    	for (int blocs =1;blocs<31 ;blocs++){
    		for(int portante =1;portante<14;portante++){
    		datii =(blocs-1)*30+portante+45;
    			if(portante ==5 || portante ==9)
    			{vectoreven[datii]=-1;}
    	  		else 
    	  	 	 {m=m+1;	
    	     		vectoreven[datii]=m;
    datii semble pouvoir varier jusqu'à 29*30+13+45 soit 928 ce qui est beaucoup comme indice d'un tableau de 512 éléments

  4. #4
    Membre éprouvé
    Avatar de SOAD08
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 101
    Par défaut
    j'ai du mal a comprendre pourquoi tu parles de vector, un vector se declarant ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector <type> nom_vector(taille);
    mais bon sinon je n'ai pas tout compris, mais pense bien au fait que les indices d'un tableau de taille n vont de 0 à n-1 !
    www.cppreference.com ==> A lire pour vos problèmes touchant à la STL
    www.php.net ==> A lire avant de demander le fonctionnement d'une fonction PHP

    Alliance developpez Muzgo

  5. #5
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,
    Citation Envoyé par SOAD08
    j'ai du mal a comprendre pourquoi tu parles de vector, un vector se declarant ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector <type> nom_vector(taille);
    mais bon sinon je n'ai pas tout compris, mais pense bien au fait que les indices d'un tableau de taille n vont de 0 à n-1 !
    Heu, ergottons un peu:

    Sémantiquement parlant:
    • un tableau qui ne contient qu'une seule dimention (une ligne de plusieurs colones), ca s'appelle un vecteur;
    • un tableau qui contient plus d'une dimention, ca s'appelle une matrice;
    • une matrice qui ne contient que deux dimentions (plusieurs lignes de une ou plusieurs colone(s) ), c'est un tableau tel qu'on le représente généralement

    est donc, bel et bien, un vecteur... meme si cela n'a rien à voir avec la classe std::vector...

    Ceci dit, la classe std::vector, a, effectivement, été créée pour permettre d'utiliser ce que l'on appelle vecteur ; et, de fait, on peut considérer comme préférable de l'utiliser en lieu et place des tableaux "C style", mais surtout pour une question de facilité d'emploi et de problèmes évités grâce à son usage

    Ceci étant dit...

    Comme Luc Hermitte l'a fait remarquer, ton code présente une indentation... surprenante...

    Il existe plusieurs convention pour une "belle présentation" du code, et voici les deux plus courentes:
    • présentation ANSI: l'accolade ouvrante se trouve sur la ligne suivant l'instruction pour laquelle elle fait le bloc, alligné sur la premiere lettre, indentation fixe pour le bloc
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
       
      namespace foospace
      {
          int Foo()
          {
              if (isBar)
              {
                  bar();
                  return 1;
              }
              else
                  return 0;
          }
      }
    • présentatino "K&R": l'accolade ouvrante se trouve sur la meme ligne que l'instruction, l'accolade fermante alignée sur la première lettre de l'instruction, indentation fixe du bloc à l'intérieur
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
       
      namespace foospace {
          int Foo() {
              if (isBar) {
                  bar();
                  return 1;
              } else
                  return 0;
          }
      }

    Pour la facilité de tous, à commencer par la tienne, il est préférable de choisir une indentation et de t'y tenir, au moins, pour tout ce qui se trouve dans un meme fichier (idéalement, pour l'ensemble des fichiers d'un meme projet)

    J'aurais d'ailleurs personnellement tendance à rajouter une regle:
    une ligne= une instruction ou une déclaration
    C et C++ commencent à compter... à partir de 0 (du moins pour les indexes de tableau)...

    Si donc, tu déclare un tableau
    si tu dispose bel et bien de 512 éléments, il sont accessibles via les index allant de 0 à 511...

    De plus, la directive d'inclusion
    est purement et simplement inutile (il s'agit d'un fichier d'entete "C", et fait double emploi (entre en conflit) avec le #include <iostream>)

    Enfin, quelques incohérences apparaissent, meme si certaines ne sont pas *trop* graves:
    • (pas trop grave) tu déclare ii, blocs et portante en début de fonction, et tu les redéclare à chaque fois que tu les utilises comme compteur pour une boucle...

      Ca compile, mais ca peut prêter à confusion (les ii, blocs et portante utilisés dans les boucles n'ont, à vrai dire, rien à voir avec les meme variables en dehors des boucles, parce que, dans les boucles, ce sont les variables "super locales" déclarées pour les boucles qui sont utilisées)
    • tu crées une boucle
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      for (int blocs =1;blocs<31 ;blocs++)
      et tu utilises la valeur de blocs sous la forme de
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      datii =(blocs-1)*30+portante+45;
      ...

      Tant qu'à faire, pourquoi ne pas faire la boucle, sous la forme de
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      for (int blocs =0;blocs<30 ;blocs++)
      et l'utiliser sous la forme de
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      datii =blocs*30+portante+45;


      Et, bien entendu, le meme raisonnement pourrait etre envisagé pour la boucle portante, ce qui donnerait, en définitive, un code du genre de
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
       
      for (int blocs =0;blocs<30 ;blocs++)
      {
          for(int portante =1;portante<14;portante++)
          {
              datii =blocs*30+portante+46;
    • Beaucoup plus grave, c'est le fait que les valeurs atteintes par blocs et par portante (29 et 14), en suivant la formule que tu fournis, dépassent de loin l'indice maximal possible pour vectoreven: 29*30+13+46=929... alors que tu n'as acces qu'à un indice de 511 au maximum...


    Ton vectoreven doit se composer de:
    • 42 éléments de valeur fixée
    • 428 éléments de valeur calculée
    • 42 éléments de valeur fixée...

    Si l'on fait le calcul, il y a donc bel et bien trente blocs de 14 éléments, mais, la formule doit etre calculée sous la forme de
    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
     
    for(blocs=0;blocs<30;blocs++)
    {
        for(portante=0;portante<14;portante++)
        {
            dateii=blocs*14+portante+46;
            if(portante ==5 || portante ==9)
    	{
                    vectoreven[datii]=-1;
            }
            else 
            {
                ++m;//c'est pas plus propre comme ceci ??
                vectoreven[datii]=m;
            }
        }
    }
    Enfin le dernier test dans la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if (datii > 5 || datii< 5 || datii <9 ||datii > 9)
    {
        m  = m +1;
        permuteven[m]=k;
    }
    me chiffone au plus haut point:

    Comme dateii fera, au minimum ...46 (ben oui, 0*14+0+46=...46 ) il sera, d'office, plus grand que 5 et plus grand que 9... mais jamais ni égal ni inférieure à 5 ni à 9...

    La condition du test sera donc de toute facon toujours vérifiée...

    A mon avis, tu devrais te baser, soit sur un modulo de dateii, soit, encore bien mieux, sur la valeur de portante, vu qu'elle prend, justement, les 14 éléments de chaque blocs... et donc, nous "retombons" d'office dans un des cas de ton premier test (selon ce que tu veux, soit portante==5 || portante==9, soit la clause "else" du test)

    Mais, comme permuteven est un tableau de 360 éléments, et que, justement, 360=30*12=30*(14-2), il semblerait logique de mettre l'instruction
    dans la partie else du test, avant l'incrémentation de m

    Voici donc le code que je te propose en définitive
    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
     
    #include <iostream>
    #include <iomanip>
    #include <stdio.h>
    using namespace std;
    int main ()
    {
        int vectoreven[512];
        int permuteven[360];
        int ii=0;
        int portante ;
        int blocs ;
        int datii;
        int m =0;
        int k;
        for(int ii=0 ;ii<46;ii++)
        {
            vectoreven[ii]=-2;
            vectoreven[511-ii]=-2;
        }
        for (blocs =0;blocs<30 ;blocs++)
        {
            for(portante =0;portante<14;portante++)
            {
                datii =blocs*14+portante+46;
                if(portante ==5 || portante ==9)
                {
                    vectoreven[datii]=-1;
                }
                else
                {
                    permuteven[m]=k;
                    vectoreven[datii]=m;
                    ++m;/* m étant égal à 0 au départ, c'est un index correct...
                           on le prépare juste pour l'utilisation suivante APRES
                            s'en être servi :D */
                }
            }
        }
        //la suite est passée :P
    }
    NOTA:fais attention au fait que k (qui est utilisé pour définir permuteven[m]) n'est pas défini... l'affichage de permuteven risque donc de parraitre "bisare"
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. Pitié, aidez moi : Problème d'initialisation de postgreSQL
    Par ttalourd dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 16/11/2004, 12h10
  2. SDL : SVP aidez moi !!!
    Par adidmamah dans le forum OpenGL
    Réponses: 5
    Dernier message: 11/06/2004, 08h49
  3. [Kylix] Aidez-moi -> LIAISON SERIE 2 le retour
    Par Oyoboy dans le forum EDI
    Réponses: 1
    Dernier message: 28/05/2004, 10h48
  4. aidez moi à choisir
    Par lvdnono dans le forum DirectX
    Réponses: 4
    Dernier message: 13/05/2004, 08h20
  5. Réponses: 29
    Dernier message: 11/05/2004, 13h18

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