Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1618 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2  3  4
Page Suivante
Auteur Sujet :

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

n°573849
Taz
bisounours-codeur
Posté le 23-11-2003 à 14:12:30  profilanswer
 

Reprise du message précédent :
et ben tu prends un tableau t, et size(t) te retourne sa taille

mood
Publicité
Posté le 23-11-2003 à 14:12:30  profilanswer
 

n°573850
Taz
bisounours-codeur
Posté le 23-11-2003 à 14:14:44  profilanswer
 

wow, 1 milliers de vues

n°573853
ffluff
Challenge Everything
Posté le 23-11-2003 à 14:17:31  profilanswer
 

je ne connaissais absoluement pas cette forme de syntaxe pour les parametres.(parametre non nommé)
Quelqu'un peu l'expliquer ?(sont fonctionnement car je comprends ce quelle fais mais pas ont mécanisme)


Message édité par ffluff le 23-11-2003 à 14:18:09
n°573855
Taz
bisounours-codeur
Posté le 23-11-2003 à 14:19:50  profilanswer
 

ben c'est un paramètre pas nommé, si tu t'en sers pas, pas besoin du nom. genre operator++(int). si ça t'amuse, tu rajoute dummy, mais ça ne change rien

n°573856
Enidan
Posté le 23-11-2003 à 14:23:31  profilanswer
 

Taz a écrit :

bon la solution parfaite est  
 

Code :
  1. #include <cstddef> // for size_t
  2. template<typename T, size_t N>
  3. inline size_t size(const T (& )[N])
  4. {
  5.   return N;
  6. }


 


 
Super,
Et tu l'expliques ta soluce ou bien c'était encore un topic uniquement destiné aux gourous ?
Que signifie ce (& ) ?
Comment on appelle ta fonction ?

Code :
  1. int tab [5];
  2. int taille = size(tab);


Si oui, comment le compilo trouve la valeur de N ?

n°573857
Taz
bisounours-codeur
Posté le 23-11-2003 à 14:25:45  profilanswer
 

non
une référence ce n'est pas clair
comme dans ton exemple
déduction d'argument template
 
commence par comprendre la définition de tableau que j'ai donné

n°573860
Enidan
Posté le 23-11-2003 à 14:31:08  profilanswer
 

C pas la définition du tableau qui me pose pb.
Pour les références, je ne connais que & et pas (& ) => qu'est-ce que ça signifie ?
Peux-tu détailler la déduction d'argument template ou au moins filer un lien ?

n°573862
Taz
bisounours-codeur
Posté le 23-11-2003 à 14:35:23  profilanswer
 

ça signifie qu'on parenthèse pour pas que le compilateur perde pas ses billes, parce qu'un tableau de références, ça n'est pas possible/
pas de lien, sauf sur amazon. c'est le même phénomène que quand tu utilises std::max, std::make_pair, etc


Message édité par Taz le 23-11-2003 à 14:37:27
n°573866
Enidan
Posté le 23-11-2003 à 14:38:10  profilanswer
 

D'accord, je vais regarder.
Merci.

n°573868
cassidy
Black Rainbow
Posté le 23-11-2003 à 14:42:53  profilanswer
 

C'est quoi la différence entre class et typename pour les templates?

mood
Publicité
Posté le 23-11-2003 à 14:42:53  profilanswer
 

n°573869
Taz
bisounours-codeur
Posté le 23-11-2003 à 14:45:37  profilanswer
 

Cassidy a écrit :

C'est quoi la différence entre class et typename pour les templates?

ça s'appelle la fonction recherche et bibliolinks

n°573904
bossamiral​2
Ctrl+Alt+Del
Posté le 23-11-2003 à 15:45:00  profilanswer
 

si cela continue comme ça, on va tous devoir se remettre à faire de l'assembleur

n°573905
skeye
Posté le 23-11-2003 à 15:47:12  profilanswer
 

bossamiral2 a écrit :

si cela continue comme ça, on va tous devoir se remettre à faire de l'assembleur  


:heink:

n°573907
Taz
bisounours-codeur
Posté le 23-11-2003 à 15:59:18  profilanswer
 

ah comprends pas ... c'est sans doute le truc le plus haut niveau que t'es jamais écrit et tu nous parles d'assembleur

n°573910
nraynaud
lol
Posté le 23-11-2003 à 16:05:05  profilanswer
 

Enidan a écrit :


Pour les références, je ne connais que & et pas (& ) => qu'est-ce que ça signifie ?
Peux-tu détailler la déduction d'argument template ou au moins filer un lien ?


son code est équivalent à :

Code :
  1. #include <cstddef> // for size_t
  2. template<typename T, size_t N>
  3. inline size_t size(const T &tab[N])
  4. {
  5. return N;
  6. }

