défi de la semaine : fonction retournant la taille d'un tableau

défi de la semaine : fonction retournant la taille d'un tableau - C++ - Programmation

Marsh Posté le 22-11-2003 à 17:25:47    

je les vois venir les boolays et newbies du C++ et vous autres qui affirmaient qu'on ne peut pas écrire de fonction qui retourne la taille d'un tableau en C++ (je ne parle __pas__ du C).
 
Manque de bol, pour vous, on peut, et ça fait 3 lignes. Taupe !


Message édité par Taz le 22-11-2003 à 18:17:05
Reply

Marsh Posté le 22-11-2003 à 17:25:47   

Reply

Marsh Posté le 22-11-2003 à 17:35:05    

R3g a écrit :

Ca depends de ce que tu connais, non ? parce-que sizeof(array)/sizeof(int), ca te donne la taille de array si array est un tableau d'entiers, non ?

personne ne comprenant pas le concept de fonction, s'abstenir
 
j'en profite
 
sizeof variable
sizeof(type)
 
la taille d'un tableau t
sizeof tab / sizeof tab[0]

Reply

Marsh Posté le 22-11-2003 à 17:36:59    

http://www.lgml.net/HFR/img/gordon%20shumway.gif

Reply

Marsh Posté le 22-11-2003 à 17:38:20    

R3g a écrit :

j'y connais rien en C++

dehors

Reply

Marsh Posté le 22-11-2003 à 17:39:06    


 
 
faut que t'arretes toi, t'es completement grotesque
On dirait une mauvaise parodie d'un dictateur de foire

Reply

Marsh Posté le 22-11-2003 à 17:40:52    

bah je pose un petit problème sérieux, si ça part en blabla direct dès le premier message, c'est pas terrible.

Reply

Marsh Posté le 22-11-2003 à 17:41:51    

R3g a écrit :

Si je sors à chaque fois qu'il y a qqchose à apprendre, je vais progresser très vite...

je demande une fonction tu me sors sizeof ... je dis tableau, tu me dis vector ...

Reply

Marsh Posté le 22-11-2003 à 17:43:03    

Taz a écrit :

bah je pose un petit problème sérieux, si ça part en blabla direct dès le premier message, c'est pas terrible.


 
bah
 
*t'es pas obligé de faire ton constipé chronique
*c t pas du blabla
*file la solution au lieu de faire du suspens alacon a tendance masturbatoire (moua je sais et pas vous [:udok])

Reply

Marsh Posté le 22-11-2003 à 17:43:04    

Taz a écrit :

bah je pose un petit problème sérieux, si ça part en blabla direct dès le premier message, c'est pas terrible.

Et t'as eu combien de reponses serieuses ? T'as fais le topic juste pour le plaisir de pouvoir poster ta reponse une fois que tout le monde aura dit qu'il ne sait pas...
Bon je vais être sympa, j'efface mes posts :D


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 22-11-2003 à 17:47:25    

bah je vais pas filer la réponse directement quand même. La majorité des programmeurs C++ pense que c'est impossible, alors qu'il existe une solution en 3 lignes. Le but c'est de faire un peu réfléchir, je pense que ça c'est interessant, de comprendre ce qui ne marche, et ce qui peut marcher, et surtout pourquoi

Reply

Marsh Posté le 22-11-2003 à 17:47:25   

Reply

Marsh Posté le 22-11-2003 à 17:50:46    

Taz a écrit :

bah je vais pas filer la réponse directement quand même. La majorité des programmeurs C++ pense que c'est impossible, alors qu'il existe une solution en 3 lignes. Le but c'est de faire un peu réfléchir, je pense que ça c'est interessant, de comprendre ce qui ne marche, et ce qui peut marcher, et surtout pourquoi

Bon alors essayons de reflechir : la fonction dont tu parles prendrait donc en paramètre un pointeur (je suppose). D'après les faibles connaissances que j'ai, le pointeur est juste variable dont la valeur est une adresse memoire.
Or , à priori, seul le système qui a alloué cette mémoire peut connaitre la taille de la plage, puisque le pointeur ne donne que l'adresse de début. J'ai bon jusque là ou pas ?


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 22-11-2003 à 17:52:35    

R3g a écrit :

Bon alors essayons de reflechir : la fonction dont tu parles prendrait donc en paramètre un pointeur (je suppose). D'après les faibles connaissances que j'ai, le pointeur est juste variable dont la valeur est une adresse memoire.
Or , à priori, seul le système qui a alloué cette mémoire peut connaitre la taille de la plage, puisque le pointeur ne donne que l'adresse de début. J'ai bon jusque là ou pas ?


c'est ce que je pense aussi, lecture de la mémoire jusqu'à atteindre une valeur qui n'est pas du type de celles contenues dans le tableau  :D ?
 
[:neowen]

Reply

Marsh Posté le 22-11-2003 à 17:54:28    

