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

  FORUM HardWare.fr
  Programmation
  C

  question en C

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

question en C

n°592525
Tgaudlol
Posté le 17-12-2003 à 14:42:36  profilanswer
 

mettre
 
char *str = "phrase1";  
 
est-ce corect?
 
quel sont les defqult de cette initialisation/utilisation?

mood
Publicité
Posté le 17-12-2003 à 14:42:36  profilanswer
 

n°592528
Taz
bisounours-codeur
Posté le 17-12-2003 à 14:45:20  profilanswer
 

non.
const char *str = "phrase1";
 
fait pointer str vers une chaine allouée statiquement. l'écriture sur cette zone est un comportement indéfini, donc pas touche

n°592529
jagstang
Pa Capona ಠ_ಠ
Posté le 17-12-2003 à 14:46:41  profilanswer
 

si tu affecte par la suite un nom plus grand ça va joliment planter
 
[edit] : pire que luky luke le taz


Message édité par jagstang le 17-12-2003 à 14:47:07
n°592532
Tgaudlol
Posté le 17-12-2003 à 14:47:43  profilanswer
 

donc faire
 
int main()
{
char *str="prhase1";
 
printf(str);
}
 
est incorect?
(je sais que dans ce cas faire printf("phrase1" ) est plus rapide mais cest juste la declaration ou je minteroge
 
sinon pourait tu etre plus precis?
 
dans le cas ou je ne veut PAS editer la chaine de caractere?
il vaut mieux faire un malloc?


Message édité par Tgaudlol le 17-12-2003 à 14:48:28
n°592545
HelloWorld
Salut tout le monde!
Posté le 17-12-2003 à 15:16:45  profilanswer
 

"phrase1" est un chaine littérale, stockée en dur dans ton exe (ouvre ton exe avec notepad tu vas la trouver), dans une section de code initialisé généralement en lecture seule. La modifier est donc interdit et fait planter ton prog. C'est pour cela qu'il est préférable de mettre const.
De manire générale, si tu ne veux pas modifier une chaine, ben on met const, c'est mieux.
Par contre ce que je pige pas c'est pourquoi main c'est

Code :
  1. int main( int argc, char ** argv );

et pas

Code :
  1. int main( int argc, const char ** argv );


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°592653
Taz
bisounours-codeur
Posté le 17-12-2003 à 17:59:03  profilanswer
 

parce que c''est canonique, des histoires de spécifications à la con qu'on doit pas changer ce qui a été fait auparavant

n°592699
harrysauce
Miaaaooou!
Posté le 17-12-2003 à 18:46:06  profilanswer
 

tgaudlol a écrit :

donc faire
 
int main()
{
char *str="prhase1";
 
printf(str);
}
 
est incorect?
(je sais que dans ce cas faire printf("phrase1" ) est plus rapide mais cest juste la declaration ou je minteroge
 
sinon pourait tu etre plus precis?
 
dans le cas ou je ne veut PAS editer la chaine de caractere?
il vaut mieux faire un malloc?


Non, le malloc va allouer ta chaine en mémoire, elle sera parfaitement modifiable, donc si tu ne comptes pas la modifier tu peux faire :
 

Code :
  1. const char str[] = "Ta chaine";


Message édité par harrysauce le 17-12-2003 à 18:47:43
n°592706
R3g
fonctionnaire certifié ITIL
Posté le 17-12-2003 à 18:48:36  profilanswer
 

harrysauce a écrit :


Non, le malloc va allouer ta chaine en mémoire, elle sera donc parfaitement modifiable, donc si tu ne comptes pas la modifier tu peux faire :
 

Code :
  1. const char str[] = "Ta chaine";




Code :
  1. const char str[] = {'T', 'a', ' ', 'c', 'h', 'a', 'i', 'n', 'e', '/0'};


Aussi, non ?


---------------
Au royaume des sourds, les borgnes sont sourds.
n°592715
harrysauce
Miaaaooou!
Posté le 17-12-2003 à 18:51:24  profilanswer
 

R3g a écrit :


Code :
  1. const char str[] = {'T', 'a', ' ', 'c', 'h', 'a', 'i', 'n', 'e', '/0'};


Aussi, non ?

Faut vraiment avoir envie de s'emmerder  [:ddr555]

n°592741
Taz
bisounours-codeur
Posté le 17-12-2003 à 19:01:02  profilanswer
 

harrysauce a écrit :

Faut vraiment avoir envie de s'emmerder  [:ddr555]  
const char str[] = {'T', 'a', ' ', 'c', 'h', 'a', 'i', 'n', 'e', '/0'};

 
comme tu dis, si on aime les trucs qui compilent pas...
le const ici, il sert à rien.  
 
Note : pour le développement de Linux, on encourage quand même cela, un tableua, plutot qu'un pointeur -> pointeur = pointeur + mémoire lecture seule (allouée pour toute la durée de l'exécution), tableau  = on gagne la taille du pointeur ( :sol: ) et on encombre pas ad vitam eternam le dit segment.


Message édité par Taz le 17-12-2003 à 19:01:28
mood
Publicité
Posté le 17-12-2003 à 19:01:02  profilanswer
 

n°592919
Tgaudlol
Posté le 17-12-2003 à 22:03:47  profilanswer
 

euh lorsque je fais, char *str = "fille"; et lorsque je fais const char *str = "fille"; mon compilo sort exactement la meme chose
 
a noter que j'ai un warning lorsque je met le "const"

n°592921
Taz
bisounours-codeur
Posté le 17-12-2003 à 22:06:20  profilanswer
 

t'as le warnings quand tu ne le mets pas. ton compilo génère la meme chose oui, le const est là pour lui dire de gueuler si tu tentes de modifier str[i]

n°592924
Tgaudlol
Posté le 17-12-2003 à 22:10:55  profilanswer
 

jai le warning quand je MET const

n°592926
Taz
bisounours-codeur
Posté le 17-12-2003 à 22:16:16  profilanswer
 

ben t'as un compilateur de merde et complètement obsolète. c'est quoi le warning et ton compilo pour savoir?

n°593042
gilou
Modérateur
Modzilla
Posté le 18-12-2003 à 03:55:34  profilanswer
 

tgaudlol a écrit :

mettre
 
char *str = "phrase1";  
 
est-ce corect?
 
quel sont les defqult de cette initialisation/utilisation?
 


 
Chaînes littérales de caractère
À l'origine de C, les chaînes littérales de caractères étaient des tableaux statiques anonymes de caractères, initialisés avec les caractères. Lors de la standardisation de C, le mot clé const a été introduit et les chaînes littérales ont été rendues constantes pour pouvoir être partagées ou mises en mémoire morte. Il aurait donc été logique de donner aux chaînes littérales le type « tableau de caractères constants.» Cependant l'usage suivant était extrêmement répandu :  
 
char t[] = "hello";
char * p = "hello";
Or cet usage aurait causé un avertissement du compilateur à cause de la conversion de const char[] en char[]. Dans le standard ANSI C, les chaînes littérales gardent donc le type char[], bien qu'elles soient considérées constantes.  
(piqué en bas de cette page: http://home.infomaniak.ch/mongenet [...] /hist.html )
 
 
Donc, en resumé:
ces chaines sont constantes, mais pour garder la compatibilité avec l'existant, on ne met pas le modificateur const.
Donc on ne peut pas modifier la chaine.
Par contre, comme il n'y a pas de modificateur const, on peut dereferencer le pointeur et le faire pointer sur une autre chaine quelconque.
 
Taz a raison: pour tout ce qui est du code neuf, il faut employer const:
const char t[] = "hello";
const char * p = "hello";
car on n'a pas les problemes de compatibilité, puisque c'est du code neuf.
 
Notes: le compilo VC 6 de Microsoft est particulierement buggé a ce sujet.
char * p = "toto";
p[2] = 'b';  
ne le gene pas, mais ce qui est grave, c'est que la chaine "toto" en principe constante, est modifiée, comme le montre l'essai avec ceci:
 
char * p = "toto";
char * q = "toto";
p[2] = 'b';  
p et q sont modifiees!!! En effet, le compilo trouvant deux chaines constantes identiques, a fait pointer les deux pointeurs sur la meme zone memoire, en principe non modifiable.
L'effet de bord sur q peut conduire a des bugs particulierement vicieux a elucider.
 
Le support du mot cle const en C par le compilo VC 6 est loin d'etre tres bon, mais au moins, il interdit la modification:
const char * p = "toto";
p[2] = 'b';  
ne passe pas.
 
A+,


Message édité par gilou le 18-12-2003 à 03:56:50

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°593315
gilou
Modérateur
Modzilla
Posté le 18-12-2003 à 12:02:36  profilanswer
 

Un petit up pour que chacun lise le bug du compilo Visual C 6 que je relate dans mon post precedent (mis a 4h du mat, pas l'heure la plus lue...)
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°593335
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 18-12-2003 à 12:19:21  profilanswer
 

énorme ce bug quand meme :/

n°593337
Taz
bisounours-codeur
Posté le 18-12-2003 à 12:21:13  profilanswer
 

Harkonnen a écrit :

énorme ce bug quand meme :/

un bug non-corrigé n'en est plus un, c'est un défaut.
 
Ah j'oubliais, « acheter la nouvelle version »

n°593345
harrysauce
Miaaaooou!
Posté le 18-12-2003 à 12:34:02  profilanswer
 

Taz a écrit :

un bug non-corrigé n'en est plus un, c'est un défaut.
 
Ah j'oubliais, « acheter la nouvelle version »

A l'iut lors d'une démo sous Visual Studio .NET le prof a trouvé un bug encore plus énorme.
 
Il avait écrit un truc du genre :

Code :
  1. for (int i = 0; i < 10; i++){
  2.     //blablabla
  3. }
  4. int i = 1; // Et la il nous dit que ca va planter car i existe déjà


 
Et ben ca passe à la compil!
 
En fait VS.NET créé le i du for dans le registre, et l'autre i dans le tas.....

n°593346
Taz
bisounours-codeur
Posté le 18-12-2003 à 12:35:52  profilanswer
 

[:rofl] quelqu'un pour lui expliquer siouplait

n°593347
harrysauce
Miaaaooou!
Posté le 18-12-2003 à 12:37:48  profilanswer
 

Taz a écrit :

[:rofl] quelqu'un pour lui expliquer siouplait

de quoi?
que c'est pas du C mais du C++?
ca va je sais, mais vu que vous parliez des bugs de visual c++..... :o
 
Après si mon post est faux, je m'en excuse, mais si je me souviens bien, c'était ca.....


Message édité par harrysauce le 18-12-2003 à 12:38:37
n°593348
chrisbk
-
Posté le 18-12-2003 à 12:39:05  profilanswer
 

Taz a écrit :

[:rofl] quelqu'un pour lui expliquer siouplait


 
Nan c'est a toi qu'on va faire un cours [:icon7]
en plus tu va etre content, tu va pouvoir vomir sur VC. Le prof est visiblement un habitué de VC6, et le bug du for fais parti des gros bugs connus de VC6 (sous VC6 le truc aurait beugler)
 
Harry :

Citation :

En fait VS.NET créé le i du for dans le registre, et l'autre i dans le tas.....


 
nan c'est naze comme explication ca :O :D
 

n°593349
Taz
bisounours-codeur
Posté le 18-12-2003 à 12:40:02  profilanswer
 

1) ce code est parfaitement légal en C99 et C++ et l'a toujours été. C'est VC6 qui ne le gérait pas, pour ton prof c'était le coportement standard, et là il s'étonne que du code du plus pur ISO compile ... très fort ...
2) trop forte ton explication, t'as vraiment rien compris à rien

n°593352
harrysauce
Miaaaooou!
Posté le 18-12-2003 à 12:41:22  profilanswer
 

chrisbk a écrit :


 
Nan c'est a toi qu'on va faire un cours [:icon7]
en plus tu va etre content, tu va pouvoir vomir sur VC. Le prof est visiblement un habitué de VC6, et le bug du for fais parti des gros bugs connus de VC6 (sous VC6 le truc aurait beugler)
 
Harry :

Citation :

En fait VS.NET créé le i du for dans le registre, et l'autre i dans le tas.....


 
nan c'est naze comme explication ca :O :D
 
 

Oué mais c'est ce qui se passe :o

n°593353
Taz
bisounours-codeur
Posté le 18-12-2003 à 12:42:10  profilanswer
 

harrysauce a écrit :

Oué mais c'est ce qui se passe :o

[:xp1700] vas y explique nous, on veut des détails

n°593354
chrisbk
-
Posté le 18-12-2003 à 12:43:01  profilanswer
 

harrysauce a écrit :

Oué mais c'est ce qui se passe :o


 
Nan :o
compil en debug et ton explication se petera la gueule

n°593356
harrysauce
Miaaaooou!
Posté le 18-12-2003 à 12:44:47  profilanswer
 

Taz a écrit :

1) ce code est parfaitement légal en C99 et C++ et l'a toujours été. C'est VC6 qui ne le gérait pas, pour ton prof c'était le coportement standard, et là il s'étonne que du code du plus pur ISO compile ... très fort ...
2) trop forte ton explication, t'as vraiment rien compris à rien