Comme il n'utilise pas le paramètre tab, il ne l'a pas écrit (pour ne pas utiliser inutilement un nom de variable) et n'a écrit que son type. Pour des raisons essentiellement lexicales, il arrive souvent que pour mettre un opérateur seul (sans son/ses arguments) en informatique, on l'entoure de parenthèses. Ici, il s'agit d'un opérateur de type.
 
D'une manière plus générale, le fait d'avoir écrit que la fonction prend un tableau de type T et de taille N, d'avoir précisé que T et N sont des paramètres génériques (avec le template<typename T, size_t N> ), puis ensuite d'avoir utilisé la fonction avec une variable de type int[5], le compilo en déduit (infère) que T vaut int et que N vaut 5 (substitue les occurences de T par int et les occurences de N par 5) à cet endroit.
 
Si plus loin on utilise la fonction avec un paramètre de type char[12], le compilo en déduira à l'endroit d'utilisation que T vaut char et N vaut 12.


---------------
trainoo.com, c'est fini
n°573919
Enidan
Posté le 23-11-2003 à 16:29:18  profilanswer
 

Question subsidiaire : est-ce important que N soit de type size_t pour que cette déduction fonctionne ?

n°573920
LajioT
Posté le 23-11-2003 à 16:29:58  profilanswer
 

Euh,
char test[] = "blabla";
int a = size(test);
=
sizetab.cpp:10: pas de fonction concordante pour l'appel de «size(char[7])»
 
J'ai raté quelque chose ? (bien sûr, le code du template est ds un .h includé ds le cpp)

n°573923
nraynaud
lol
Posté le 23-11-2003 à 16:45:20  profilanswer
 

Enidan a écrit :

Question subsidiaire : est-ce important que N soit de type size_t pour que cette déduction fonctionne ?

non, simplement un truc compatible avec ce qui peut être dans des crochets de tableau (perso j'avais tout fait avec int parce que je fais pas mal de java en ce moment).
 

LaJioT a écrit :

Euh,
char test[] = "blabla";
int a = size(test);
=
sizetab.cpp:10: pas de fonction concordante pour l'appel de «size(char[7])»
 
J'ai raté quelque chose ? (bien sûr, le code du template est ds un .h includé ds le cpp)

Tiens c'est rigolot, ça marche pas avec la fonction de Taz, mais ça marche avec la mienne.
Encore une connerie du style "la beta-réduction n'est pas équivalent à l'inférence au sens des types".
la mienne, c'est un truc tout compliqué :  

Code :
  1. template<typename T> struct len{
  2.       static const int result = 0;
  3.   };
  4.   template<typename BASETYPE, int N> struct len<BASETYPE [N]> {
  5.       static const int result = N;
  6.   };
  7.   template<typename T> int getLen(T &tab) {
  8.       return len<T>::result;;
  9.   };

que j'avais fait aussi compliqué par manque d'aisance dans le domaine. Mais qui semble ne pas être équivalent au sens des types ; vu la taille de la norme sur les template, je vais pas aller chercher moi-même la différence, je vais attendre sagement que quelqu'un nous donne la réponse.
 
la principale différence est que dans mon cas l'inférence se fait au passage de paramètres de template et que dans le cas de Taz, l'inférence se fait au passage de paramètres de fonction. La sémantique serait-elle différente ?


---------------
trainoo.com, c'est fini
n°573925
LajioT
Posté le 23-11-2003 à 16:51:23  profilanswer
 

Hey, je viens juste de tester sous g++-3.3.2, et en fait, la fonction à Taz fonctionne correctement sous celui ci, mais pas sous la 3.2.2.
Par contre, la tienne nraynaud fonctionne pour les deux.


Message édité par LajioT le 23-11-2003 à 16:54:03
n°573929
nraynaud
lol
Posté le 23-11-2003 à 17:01:03  profilanswer
 

c'est le const qui chie, mais je vois pas pourquoi.
 
précision : si le tableau passé en paramètre est déclaré const, et le paramètre de la fonction est déclaré const, ça fonctionne. Si aucun des 2 n'est déclaré const, ça fonctionne. Mais si on tente de les emboiter dans le bon sens, ça ne fonctionne pas.


Message édité par nraynaud le 23-11-2003 à 17:07:21

---------------
trainoo.com, c'est fini
n°573932
Enidan
Posté le 23-11-2003 à 17:06:07  profilanswer
 

nraynaud a écrit :


son code est équivalent à :

Code :
  1. #include <cstddef> // for size_t
  2. template<typename T, size_t N>
  3. inline size_t size(const T &tab[N])
  4. {
  5. return N;
  6. }




En fait non.
Ce que tu as écrit est interprété comm un tableau de références.
Par-contre, je n'ai pas réussi à trouver les bonnes parenthèses pour que tab soit bien un tableau passé par référence.
Qqun a la réponse ?

n°573940
ffluff
Challenge Everything
Posté le 23-11-2003 à 17:13:30  profilanswer
 

Enidan a écrit :


En fait non.
Ce que tu as écrit est interprété comm un tableau de références.
Par-contre, je n'ai pas réussi à trouver les bonnes parenthèses pour que tab soit bien un tableau passé par référence.
Qqun a la réponse ?


 

Code :
  1. #include <cstddef> // for size_t
  2. template<typename T, size_t N>
  3. inline size_t size(const T (&tab)[N])
  4. {
  5. return N;
  6. }


 
c'est la première chose que j'ai éssayé de faire :)