polo021 a écrit :


c'est ce que je pense aussi, lecture de la mémoire jusqu'à atteindre une valeur qui n'est pas du type de celles contenues dans le tableau  :D ?
 
[:neowen]

Ou alors écrire dedans et catcher l'exception levée par une acces violation ?


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 22-11-2003 à 17:54:44    

oui et non
un pointeur c'est un pointeur .| si tu l'a eu via un new, alors l'allocateur mémoire en connait la taille de plage allouée, mais cette information n'est pas disponible. si ton pointeur vient d'ailleurs aucun moyen. et un pointeur n'est pas en tableau, bien que ton compilateur sache convertir un tableau tab en pointeur, par exemple

Code :
  1. int tab[10];
  2. int *p = tab;


est en fait

Code :
  1. int tab[10];
  2. int *p = &tab[0];


qui est correctement typé
 
donc ta première piste, elle semble pas très concluante ...


Message édité par Taz le 22-11-2003 à 17:55:23
Reply

Marsh Posté le 22-11-2003 à 17:56:29    

Taz a écrit :

oui et non
un pointeur c'est un pointeur .| si tu l'a eu via un new, alors l'allocateur mémoire en connait la taille de plage allouée, mais cette information n'est pas disponible. si ton pointeur vient d'ailleurs aucun moyen. et un pointeur n'est pas en tableau, bien que ton compilateur sache convertir un tableau tab en pointeur, par exemple

Code :
  1. int tab[10];
  2. int *p = tab;


est en fait

Code :
  1. int tab[10];
  2. int *p = &tab[0];


qui est correctement typé
 
donc ta première piste, elle semble pas très concluante ...

Ok mais alors (c'est là que j'y connais rien en C++), pour passer le tableau en paramètre, il faut uiliser un pointeur, ou on peut le passer par référence ?


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 22-11-2003 à 17:58:13    

R3g a écrit :

Ou alors écrire dedans et catcher l'exception levée par une acces violation ?

