Problème de compréhension tableau. [Résolu]

Signaler
Messages postés
40
Date d'inscription
mercredi 24 octobre 2007
Statut
Membre
Dernière intervention
6 août 2013
-
Messages postés
3819
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 septembre 2020
-
Bonjour,
je débute en c++ et j'ai un problème sur le dimensionnement d'un tableau,
voilà ce que je ne comprend pas je défini un tableau de 5 (case)
ensuite je rempli ce tableau dans une boucle de 10 et ensuite je l'affiche.
Pourquoi puis je faire ceci alors que je n'ai que 5 (case).
certainement un problème de facon de définir je suppose.
#include <cstdlib>
#include 
#include <windows.h>

using namespace std;


int c,i;

int table[5]; 

int main(int argc, char *argv[])
{   
cout<< "c:"
cin>> c;       

      for(i=0;i<10;i++) 
      {
      table[i]=::c++;
      }
          
     
     for(i=0;i<10;i++)
      {
      cout << table[i] << endl;
      }
    
     
     system ("pause");
     return EXIT_SUCCESS;
}

Merci a vous de m'éclairer sur ce point.

4 réponses

Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
38
Bonjour,

en C, tu n'as pas de vérification sur la taille d'un tableau lorsque tu demandes ou écrases un élément.

L'effet est très simple : tu accèdes à un endroit de la mémoire qui n'est pas celui que tu désires, ça peut avoir des effets graves sur ton programme.

sous linux, tu peux lancer valgrind ./programme pour vérifier ce genre d'erreur.

En utilisant des vectors et .at(), tu peux avoir une exception pour ce genre d'erreur.

Cordialement,

Maxime
Messages postés
3819
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 septembre 2020
113
coucou747 à déjà pointé tes erreurs, donc je vais me concentrer sur des conseils:
- Évite les "using namespace", voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace
- Évite les variables globales
- ::c++ ? Pourquoi ajouter "::" ? Il n'y a pas d'ambiguïté ici.
- return 0, plutôt que EXIT_SUCCESS. C'est portable et plus clair.
- Déclare tes variables au moment où tu en as besoin. Le int i peut se déclarer dans la boucle.
- En C++, prend l'habitude de faire ++i dans une boucle plutôt que i++. Pour des entiers, ça ne change strictement rien, je suis d'accord, mais quand tu travailleras avec des collections, et donc avec des iterators, ça fera une grande différence.
- #include <cstdlib> => Inutile
- Préfère un std::vector plutôt qu'un int tab[5];

Je réécrirais ton code comme suit:
#include 

int main(int argc, char *argv[])
{
  int c;
  int tab[5];
  std::cout << "c:";
  std::cin >> c;       
 
  // Avec pourquoi pas un: tab.resize(5); si la taille est connue.
  // A noter que qu'un std::vector se redimensionne tout seul, c'est donc juste une optimisation.
  for(int i = 0; i < 5; ++i) 
    tab[i] = c++;
    
  for(int i = 0; i < 5; ++i)
    std::cout << tab[i] << std::endl;

  return 0;
}


En version plus C++:
#include 
#include <vector>

int main(int argc, char *argv[])
{
  int c;
  std::vector tab;
  std::cout << "c:";
  std::cin >> c;       
 
  for(int i = 0; i < 5; ++i) 
    tab.push_back(c++);
    
  for(std::vector::const_iterator it = tab.begin(); it != tab.end(); ++it)
    std::cout << *it << std::endl;

  return 0;
}


________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Messages postés
40
Date d'inscription
mercredi 24 octobre 2007
Statut
Membre
Dernière intervention
6 août 2013

Bonjour,
et merci pour les explications ( à tous les deux bien sur) c'est un peu difficile pour commencer mais je vais essayer de comprendre et d'appliquer tous vos conseils.
Bonne journée.
Messages postés
3819
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 septembre 2020
113
Edit: Petit erreur dans mes codes: Le commentaire du premier code devait être dans le deuxième code.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question