Message édité par ffluff le 23-11-2003 à 17:14:37

---------------
«Le succès consiste à aller d'échecs en échecs sans jamais perdre son enthousiasme» - Churchill
n°573947
Taz
bisounours-codeur
Posté le 23-11-2003 à 17:20:10  profilanswer
 

Enidan a écrit :

Question subsidiaire : est-ce important que N soit de type size_t pour que cette déduction fonctionne ?

c'est essentiel. les entiers qui représentent des tailles sont des size_t, on en sais pas plus

n°573948
Enidan
Posté le 23-11-2003 à 17:20:17  profilanswer
 

Merci ffluff, je me sens un peu bête du coup.

n°573949
Taz
bisounours-codeur
Posté le 23-11-2003 à 17:21:52  profilanswer
 

nraynaud > alors on fait le malin, on oublie des parenthèses, on se calme avec les ;; sinon je comprends pas la différence que dont tu parles. une fonction peut faire la déduction selon le contexte, une déclaration non. std::vector n'est pas un type, il faut donc tout écrire. c'est comme ça pour le moment


Message édité par Taz le 23-11-2003 à 17:22:06
n°573955
nraynaud
lol
Posté le 23-11-2003 à 17:28:50  profilanswer
 

Taz a écrit :

nraynaud > alors on fait le malin, on oublie des parenthèses, on se calme avec les ;; sinon je comprends pas la différence que dont tu parles. une fonction peut faire la déduction selon le contexte, une déclaration non. std::vector n'est pas un type, il faut donc tout écrire. c'est comme ça pour le moment

j'ai pas oublié les parenthèses, je savais même pas qu'il en fallait. J'ai horreur de ces conneries, pareil avec le const et les étoiles (qui est constant, le pointeur ou le pointé ?).
 
Par contre, je vois pas pourquoi tu parles de vector, tout d'un coup.
 
Quand à l'inférence, c'est bon, on a capté pourquoi ça ne marchait pas.


Message édité par nraynaud le 23-11-2003 à 17:29:18

---------------
trainoo.com, c'est fini
n°573958
Taz
bisounours-codeur
Posté le 23-11-2003 à 17:31:13  profilanswer
 

nraynaud a écrit :

j'ai pas oublié les parenthèses, je savais même pas qu'il en fallait.


sémantiquement non, puis qu'un tableau de références est un non-sens

nraynaud a écrit :


J'ai horreur de ces conneries, pareil avec le const et les étoiles (qui est constant, le pointeur ou le pointé).

ça me parait très clair, je ne vois pas d'ambiguité.
 

Code :
  1. const T * // pointeur de T constants
  2. T * const // pointeur constant de T
  3. const T * const // pointeur constant de T constants


Message édité par Taz le 23-11-2003 à 17:35:08
n°573960
nraynaud
lol
Posté le 23-11-2003 à 17:37:05  profilanswer
 

Taz a écrit :

ça me parait très clair, je ne vois pas d'ambiguité.

C'est bien, félicitations.


---------------
trainoo.com, c'est fini
n°574024
gilou
Modérateur
Modzilla
Posté le 23-11-2003 à 19:30:42  profilanswer
 

Ah non, je rentre et je vois qu'il a filé la soluce.  
Moi qui m'etait amusé a troller style programmeur C ne connaissant pas le C++ :D
 
Cette astuce est connue depuis un bail. Pour les microsoftiens, ca marche en MSVC++ 7 mais pas en MSVC 6.

Citation :

Templates
Visual C++ .NET fixes a few conformance problems involving templates.
 
Non-Type Template Parameters
Visual C++ .NET finally allows one of my pet features?finding the length of an array during compilation:
 
#include <stdlib.h> // defines size_t
 
template<typename T, size_t N>
size_t lengthof(T (& )[N])
    {
    return N;
    }
 
int main()
    {
    int a[10];
    lengthof(a); // calls lengthof<int, 10>
    }
 