Super, merci, t'es pas non plus obligé de me prendre de haut [:spamafote]  
 
 
Plutot de me dire que je suis qu'une merde et que j'y connais rien à rien, explique moi depuis quand, et surtout pourquoi on peut déclarer 2 variables ayant le même nom!
 
Ensuite c'est pas parce que mon exemple est bidon que je comprends rien à rien, je ne fait que remettre l'exemple à partit duquel c'est parti lors de la démo....

n°593357
Taz
bisounours-codeur
Posté le 18-12-2003 à 12:46:01  profilanswer
 

harrysauce a écrit :

Plutot de me dire que je suis qu'une merde et que j'y connais rien à rien, explique moi depuis quand, et surtout pourquoi on peut déclarer 2 variables ayant le même nom!

depuis toujours en C et C++, pourvu qu'elles n'aient pas la même portée

n°593358
harrysauce
Miaaaooou!
Posté le 18-12-2003 à 12:46:08  profilanswer
 

chrisbk a écrit :


 
Nan :o
compil en debug et ton explication se petera la gueule

Ben c'est justement en passant en debug qu'on avait vu qu'il y en avait un dans le registre et l'autre dans le tas, après comme je l'ai déjà dit, p'tet que je me suis trompé dans mon exemple, ca fait un p'tit moment qu'on l'a vu, mais il me semble que c'était ca.

n°593359
chrisbk
-
Posté le 18-12-2003 à 12:46:34  profilanswer
 

harrysauce a écrit :


Plutot de me dire que je suis qu'une merde et que j'y connais rien à rien, explique moi depuis quand, et surtout pourquoi on peut déclarer 2 variables ayant le même nom!


 
question de "scope"
genre  

Code :
  1. void toto()
  2. {
  3. int a;
  4. int a;
  5. }


 
illegal
par contre
 
 

Code :
  1. void toto()
  2. {
  3. int a;
  4. {
  5. int a;
  6. }
  7. }


legal
 
le i de la boucle est declaré a l'interieur de la boucle (et n'est donc pas visible a l'exterieur)
 
 
 
 
 
 
 
 

n°593360
Taz
bisounours-codeur
Posté le 18-12-2003 à 12:46:39  profilanswer
 

[:rofl]

n°593361
chrisbk
-
Posté le 18-12-2003 à 12:47:16  profilanswer
 

harrysauce a écrit :

Ben c'est justement en passant en debug qu'on avait vu qu'il y en avait un dans le registre et l'autre dans le tas, après comme je l'ai déjà dit, p'tet que je me suis trompé dans mon exemple, ca fait un p'tit moment qu'on l'a vu, mais il me semble que c'était ca.


 
ca m'etonnerait, en debug VC ne stocke rien dans les registres (enfin, d'une expression a une autre)
 