tu connais vraiment pas grand chose. une erreur de segmentation ne lève pas d'exception et tu peux te ballader la ou tu ne devrais pas sans que ton système t'envoie le dit signal. surtout que si tu réfléchis, c'est un peu dommage d'essayer de calculer la taille d'un tableau à l'exécution, alors que techniquement cette information est disponible à la compilation (ce qu'exploite sizeof)

Reply

Marsh Posté le 22-11-2003 à 18:02:24    

Faut m'excuser hein.. Je fais du Java, alors gérer la mémoire c'est pas mon truc. Mais ca m'intéresse beaucoup, j'essaie de me mettre au C++. Tu pourrais peut-être lacher un indice ?


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 22-11-2003 à 18:09:33    

ce qu'il faut bien comprendre dans le problème ici, c'est que ce n'est pas une histoire de gestion de la mémoire. un tableau Java a un attribut pour mémoriser sa taille. en C et C++, il n'en ai rien. En C, il est impossible de faire une fonction renvoyant la taille (le nombre d'éléments) d'un tableau. J'espère que tu en ai convaincu. Ton problème reg, c'est que tu débutes un peu trop quand même : je ne pense pas que tu te sois poser la question avant aujourd'hui. Quand je donnerais la solution, aussi simple soit elle, tu ne la comprendras pas.
Alors continue à apprendre. Je n'ai pas souvenir de sujet de ta part : n'hésite pas. Je suis là.

Reply

Marsh Posté le 22-11-2003 à 18:18:50    

Effectivement, je ne me suis jamais posé la question : j'ai toujours été persuadé qu'on ne pouvait pas connaitre la taille d'un tableau. Je vais arrêter de pourrir ton topic, mais j'attends la réponse avec curiosité.


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 22-11-2003 à 18:35:07    

bon je me lance :P
 

Code :
  1. int taille(contener tab)
  2. {
  3. int n=0;
  4. while(typeid(tab[0])==typeid(tab[n]))
  5. {
  6.   n++;
  7. }
  8. return n;
  9. }


 
ok c'est pas 3 lignes mais bon  [:ffluff]


Message édité par ffluff le 22-11-2003 à 18:35:54

---------------
«Le succès consiste à aller d'échecs en échecs sans jamais perdre son enthousiasme» - Churchill
Reply

Marsh Posté le 22-11-2003 à 18:37:28    

en fait non
on imagine un tableau de 3elt en memoire:
tab[0] = 0x01
0x01 : 1elt
0x02 : 2elt
0x03 : 3elt
0x04 : un elt du prog mais pas du tableau
 
et bam ca marche pas :/


Message édité par ffluff le 22-11-2003 à 18:37:51

---------------
«Le succès consiste à aller d'échecs en échecs sans jamais perdre son enthousiasme» - Churchill
Reply

Marsh Posté le 22-11-2003 à 18:40:31    

bah il est bien beau ton programme seulement il boulcera indéfiniment, puisque par définition typeid(tab[0])==typeid(tab[n])

Reply

Marsh Posté le 22-11-2003 à 18:48:20    

mais la vu que n peut depasser la capacité du tableau c'est pas vrai si n> taille du tableau


---------------
«Le succès consiste à aller d'échecs en échecs sans jamais perdre son enthousiasme» - Churchill
Reply

Marsh Posté le 22-11-2003 à 18:50:05    

fFluFf a écrit :

mais la vu que n peut depasser la capacité du tableau c'est pas vrai si n> taille du tableau

masi biensur .. fais gaffe, on est le weekend, t'es entrain de te piéger toi même

Reply

Marsh Posté le 22-11-2003 à 19:09:49    

t'es donc entrain de me dire :
int tab[4];
typeid(tab[5]) == typeid(tab[0])  
 
??


---------------
«Le succès consiste à aller d'échecs en échecs sans jamais perdre son enthousiasme» - Churchill
Reply

Marsh Posté le 22-11-2003 à 19:10:41    

taz> laisse encore du temps, je suis sur une idée (tordue).


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 22-11-2003 à 19:15:18    

ffluff > c'est sur que toutes les case d'un tableau ont le même type.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 22-11-2003 à 19:33:20    

Code :
  1. #include<iostream>
  2. using namespace std;
  3. template<typename T> struct len_rec {
  4.   static const int result = 0;
  5. };
  6. template<typename BASETYPE, int N> struct len_rec<BASETYPE[N]> {
  7.   static const int result =
  8.       N;
  9. };
  10. int main(int argc, char **argv) {
  11.   int var[10];
  12.   cout << len_rec<typeof(var)>::result << endl;
  13. }

Proposition candide.
 
Au passage je signale qu'en Ada, ça s'écrit table'Length.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 22-11-2003 à 19:39:53    

nraynaud a écrit :

ffluff > c'est sur que toutes les case d'un tableau ont le même type.

oui, c'est un peu la base de tous.
 
Fortune


Message édité par Taz le 22-11-2003 à 19:41:49
Reply

Marsh Posté le 22-11-2003 à 19:41:24    

nraynaud > très très tordu effectivement, et typeof ne fait pas parti du C++. en l'utilisant tu tentes de contourner un problème qui n'existe pas

Reply

Marsh Posté le 22-11-2003 à 19:48:01    

bon, relaisse du temps, je cherche une référence du C++ (dès qu'on mets template dans google, on a la STL, c'est lourd) et je regarde en détail.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 22-11-2003 à 20:10:35    

j'abandonne, je trouve pas de spec en lignedu langage (et il semble que ça n'existe pas http://saloon.javaranch.com/cgi-bi [...] 2&t=001713 ), j'ai pas de bouquin, et dans les tutoriaux, j'ai rien trouvé d'intéressant.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 22-11-2003 à 20:11:20    

euh j'y connais rien du tout en c++ mais on ne peut pas connaitre l'adresse de départ d'allocation du tableau et celle de la fin d'allocation. Avec ça on devrait pouvoir déterminé la taille du tableau donc le nombre d'élément, non
 
Je vois déjà Taz se taper la tête contre le mur. (excuse moi d'avance)

Reply

Marsh Posté le 22-11-2003 à 20:13:32    

bossamiral2 a écrit :

Je vois déjà Taz me taper la tête contre le mur.

Reply

Marsh Posté le 22-11-2003 à 20:14:22    


 
Au moins j'ai essayé
 
je suppose que l'on ne peut pas connaitre l'adresse de fin allocation du pointeur


Message édité par bossamiral2 le 22-11-2003 à 20:17:25
Reply

Marsh Posté le 22-11-2003 à 20:25:58    

ce n'est pas qu'on ne peut pas, c'est quelle n'existe pas
 

Citation :

pointeur

!= tableau
de toutes façons. si vous n'avez pas intégré ça, vous faites fausse route

Reply

Marsh Posté le 22-11-2003 à 20:26:22    

bossamiral > si il pose la question c'est que la réponse doit être un minimum élégante, donc ne repose que sur les types statiques et est entièrement résolue à la compilation.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 22-11-2003 à 20:27:19    

question :
tableau dynamic (int *tab= new int[10])
ou static (int tab[10])
car si le tableau est dynamic le code de nraynaud ne marche pas :P


---------------
«Le succès consiste à aller d'échecs en échecs sans jamais perdre son enthousiasme» - Churchill
Reply

Marsh Posté le 22-11-2003 à 20:27:54    

int *tab= new int[10]
 
n'est pas un tableau :o

Reply

Marsh Posté le 22-11-2003 à 20:29:50    

hs:
Un des plus gros regret de ma vie c de ne pas mettre mis a la prog jeune et de ne pas avoir geeké comme vous :cry:
fin hs.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed