A voir également:
- Remplir un tableau en c avec pointeur
- Tableau word - Guide
- Trier un tableau excel - Guide
- Tableau ascii - Guide
- Organigramme a remplir word - Guide
- Imprimer un tableau excel - Guide
13 réponses
Oulala j'en entends des vertes et des pas mûres ! Non un tableau n'est pas un pointeur.
Exemple :
...alloue 5 cases de taille int, à partir de l'adresse tab. On accède aux éléments avec l'opérateur [ ] :
Pour les tableaux on PEUT passer par des pointeurs, notamment en C pour le cas d'un tableau dont la taille n'est pas connue à l'initialisation :
L'utilisation est ensuite similaire (attention avec malloc les cases ne sont pas initialisées, contrairement à calloc).
Cependant, en C++ on peut se passer de ces deux versions en ayant un tableau de taille dynamique et en s'affranchissant des pointeurs, à l'aide de la STL (standrad template librairie). C'est ce qui est communément utilisé.
La STL propose un certain nombre de conteners (vecteurs, ensembles triés...) et génériques (grâce aux template). Le choix du contener est important selon ce qu'on veut faire. Exemple :
- Ensemble non trié d'élément éventuellement distinct, accès direct à un élément (O(1)) -> utiliser la classe vector
- Ensemble trié d'éléments 2 à 2 distincts , par défaut triés par ordre croissant -> utiliser la classe set.
Il faut bien voir qu'on peut mettre aussi bien des int que des char ou des float (toujours grâces au template). De plus un certains nombre de méthodes sont déjà implémentées de base (taille du tableau, insertion d'un élément, recherche d'un élément...).
On peut voir les bases par exemple ici :
http://www-inf.int-evry.fr/cours/C++/CoursEA/node39.html
Concrètement dans ton cas ça donne un truc du genre
Bonne chance
Exemple :
int tab[5];
...alloue 5 cases de taille int, à partir de l'adresse tab. On accède aux éléments avec l'opérateur [ ] :
for(unsigned int i=0;i<5;++i){ std::cout<<tab[0]<<" "; } std::cout<<std::endl;
Pour les tableaux on PEUT passer par des pointeurs, notamment en C pour le cas d'un tableau dont la taille n'est pas connue à l'initialisation :
unsigned int n=5; int *tab=(int *)malloc(n*sizeof(int));
L'utilisation est ensuite similaire (attention avec malloc les cases ne sont pas initialisées, contrairement à calloc).
Cependant, en C++ on peut se passer de ces deux versions en ayant un tableau de taille dynamique et en s'affranchissant des pointeurs, à l'aide de la STL (standrad template librairie). C'est ce qui est communément utilisé.
La STL propose un certain nombre de conteners (vecteurs, ensembles triés...) et génériques (grâce aux template). Le choix du contener est important selon ce qu'on veut faire. Exemple :
- Ensemble non trié d'élément éventuellement distinct, accès direct à un élément (O(1)) -> utiliser la classe vector
- Ensemble trié d'éléments 2 à 2 distincts , par défaut triés par ordre croissant -> utiliser la classe set.
Il faut bien voir qu'on peut mettre aussi bien des int que des char ou des float (toujours grâces au template). De plus un certains nombre de méthodes sont déjà implémentées de base (taille du tableau, insertion d'un élément, recherche d'un élément...).
On peut voir les bases par exemple ici :
http://www-inf.int-evry.fr/cours/C++/CoursEA/node39.html
Concrètement dans ton cas ça donne un truc du genre
//Si tu veux le faire avec des sets change tous les "vector" par des "set" #include <vector> #include <iostream> int main(){ std::vector<int> tab; tab.push_back(3);//pour un set c'est la méthode insert tab.push_back(5); tab.push_back(2); tab.push_back(2); tab.push_back(4); //Le tableau contient 3,5,2,2,4 //Méthode 1 (moche) uniquement pour les vectors int max=tab[0]; for(unsigned int i=0;i<tab.size();++i){ if(tab[i]>max) max=tab[i]; } //Méthode 2 (mieux, mais seulement si tab n'est pas const) //Pour les sets tu ne peux pas utiliser la méthode 1 for(vector<int>::iterator it=tab.begin();it!=tab.end();++it){ if(*it>max) max=*it; } std::cout<<"Le max vaut : "<<max<<std::endl; return 0; }
Bonne chance
si si c'est francais
tu as un tableau mettons {1,4,2,8,6}, le but étant de déterminer le maximum , ici 8.
tu déclare ton tableau exemple tab[10].
apres c'est simple:
int i=0,maximum=0;
while(i<strlen(tab))
{
if(tab[i]>maximum)
{
maximum=tab[i];
}
}
tu as un tableau mettons {1,4,2,8,6}, le but étant de déterminer le maximum , ici 8.
tu déclare ton tableau exemple tab[10].
apres c'est simple:
int i=0,maximum=0;
while(i<strlen(tab))
{
if(tab[i]>maximum)
{
maximum=tab[i];
}
}
"permet de determiner le maximum entre des elements d'un tableau "
Soit ça fait vraiment trop longtemps que j'ai pas fait de C++, soit c'est pas français comme explication !
Si c'est le 2ème ,reformule ta question et on verra....
Zep3k!GnO
-->hi i hi o on va pas au boulot :P
Soit ça fait vraiment trop longtemps que j'ai pas fait de C++, soit c'est pas français comme explication !
Si c'est le 2ème ,reformule ta question et on verra....
Zep3k!GnO
-->hi i hi o on va pas au boulot :P
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Si tu as un tableau de 5 case et que tu appelles tab[2], tu appelles bien la deuxieme valeur (ou la troisieme si ca part de 0) du tableau tab.
C'est pas considéré comme un pointeur?
a+
dje-dje
C'est pas considéré comme un pointeur?
a+
dje-dje
bonjour tout le monde,
Je suis d'accord avec toi dje-dje, quand on fait
++
Je suis d'accord avec toi dje-dje, quand on fait
int tab[5];tab contient l'adresse de la première case du tableau. Si tu fais
tab++;tu n'incrémentes pas un entier mais tu pointeras sur la 2è case du tableau ('fin je crois...).
++
*tab=tab[0] correspond à la première valeur.
tab[1] correspond donc à la seconde et ainsi de suite.
Attention par contre car :
int tab[2] alloue bien seulement deux cases (tab[0] et tab[1]).
Pour le ++tab en effet c'est le pointeur qui est incrémenté (pour incrémenter la case (++*tab) ou ++tab[0]).
Rq: d'une manière générale, préferez la préincrémentation (++i) à la post incrémentation (i++) qui est meilleure point de vue mémoire.
Si vous utilisez la classe vector de la STL, vous avez la méthode at() qui permet d'accéder au ième du vecteur (vec.at(i) retournera vec[i]), mais qui déclenche une exception si on tape en dehors du vector. L'interêt c'est que c'est plus facile à débuger, mais que c'est un peu moins rapide à exécuter.
Pour ceux qui se mettent à la STL (nettement plus pratique que les tableaux du C), je vous conseille vivement de regarder un tutoriel par exemple :
http://www-inf.int-evry.fr/cours/C++/CoursEA/node39.html
Bonne chance
tab[1] correspond donc à la seconde et ainsi de suite.
Attention par contre car :
int tab[2] alloue bien seulement deux cases (tab[0] et tab[1]).
Pour le ++tab en effet c'est le pointeur qui est incrémenté (pour incrémenter la case (++*tab) ou ++tab[0]).
Rq: d'une manière générale, préferez la préincrémentation (++i) à la post incrémentation (i++) qui est meilleure point de vue mémoire.
Si vous utilisez la classe vector de la STL, vous avez la méthode at() qui permet d'accéder au ième du vecteur (vec.at(i) retournera vec[i]), mais qui déclenche une exception si on tape en dehors du vector. L'interêt c'est que c'est plus facile à débuger, mais que c'est un peu moins rapide à exécuter.
Pour ceux qui se mettent à la STL (nettement plus pratique que les tableaux du C), je vous conseille vivement de regarder un tutoriel par exemple :
http://www-inf.int-evry.fr/cours/C++/CoursEA/node39.html
Bonne chance
tab c'est l'adresse du début du tableau. Et *tab=tab[0] c'est le contenu de la première case. tab c'est un pointeur, une adresse quoi. Et à cette adresse il y a par exemple un entier qui est la valeur de tab[0]
Exemple :
Exemple :
*tab=2 tab=0xF45673------------>tab[0]=2 tab[1]=3 tab[2]=4... 0xF45673
petite précision:
Tu as tout a fait raison en ce qui concerne la norme C++.
Mais avec certain compilateur comme les ancien gcc, tab ne désignait pas le pointeur sur le premier élément. Ainsi, tab1=tab2 était licite et permettait de copier tout les membres de tab2 dans tab1 sans pour autant avoir une égalité des pointeur.
Plus valable à partir de gcc3
Tu parle de vector::at(int), je l'ai aussi trouver sur internet, mais gcc n'a jamais voulu me le compiler...
L'utilise tu? et si oui avec quel compilo?
Tu as tout a fait raison en ce qui concerne la norme C++.
Mais avec certain compilateur comme les ancien gcc, tab ne désignait pas le pointeur sur le premier élément. Ainsi, tab1=tab2 était licite et permettait de copier tout les membres de tab2 dans tab1 sans pour autant avoir une égalité des pointeur.
Plus valable à partir de gcc3
Tu parle de vector::at(int), je l'ai aussi trouver sur internet, mais gcc n'a jamais voulu me le compiler...
L'utilise tu? et si oui avec quel compilo?
tab c'est un pointeur, une adresse quoi.
Donc on en revient bien à ce que disais dje-dje, à savoir que
Un tableau c'est pas un pointeur? ^^
Sinon sympa la petite précision sur la pré et post incrémentation, bon à savoir ça !
Donc on en revient bien à ce que disais dje-dje, à savoir que
Un tableau c'est pas un pointeur? ^^
Sinon sympa la petite précision sur la pré et post incrémentation, bon à savoir ça !
Non pas tab::at(i) mais tab.at(i) (avec tab un vector, et je crois que ça marche aussi avec les set). L'opérateur a::b désigne "chercher une fonction b dans un namespace a". Exemple
Tu peux imbriquer les namespace. C'est assez pratique quand tu as un énorme projet pour éviter d'avoir deux fois le même nom de fonction, ça permet d'organiser quoi ;-)
Quand vous aurez fini avec la stl, les plus motivés pourront enchaîner avec boost (permet de gérer des matrices énormes et plein d'autres trucs) et la bgl (pour ceux qui font des graphes). Attention par contre c'est chaud et vous avez intérêt à maitriser les template avent de vous y lancer ;-)
Bonne chance
namespace a{ int f(){ return 0; } }
Tu peux imbriquer les namespace. C'est assez pratique quand tu as un énorme projet pour éviter d'avoir deux fois le même nom de fonction, ça permet d'organiser quoi ;-)
Quand vous aurez fini avec la stl, les plus motivés pourront enchaîner avec boost (permet de gérer des matrices énormes et plein d'autres trucs) et la bgl (pour ceux qui font des graphes). Attention par contre c'est chaud et vous avez intérêt à maitriser les template avent de vous y lancer ;-)
Bonne chance
Dig up!!
J'ai une ptite question en pasant sur boost et bgl.
Tu parlais de dessiner des graphes avec. J'ai justement dessiné recemment un graphe en OpenGl.
Il est plus rapide qu'OpenGL?
Ca serait pas une sorte de Matlab version C++?
J'ai pas vraiment le temps de m'y pencher, ca serait sympa d'avoir des infos dessus.
Merci!
Laurent.
J'ai une ptite question en pasant sur boost et bgl.
Tu parlais de dessiner des graphes avec. J'ai justement dessiné recemment un graphe en OpenGl.
Il est plus rapide qu'OpenGL?
Ca serait pas une sorte de Matlab version C++?
J'ai pas vraiment le temps de m'y pencher, ca serait sympa d'avoir des infos dessus.
Merci!
Laurent.
Non ce n'est pas la même vocation. Boost permet de manipuler entre autres des graphes (BGL) mais pas seulement. Il est par exemple possible de serializer des structure (ie générer un fichier binaire qui va permettre lors d'une exécution ultérieure de la charger immédiatement en mémoire).
La BGL permet quant à elle surtout de manipuler des structures de graphe C++ ultra optimisées et propose des algorithmes classiques de la théorie des graphe, comme l'algorithme de Dijkstra. Il est aussi possible de générer très facilement des fichiers dot (utilisé par graphviz) afin de représenter en 2D des graphes. Le dessin du graphe est alors délégué à graphviz (placement des sommets pour éviter les arcs qui se croisent, etc...).
Bonne chance
La BGL permet quant à elle surtout de manipuler des structures de graphe C++ ultra optimisées et propose des algorithmes classiques de la théorie des graphe, comme l'algorithme de Dijkstra. Il est aussi possible de générer très facilement des fichiers dot (utilisé par graphviz) afin de représenter en 2D des graphes. Le dessin du graphe est alors délégué à graphviz (placement des sommets pour éviter les arcs qui se croisent, etc...).
Bonne chance