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

 


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

Subtilités entre [] et *

n°691241
docmaboul
Posté le 02-04-2004 à 19:01:50  profilanswer
 

Reprise du message précédent :

joel f a écrit :


T'as pas l'impression de brasser du vent


 
Vanité des vanités, tout n'est que vanité et poursuite du vent, disait Qoheleth.
 

Citation :

et de te faire mousser ?


 
Ca non et d'autant plus que j'ai une femme pour le faire à ma place :D

mood
Publicité
Posté le 02-04-2004 à 19:01:50  profilanswer
 

n°691281
xterminhat​e
Si vis pacem, para bellum.
Posté le 02-04-2004 à 19:47:03  profilanswer
 

DocMaboul, ton exemple de code est-il vraiment plus optimisé que celui de Taz ? Je me pose la question, car je pensais que les compilateurs C++ du moment etaient capable de realiser ce genre d'optimisation seuls....
 
Tout ca me rappelle les techniques d'optimisation anciennes : déroulement des boucles for et Cie.
 
Cordialement,
   xter.

n°691296
Taz
bisounours-codeur
Posté le 02-04-2004 à 20:02:58  profilanswer
 

ça fait juste une instructio incl en plus

n°691300
docmaboul
Posté le 02-04-2004 à 20:08:47  profilanswer
 

xterminhate a écrit :

DocMaboul, ton exemple de code est-il vraiment plus optimisé que celui de Taz ?


 
Oui.
 

Citation :

Je me pose la question, car je pensais que les compilateurs C++ du moment etaient capable de realiser ce genre d'optimisation seuls....


 
Je ne sais pas. Il faudrait jeter un coup d'oeil au source de gcc ou comparer l'assembleur généré avec les deux méthodes en utilisant, au hasard, le msdev. Après, d'expérience, il vaut mieux ne jamais faire confiance à son compilateur. Non pas parce qu'il risque de vous trahir mais parce que vous n'êtes pas marié avec lui.
 

Citation :

Tout ca me rappelle les techniques d'optimisation anciennes : déroulement des boucles for et Cie.


 
Oui bon, ho, ça va. Je suis vieux mais quand même!
 
Bien à vous, c'est l'heure d'aller programmer un plat de lasagnes.

n°691309
Joel F
Real men use unique_ptr
Posté le 02-04-2004 à 20:20:40  profilanswer
 

xterminhate a écrit :


Tout ca me rappelle les techniques d'optimisation anciennes : déroulement des boucles for et Cie.


 
ca se fait encore

n°691320
Profil sup​primé
Posté le 02-04-2004 à 20:40:04  answer
 

Eh bin que de passions !
Bon je reponds en vrac a tout ce que j'ai lu
 
- Poser ce genre de question c pas être programmeur "confirmé" : si on veut mais bon avec les std::string on s'en sort sans avoir ça. Mais bon je te l'accorde, j'ai honte de moi d'ailleurs
- Personne n'a parlé de new char[n] : ca retourne quoi comme type ? char * ou char[] ?
- Pour l'histoire de char[] n'est pas une l-value, j'y avais pas pensé mais ca résume plutot pas mal la différence.
- Sinon un autre truc : dans le cas de char[5] par exemple, le compilateur utilise t il la valeur 5 pour autre chose que la taille à allouer ou alors il alloue et il oublie completement le 5 ?

n°691321
Taz
bisounours-codeur
Posté le 02-04-2004 à 20:48:23  profilanswer
 

- new[] -> T* -> char*
- char t[5] -> sizeof fonctionne parfaitement, comme dit, T[N]  <-> (T, N) constitue un type distinct et tout ça est accessible

n°691331
Profil sup​primé
Posté le 02-04-2004 à 21:03:46  answer
 

ok donc en fait char t[5] et char* t=new char[5] c'est sémantiquement completement différent malgré la ressemblance syntaxique ?
 

n°691335
Profil sup​primé
Posté le 02-04-2004 à 21:16:51  answer
 

Bon je viens d'essayer quelques trucs avec Dev-Cpp, désolé g rien de mieux sous la main...
Et d'apres ce qui a été dit dans ce topic le code suivant ne devrait pas compiler, et pourtant il compile sans erreur ni warning.
 

Code :
  1. void f (char t[8])
  2. {
  3. }
  4. int main()
  5. {
  6.     char * t = new char[64];
  7.     char a [8] ;
  8.     char b [8];
  9.     char c[6];
  10.     a = b;    // ne devrait pas marcher si a n'est pas un l-value
  11.     f(c);     // ne devrait pas marcher si (T,N) est un type distinct
  12.     f(t);     // idem
  13. }


 
edit : ajouté le f(t)


Message édité par Profil supprimé le 02-04-2004 à 21:21:21
n°691337
Ace17
Posté le 02-04-2004 à 21:19:12  profilanswer
 

ben dis donc je savais que les compilos respectaient pas toujours les normes mais a ce point...
 
edit : en tout cas sur mingw ca passe pas... et ca ne m'étonne pas trop ( c'est le "a = b" qui pose probleme )


