Problème de compréhension tableau.

Résolu
fhoest Messages postés 40 Date d'inscription mercredi 24 octobre 2007 Statut Membre Dernière intervention 6 août 2013 - 31 août 2011 à 10:21
cptpingu Messages postés 3835 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 1 novembre 2022 - 31 août 2011 à 16:08
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

coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
31 août 2011 à 10:40
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
3
cptpingu Messages postés 3835 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 1 novembre 2022 124
31 août 2011 à 12:02
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
3
fhoest Messages postés 40 Date d'inscription mercredi 24 octobre 2007 Statut Membre Dernière intervention 6 août 2013
31 août 2011 à 16:07
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.
0
cptpingu Messages postés 3835 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 1 novembre 2022 124
31 août 2011 à 16:08
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
0