If you masochistically compile this program with Visual C++ 6.0, you'll experience wondrous diagnostics:
 
error C2265: '<Unknown>' : reference to a zero-sized array is illegal
error C2266: '<Unknown>' : reference to a non-constant bounded array  
is illegal
error C2784: 'unsigned int __cdecl lengthof(T (& )[1])' : could not  
deduce template argument for ' (& )[1]' from 'int [10]'


 
(extrait de la tres utile http://msdn.microsoft.com/library/ [...] 282002.asp
qui discutte de la conformité de la derniere mouture du compilo vis a vis fes standards).
 
A+,


Message édité par gilou le 23-11-2003 à 19:31:15

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°574029
Taz
bisounours-codeur
Posté le 23-11-2003 à 19:36:11  profilanswer
 

j'ai jamais eu la prétention d'inventer quoi ce que çoi
 
<stdlib.h> n'est pas une entete standard, <cstdlib> l'est

n°574032
schnapsman​n
Zaford Beeblefect
Posté le 23-11-2003 à 19:42:39  profilanswer
 

Taz a écrit :


<stdlib.h> n'est pas une entete standard, <cstdlib> l'est


 
Venant d'un extrait de la msdn, ça ne m'étonne pas.
 
Au fait, chapeau pour l'ensemble de ton oeuvre dans ce topic   :whistle:


Message édité par schnapsmann le 23-11-2003 à 19:42:48

---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
n°574058
gilou
Modérateur
Modzilla
Posté le 23-11-2003 à 20:11:46  profilanswer
 

Taz a écrit :

j'ai jamais eu la prétention d'inventer quoi ce que çoi
 
<stdlib.h> n'est pas une entete standard, <cstdlib> l'est


 
Je ne fais que reproduire ce qui figure dans l'article (une colonne assez interessante pour qui utilise les outils MS d'ailleurs). De toute facon comme je ne dispose pour l'instant que de la version 6, je n'ai pas eu l'occasion de tester tout ca en live.
 
Au fait Taz, j'avais une solution du pauvre, qui marche en VC++ 6:
 
template<typename T, typename Q>  
  int taille(T *x, Q &y)  
  {
 return sizeof(Q)/sizeof(T);
}
 
et tu appelles ca sur taille(a, a);
 
Qu'en penses tu?
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°574061
Taz
bisounours-codeur
Posté le 23-11-2003 à 20:14:12  profilanswer
 

bah c'est une solution de pauvre mais qui fonctionne.
 
mais vraiment pauvre
 

Code :
  1. template<typename TAB>
  2. inline size_t size2(const TAB &t)
  3. {
  4.   return sizeof t / sizeof t[0];
  5. }


suffit
mais par rapport à l'autre, elle a le désavantage de ne pas refouler tout ce qui n'est pas tableau

n°574076
ffluff
Challenge Everything
Posté le 23-11-2003 à 20:42:16  profilanswer
 

il faut quand même remercié TAZ qui malgrés sont manque évident de diplomatie (je ne dis pas que c entierement de ca faute, on y est pour quelque chose aussi)
Arrive à animer les catégories C/C++ et a nous faire mal aux neuronnes :)
 
 
=> encore :)


---------------
«Le succès consiste à aller d'échecs en échecs sans jamais perdre son enthousiasme» - Churchill
n°574083
nraynaud
lol
Posté le 23-11-2003 à 20:44:15  profilanswer
 

fait gaffe, si tu le pousses trop il va arriver à te faire mal au cul aussi.


---------------
trainoo.com, c'est fini
n°574086
ffluff
Challenge Everything
Posté le 23-11-2003 à 20:48:25  profilanswer
 

lol fait gaffe il deteint sur toi.
J'ai droit au même style de phrases mais plus gore ;)


---------------
«Le succès consiste à aller d'échecs en échecs sans jamais perdre son enthousiasme» - Churchill
n°574149
verdoux
And I'm still waiting
Posté le 23-11-2003 à 21:39:11  profilanswer
 

gilou a écrit :


Cette astuce est connue depuis un bail. Pour les microsoftiens, ca marche en MSVC++ 7 mais pas en MSVC 6.


Ouais, on peut pas vraiment faire de c++ avec VC6 :/

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
Redimensionnement de tableauProblem de dimension de tableau en CSS
Tri un tableau de tableaux ?VB + Classe - Tableau d'objet
[C] Taille d'un tableau d'int ?rafraichissement d'un tableau dynamique a l'aide de boutons
Modifier des éléments créé par une fonctionPassage de pointeur de fonction membre à une fonction
taille d'un char*[] avec \0 
Plus de sujets relatifs à : défi de la semaine : fonction retournant la taille d'un tableau


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR