bonjour;
j'ai quelques questions a poser:
1-quelle est l'espace memoire occupé par le type enum
2-Pourquoi ce code ne marche pas:
3-dans quels cas on fait alignement de donnéesCode:
1
2
3
4
5 char *f() { char tab[4]="txt"; return tab; }
merci
Version imprimable
bonjour;
j'ai quelques questions a poser:
1-quelle est l'espace memoire occupé par le type enum
2-Pourquoi ce code ne marche pas:
3-dans quels cas on fait alignement de donnéesCode:
1
2
3
4
5 char *f() { char tab[4]="txt"; return tab; }
merci
Le meme qu'un int.
Parce que tu retournes un pointeur sur une zone memoire allouee automatiquement (alias la pile). Cette zone est liberee a la fin de la fonction.Citation:
2-Pourquoi ce code ne marche pas:
Code:
1
2
3
4
5 char *f() { char tab[4]="txt"; return tab; }
Tu n'as normalement pas a t'en occuper, le compilateur s'occupe de faire ca quand c'est necessaire pour la cible.Citation:
3-dans quels cas on fait alignement de données
merci
a ma connaissance le retour des fonctions est gardé dans la pile?Code:Cette zone est liberee a la fin de la fonction.
Tu as ecrit
Enorme erreur !!!!!!!!!!!!!!!!!!Citation:
Code:
1
2
3
4
5
6
7
8
9 char *f() // tu defins ta fonction ... peut etre ajouter void entre la parenthese suivant // le compilateur ou l'extension du fichier { char tab[4]="txt"; // une chaine de 4 dans une chaine de 4 return tab; // A priori tu renvoies un pointeur de chaine mais attention // tu as defini une chaine de 4 .. Attention au compilateur }
C'est l'erreur typique du C !!!
Sauf que !!!
tab n'existe que pendant l'appel de ta fonction !!!!!!!!!
Tu dois faire un truc du styleCode:
1
2
3
4
5 char * ch; ch=f(); // Ch pointe sur tab // f est fermee ... tab variable locale a f N'EXISTE PLUS //
et dans le progCode:
1
2
3
4
5
6
7
8 char ch[500]=""; // tu cree ta chaine avec de la place !!! void f(char * ch1) { char * txt="txt"; strcpy(ch1,txt); } ....
[-mod- Merci d'apprendre à utiliser le forum correctement (citations, balises code...) Tout est expliqué dans les règles du forum.]Code:
1
2
3 ... f(ch); ch vaut alors "txt"
La valeur oui.
Tu retournes la valeur d'un pointeur, qui pointe sur une adresse mémoire.
Cette valeur d'adresse existe toujours, tu y as accès. Mais la zone que tu avais allouée, elle, a été libérée, tu n'as donc plus accès aux valeurs.
J'espère avoir été suffisament clair ^^
PS : La balise CODE ! Nondidjiu !
NON, c'est une erreur typique à ne pas faire.Citation:
a ma connaissance le retour des fonctions est gardé dans la pile?
http://c.developpez.com/faq/c/?page=..._string_return
1) enum ... j'ai vu ... je connais pas
ce serait pas des trucs un peu comme des tableaux ???
plutot pratique dans des boucles ?
J'utilse pas ... mais j'ai deja vu
3) Tu parles d'indentement ?
Tous est affaire de convention
Tu peu ecrire comme tu veux seul la lisibilité compte
Les compilateur ignorent les espaces et saut de ligne
En fait ton programme pour le compilateur est ... sur une seule ligne
J'utilise une convention ancienne :
La convention moderne est plutot du style je croisCode:
1
2
3
4
5
6
7 void f(void) { if (0==0) { ... } }
En regle general ... Utilise un indentement de 2 ou 3 caracteres maxiCode:
1
2
3
4
5 void f(void) { if (0==0) { ... } }
si tu utilise des tabulations ... 4 if imbriques et tu vois plus ton code ...
Mais bon ... pour les if a rallonge
je fais plutot un truc du style
cela evite les indentation a rallonge ... Et ca rallonge pas le temps d'executionCode:
1
2
3
4
5
6
7
8
9
10
11
12 ok=1; if (ok) if ( ) // negation de ta condition 1 ok=0; if (ok) if ( ) // negation de ta condition 2 ok=0; .... if (ok) { ACTION !!! }
Et cela permet de rajouter un if sans indenter !!!
De maniere generale... Trouve des regles qui te plaisent ... Plutot elegantes
Et tiens toi y... Tu pourras relire tes programmes
Et si tu travailles avec des copains ... Essaie de te diriger vers leur convention...
Cela evitera des tensions
Il est clair que je ne suis pas qualifie pour ca.
J'ai dit ... j'ai vu
J'utilise pas
...
Parce que c'est d'un interet reduit
Alors j'ai regardé a nouveau
Enum c'est un ensemble fini de variables entieres
definie par des constants de type int
Cela permet de definir une variable parmi par exemple {1, 25, 78}
ou 1 25 78 sont des constantes interpertees par le compilateur
Donc en reponse ... c'est du type int.
A quoi ca sert ? ... a mon avis pas agrand chose ... sauf si on sait mettre ces donnees successivement dans une boucle..
Peut etre eclairer le programme en faisant :
enum couleur {rouge = 1, bleu = 25, vert=78};
A moins que le compilateur n'autorise pas la comparaison entre un entier et un enum.
Alors cela permettrait de verifier que le code ne sort jamais de rouge vert et bleu mais cela interdirait l'affectation d'une variable entier avec un enum.
Enfin, si ... En pascal dans mes souvenir y'avait une notion d'ensemble
Cela pourrait servir dans un truc du style en C
... Maintenant pourquoi je suis passe devant sans jamais regarder certain type d'instruction...Code:
1
2
3
4
5
6
7 int a; if (a in couleur) { // la ca evite un teste en boucle et ca c'est valable !!! // auquel cas je presenterai d'humbles excuses. // Mais c'est pas pour ca que je l'utiliserai un jour }
Y'a un truc qui s'appelle la theorie des langages qui dit la choses suivante
Quel est le meilleur mixte entre un langage possedant beaucoup de termes et un langage faisant les phrases les plus longues (car peut de mot)
Eh bien la reponse est ... 2.718 mots
Autrement dit, la multiplication des notions nuit a la comprehension.
Donc comme une notion comme enum existe et peut etre remplacee...
Je vous conseille ... De ne pas l'utiliser ... Car c'est un truc probablement marginal
En gros, c'est mon avis,moins vous utilisez de type d'instruction, mieux vous comprendrez vos programmes ...
Excusez moi ... je m'emporte
Ouh là quel tissu d'âneries.
Je crois que tu n'aurais pas dû te vexer de la remarque d'Emmanuel. Si tu ne savais pas ce qu'était qu'un enum et à quoi ça servait (et apparemment tu ne le sais toujours pas), tu n'aurais pas dû apporter de réponse.
cf règle 4.12 du forum
Il faut parfois faire profil bas plutôt que de s'emporter.Citation:
Par contre vous n'êtes pas les bienvenus pour vous mêler de tout, donner votre avis sans aucun intérêt sur des domaines que vous ne connaissez pas, relayer les délires de [certains] professeurs, nous polluer la vie avec des langages de programmation dont tous le monde se fiche, donner votre avis sur des langages ou des outils que vous ne connaissez pas, nous donner des ordres sur la façon de gérer le forum ou le site, etc.
C'est très pratique pour définir des codes d'erreur. Et puis, il s'agit de la méthode recommandée pour définir des constantes entières.
Là, je vois pas trop ce que tu veux dire...
Il ne faut tout de même pas raconter n'importe quoi. Et la gestion des erreurs (Ce n'est pas la seule utilité des énumérations)?
En ce qui concerne la multiplication des notions, le langage C est un langage très compact, mais très pointu. Certains disent que c'est un langage réservés aux spécialistes. Si tu peux te passer d'énumérations dans tes programmes d'une centaine de lignes, dans les miens je n'y arrive pas. Personne ne t'oblige à utiliser des énumérations, mais de là à conseiller de ne pas les utiliser...
Thierry
Je sais pas ...
Donnez un exemple
Ou vous utilisez cette merveille
Ok
Le shell ... c pas mon truc...
Mais ce que tu ecris ...
C'est l'enumeration des enum dans ton code me semble t il
Autrement dit par convention ... les enum definissent des codes d'erreur chez toi.
C'est une convention ...
Pratique pour la recherche des erreurs dans votre code?
Je reconnais ... que la gestion des erreurs est compliquee
Mais que mets tu au bout de l'erreur citee plus haut ...
Je ne comprends pas
Y'a t il un message ?
En résumé, il re dis que dans la totalité de ses .h se trouvent 732 déclas d'enum.
Nombre qu'il serait bon de ponderer avec un nombre de .h, mais qui reste imposant.
Personnellement, je n'utilise que très rarement les enum, mais c'est plus par lubie personnelle qu'autre chose.
C'est un type particulièrement interressant dans bien des cas, erreur certes, mais aussi switch, etc.
On a assez polemiqué.
Pour le switch je peux comprendre ...
L'elegance veut qu'on prefere
case couleur_rouge
à case 26
si le c
permet de faire un truc du style
enum couleur {rouge ,vert , bleu }
...
Ensemble de couleur
et de faire un case
avec
case couleur ... // signifiant rouge vert ou bleu
Ca c'est royal
Alors oui , il est clair que enum , c'est du costaud ...
J'ai tord , et je la ramenerai plus ... sur enum
Et peut etre meme que je m'en servirai
Plus costaud que cela encore. J'imagine que tu utilises des #define dans ton code, n'est-ce pas ? On peut voir les enums comme des define ameliores, avec notamment trois proprietes interessantes:Citation:
Envoyé par e_gaillard37
- les valeurs sont attribuees automatiquement (mais restent personnalisables s'il le faut);
- les constantes enumerees ont le type int;
- les constantes enumerees respectent les portees de bloc.
L'un des usages que je prefere est de definir des identificateurs internes associe a des messages (ou a tout autre chose):
avec le fichier messages.txt:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 ... #define MESSAGE(id, ms) ID_##id, typedef enum { #include "messages.txt" NB_MESSAGE } t_ids; #undef MESSAGE ... #define MESSAGE(id, ms) ms, char const *message[] = { #include "messages.txt" }; #undef MESSAGE
Citation:
MESSAGE(ONE, "This is the first message.")
MESSAGE(TWO, "This is the second message.")
Bon tu definis ta macro...
tu remplis ton brave fichier message .txt
dans ton code
tu mets quoi ?
ch ... chaine.
tu as ton erreur...
La je comprends rien.Code:
1
2 if (err) message( ten, ch ) ??