Message édité par Ace17 le 02-04-2004 à 21:22:38
mood
Publicité
Posté le 02-04-2004 à 21:19:12  profilanswer
 

n°691341
Taz
bisounours-codeur
Posté le 02-04-2004 à 21:27:39  profilanswer
 

bingo, encore perdu pour ton appel de fonction
coment vetu passer un tableau par copie alors que ce n'est pas une l-value ?
 

Code :
  1. #include <iostream>
  2. #include <typeinfo>
  3. template<typename T>
  4. void info(const T &x)
  5. {
  6.   std::cout << x  << ' '
  7.     << &x << ' '
  8.     << typeid(x).name() << '\n'; 
  9. }
  10. void un(int a[10])
  11. {
  12.   info(a);
  13. }
  14. void deux(int a[])
  15. {
  16.   info(a);
  17. }
  18. void trois(int *a)
  19. {
  20.   info(a);
  21. }
  22. template<typename T, size_t N>
  23. void quatre(const T (&a)[N])
  24. {
  25.   info(a);
  26. }
  27. int main()
  28. {
  29.   int a[10];
  30.   info(a); un(a); deux(a); trois(a); quatre(a);
  31.   int b[5];
  32.   info(b); un(b); deux(b); trois(b); quatre(b);
  33. }


 
et oui, un, deux, trois sont autant de notation qui sont équivalentes

n°691342
xterminhat​e
Si vis pacem, para bellum.
Posté le 02-04-2004 à 21:29:47  profilanswer
 

Ca me parait pas naturel ton prototype void f( char t[8] ).... bizarre.

n°691343
xterminhat​e
Si vis pacem, para bellum.
Posté le 02-04-2004 à 21:31:13  profilanswer
 

Ah ben non pas bizarre du tout, effectivement c'est n'importe quoi en fait :)

n°691346
Profil sup​primé
Posté le 02-04-2004 à 21:43:19  answer
 

ouais peut etre que c n'importe quoi, c fait pour
mais en attendant ca compile quand meme
la norme dit que les 4 notations sont tolérées et équivalentes ?
et sinon pour le a=b, c normal que ca compile ?
 
Ace17 -> MinGW c'est gcc non ? et Dev-Cpp aussi je crois.
Moi ca passe avec Dev-Cpp (en mode c++, j'ai pas essayé en c)

n°691348
Taz
bisounours-codeur
Posté le 02-04-2004 à 21:51:57  profilanswer
 

4 notations ?

n°691349
Profil sup​primé
Posté le 02-04-2004 à 21:53:08  answer
 

les protoypes des fonctions un deux trois et quatre

n°691351
Taz
bisounours-codeur
Posté le 02-04-2004 à 22:00:14  profilanswer
 

ben tu vois bien que seul 1,2,3 sont équivalents, et que 4 est radicalement différent ?

n°691368
Profil sup​primé
Posté le 02-04-2004 à 22:07:48  answer
 

quatre il veut pas compiler l'appel à la fonction, il dit no matching function for quatre(int[10])

n°691369
Ace17
Posté le 02-04-2004 à 22:08:27  profilanswer
 

Oualb a écrit :


MinGW c'est gcc non ?


 
oui

n°691371
Taz
bisounours-codeur
Posté le 02-04-2004 à 22:10:38  profilanswer
 

ah ben c'est que t'as un compilo pouri (du moins sa version) ?

n°691384
Profil sup​primé
Posté le 02-04-2004 à 22:27:02  answer
 

gcc version egcs-2.91.57 19980901 (egcs-1.1 release)

n°691389
Taz
bisounours-codeur
Posté le 02-04-2004 à 22:36:08  profilanswer
 

anté déluvien en somme

n°691416
Profil sup​primé
Posté le 02-04-2004 à 23:05:49  answer
 

ouais effectivement j'avais pas fait gaffe que j'avais un  tel dinosaure !
en tout cas merci pour ces infos je me coucherai moins bête ce soir !

n°691447
Profil sup​primé
Posté le 03-04-2004 à 00:13:48  answer
 

y'a encore un petit truc qui me gène :  
dans la fonction info que tu mets dans ton exemple, tu affiches la valeur de x et l'adresse de x.
avec le tableau, comme c'est pas une l-value, il devrait pas pouvoir trouver cette adresse. et pourtant il la trouve et elle a la même valeur que le tableau lui même. Comment ca se fait ? c'est une convention ou ca s'explique logiquement ?

n°691455
xterminhat​e
Si vis pacem, para bellum.
Posté le 03-04-2004 à 00:29:26  profilanswer
 

Il est bien quelque part en mémoire le tableau ;) DOnc & doit bien retourner qqchose...

n°691458
Profil sup​primé
Posté le 03-04-2004 à 00:38:36  answer
 

oui il est quelque part et l'adresse de sa premiere case c'est lui même si on veut
int tab[16] : l'adresse en mémoire c'est tab
mais & tab c'est quoi ? quel type ? quelle valeur ?
à moins que ca soit encore mon vieux gcc qui déconne