quoiqu'il soit le code generé n'a rien a voir la dedans

n°593362
Taz
bisounours-codeur
Posté le 18-12-2003 à 12:47:29  profilanswer
 

voir même

Code :
  1. if(int i=foo())
  2. {
  3.   doSOmething(i);
  4. }

:sol:

n°593364
Taz
bisounours-codeur
Posté le 18-12-2003 à 12:48:00  profilanswer
 

chrisbk a écrit :


 
ca m'etonnerait, en debug VC ne stocke rien dans les registres (enfin, d'une expression a une autre)
 
quoiqu'il soit le code generé n'a rien a voir la dedans

registre, tas ... tout est dans la pile :o

n°593366
harrysauce
Miaaaooou!
Posté le 18-12-2003 à 12:48:32  profilanswer
 

Taz a écrit :

depuis toujours en C et C++, pourvu qu'elles n'aient pas la même portée

t'es en train de dire qu'une variable i déclarée pour (pas dans) le for n'est plus accessible après le for?????
 
On m'aurait menti?
 
Nan, parce que ca fait 3 ans qu'on me dit l'inverse!

n°593369
chrisbk
-
Posté le 18-12-2003 à 12:49:13  profilanswer
 

Taz a écrit :

registre, tas ... tout est dans la pile :o


 
hein ?