Message édité par Profil supprimé le 03-04-2004 à 00:39:05
n°691459
xterminhat​e
Si vis pacem, para bellum.
Posté le 03-04-2004 à 00:43:16  profilanswer
 

A mon sens:
 
1) &tab correspond l'adresse du pointeur vers le tableau
2) & retourne un type pointeur.

n°691470
Profil sup​primé
Posté le 03-04-2004 à 01:13:49  answer
 

y'a pas de pointeur vers le tableau justement
le tableau il existe et a une adresse fixe qui n'est pas ecrite a un endroit de la mémoire, c'est juste le compilo qui la connait et qui la file à ceux qui la veulent, donc il devrait être impossible de récupérer l'adresse de cette adresse.  
C'est comme si tu as int i , &i existe, c'est l'adresse ou est stocké i, mais par contre &(&i) n'existe pas  
 
Taz au secours !

n°691472
Taz
bisounours-codeur
Posté le 03-04-2004 à 01:19:42  profilanswer
 

quoi ? depuis quand on a pas le droit d'avoir un pointeur sur un tableau ?

n°691474
xterminhat​e
Si vis pacem, para bellum.
Posté le 03-04-2004 à 01:24:18  profilanswer
 

-edit : j'arrete de dire des conneries
 
Taz doit dormir des fois... ;)


Message édité par xterminhate le 03-04-2004 à 01:27:52
n°691475
xterminhat​e
Si vis pacem, para bellum.
Posté le 03-04-2004 à 01:24:58  profilanswer
 

Ah non il dort pas !

n°692054
leneuf22
Posté le 04-04-2004 à 09:07:48  profilanswer
 

Mon exemple favori pour montrer la différence entre tableau et pointeur :
 

Code :
  1. // fichier1.c
  2. void f(void);
  3. int t[3];
  4. int main(void) {
  5. t[0] = -1;
  6. f();
  7. return 0;
  8. }


Code :
  1. // fichier2.c
  2. extern int* t;
  3. void f(void) {
  4. int x;
  5. x = *t;
  6. }


 
Et voilà qu'un bug se produit à l'exécution, car le compilateur arrive très bien à faire la différence entre tableau et pointeur, car un tableau n'est pas un objet alors qu'un pointeur, si.


Message édité par leneuf22 le 04-04-2004 à 09:10:06
n°694300
Profil sup​primé
Posté le 07-04-2004 à 00:01:05  answer
 

Taz a écrit :

quoi ? depuis quand on a pas le droit d'avoir un pointeur sur un tableau ?


 
bon admettons qu'on ait un pointeur sur le tableau  
alors pourquoi a-t-il la même valeur que le tableau lui même ?
tab et &tab affichent la même chose quand ils sont envoyés sur cout.

n°694302
Profil sup​primé
Posté le 07-04-2004 à 00:03:05  answer
 

leneuf22 a écrit :

Mon exemple favori pour montrer la différence entre tableau et pointeur :
 

Code :
  1. // fichier1.c
  2. void f(void);
  3. int t[3];
  4. int main(void) {
  5. t[0] = -1;
  6. f();
  7. return 0;
  8. }


Code :
  1. // fichier2.c
  2. extern int* t;
  3. void f(void) {
  4. int x;
  5. x = *t;
  6. }


 
Et voilà qu'un bug se produit à l'exécution, car le compilateur arrive très bien à faire la différence entre tableau et pointeur, car un tableau n'est pas un objet alors qu'un pointeur, si.


 
 
merci j'ai pas besoin qu'on m'explique la différence entre un pointeur et un objet.
si vous lisiez les enoncés comme il faut avant de répondre ca éviterait des réponses inutiles.
 
putain je me tazifie moi a force de trainer ici.

n°694544
_skip
Posté le 07-04-2004 à 11:54:25  profilanswer
 


edit: je suis désolé j ai mal lu ce qui s'était dit avant; sorry


Message édité par _skip le 07-04-2004 à 11:55:32
n°695640
Beegee
Posté le 08-04-2004 à 16:39:46  profilanswer
 

une petite question au passage : une chaîne de caractères constante (chaîne constante et pointeur sur la chaîne constant aussi), ça s'écrit comment ?
 
const char * const mon_pointeur ?
 
il me semble que c'est ce qu'un collègue m'avait fait employer dans du code C++ ;)

n°695642
Taz
bisounours-codeur
Posté le 08-04-2004 à 16:41:32  profilanswer
 

bah c'est du C

n°695649
Beegee
Posté le 08-04-2004 à 16:45:11  profilanswer
 

donc ça s'applique aussi au C++, non ???
 
sinon comment faire en C++ pour êter sûr de définir un pointeur constant sur une chaîne de caractères constante ? :)

n°695659
Taz
bisounours-codeur
Posté le 08-04-2004 à 16:49:24  profilanswer
 

oui

n°698701
Profil sup​primé
Posté le 13-04-2004 à 23:04:33  answer
 

excusez moi mais g pas eu de réponse a ma question Postée le 07-04-2004 à 00:01:05    

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
[C+++] les subtilités. pièges 
Plus de sujets relatifs à : Subtilités entre [] et *


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