n°593370
harrysauce
Miaaaooou!
Posté le 18-12-2003 à 12:49:26  profilanswer
 

chrisbk a écrit :


 
question de "scope"
genre  

Code :
  1. void toto()
  2. {
  3. int a;
  4. int a;
  5. }


 
illegal
par contre
 
 

Code :
  1. void toto()
  2. {
  3. int a;
  4. {
  5. int a;
  6. }
  7. }


legal
 
le i de la boucle est declaré a l'interieur de la boucle (et n'est donc pas visible a l'exterieur)
 
 
 
 
 
 
 
 
 

je sais bien, merci
sauf que dans l'exemple au dessus mon i n'est pas déclaré DANS le for.......

n°593372
Taz
bisounours-codeur
Posté le 18-12-2003 à 12:50:14  profilanswer
 

welcome to the real world.
 
merci MS ...


Message édité par Taz le 18-12-2003 à 12:50:23
n°593373
chrisbk
-
Posté le 18-12-2003 à 12:50:14  profilanswer
 

harrysauce a écrit :

je sais bien, merci
sauf que dans l'exemple au dessus mon i n'est pas déclaré DANS le for.......


 
si, c'est ca la grosse feinte

n°593375
harrysauce
Miaaaooou!
Posté le 18-12-2003 à 12:52:13  profilanswer
 

chrisbk a écrit :


 
si, c'est ca la grosse feinte

Bon ben on m'a raconté des cracks pendant 3 ans alors  :??:
 
EDIT : on m'avait toujours dit qu'une variable déclarée pour une boucle (for(int i =0...)) était encore déclarée même après le for....


Message édité par harrysauce le 18-12-2003 à 12:53:47
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  question en C

 

Sujets relatifs
[JAVA] Question simple sur l'analyse XML[C++/DLL] Question existentiellement conceptuelle : DLL "persistante"
question de debutant sur JAVACC[JVM] question JVM/context
Question a la con... comme d'hab...Question supreme de l'absolu
[CSS] question sur <span>[JS] Une question a propos d'un roll over
question bete sur les variables globalesquestion sur la methode post.
Plus de sujets relatifs à : question en C


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