Langage C
Discutez d'informatique ici !
-
Rockleader
- Habitué(e)
- Messages: 2126
- Enregistré le: 11 Oct 2011, 18:42
-
par Rockleader » 09 Juin 2014, 16:51
Cliffe a écrit:Il veut un type apparemment.
Un type ou n'importe quelle méthode qui ferait cela serait bien^^
joel que ferait ta procédure read_value ?
Elle retournerait une constante, mais comment tu ferait en sorte que le nombre entré par l'utilisateur soit ce const ?
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !
-
Cliffe
- Membre Rationnel
- Messages: 967
- Enregistré le: 12 Juin 2012, 13:25
-
par Cliffe » 09 Juin 2014, 17:15
- Code: Tout sélectionner
int read_value() {
return 10;
}
int main() {
const int x = read_value();
x = x + 1; // erreur
return 0;
}
-
joel76
- Membre Relatif
- Messages: 230
- Enregistré le: 11 Fév 2013, 15:31
-
par joel76 » 09 Juin 2014, 17:24
Rockleader a écrit:Un type ou n'importe quelle méthode qui ferait cela serait bien^^
joel que ferait ta procédure read_value ?
Elle retournerait une constante, mais comment tu ferait en sorte que le nombre entré par l'utilisateur soit ce const ?
Ce code fonctionne correctement chez moi, répond-il à ce que tu cherches ?
- Code: Tout sélectionner
#include
#include
#include
typedef const long get_value(void *);
typedef void set_value(void *);
typedef struct
{
long val;
int flag;
set_value *set;
get_value *get;
} constant_value;
// fixe la valeur de l'argument
void my_set_value(void *arg)
{
constant_value *ptr = (constant_value *)arg;
char buf[255] = {0};
if (ptr->flag == 0)
{
printf("Donnez la valeur : ");
fgets(buf, sizeof(buf), stdin);
ptr->val = strtol(buf, NULL, 10);
ptr->flag = 1;
}
}
// obtient la valeur de l'arguemnt
const long my_get_value(void *arg)
{
return ((constant_value *)arg)->val;
}
int main()
{
constant_value cv = {0, 0, my_set_value, my_get_value};
cv.set(&cv);
printf("valeur 1 : %lu \n", cv.get(&cv));
cv.set(&cv);
printf("valeur 2 : %lu \n", cv.get(&cv ));
_getch();
return 0;
}
EDIT j'ai un peu modifié le code de manière à n'avoir qu'un seul argument pour les fonction get/set.
Suppression d'un fflush(stdin) au comportement indéfini
-
Rockleader
- Habitué(e)
- Messages: 2126
- Enregistré le: 11 Oct 2011, 18:42
-
par Rockleader » 10 Juin 2014, 00:50
Cliffe a écrit:- Code: Tout sélectionner
int read_value() {
return 10;
}
int main() {
const int x = read_value();
x = x + 1; // erreur
return 0;
}
Je ne l'ai pas testé, mais si ça marche c'est exactement ce à quoi je pensais.
C'est juste manière d'écrire plus proprement le code.
En fait tu transforme un type int en cons int.
J'essaierais le morceau de code avec un scanf dans un exemple plus tard.
Merci à vous deux.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !
-
Cliffe
- Membre Rationnel
- Messages: 967
- Enregistré le: 12 Juin 2012, 13:25
-
par Cliffe » 10 Juin 2014, 08:08
tu peux créer ton const n'importe où dans le code :
- Code: Tout sélectionner
int main() {
int x;
for (int i = 0; int < 10; ++i)
x = rand() % 100;
const int y = x;
++y; // erreur
return 0;
}
-
ampholyte
- Membre Transcendant
- Messages: 3940
- Enregistré le: 21 Juil 2012, 07:03
-
par ampholyte » 10 Juin 2014, 08:13
Bonjour,
Cliffe a écrit:tu peux créer ton const n'importe où dans le code :
- Code: Tout sélectionner
int main() {
int x;
for (int i = 0; int < 10; ++i)
x = rand() % 100;
const int y = x;
++y; // erreur
return 0;
}
Note à Rockleader : Attention tout de même au scope quand tu déclares tes variables au cours de ton code.
-
Rockleader
- Habitué(e)
- Messages: 2126
- Enregistré le: 11 Oct 2011, 18:42
-
par Rockleader » 10 Juin 2014, 13:25
Au scope ? :hum:
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !
-
ampholyte
- Membre Transcendant
- Messages: 3940
- Enregistré le: 21 Juil 2012, 07:03
-
par ampholyte » 10 Juin 2014, 13:39
Voici un exemple :
- Code: Tout sélectionner
int main(void) {
int toto = 0;
for (int i = 0; i < 5; i++) {
toto += i;
int tata = i;
}
printf("toto = %d\n", toto);
printf("tata = %d\n", tata); /* Erreur lors de la compilation : tata undeclared
return (0);
}
Lorsque tu déclares une variable elle est valable tant qu'elle est comprise entre les accolades la plus proche.
Par exemple ici, toto est valable uniquement pour la fonction main et tata uniquement pour la boucle for. C'est à dire que tata est détruite à la fin de la boucle for et toto est détruit à la fin de la fonction (main ici).
Si tu veux utiliser tata en dehors de la boucle, il faut déclarer tata en dehors de la boucle.
Ce qu'on appelle le scope c'est la portée des variables.
-
Rockleader
- Habitué(e)
- Messages: 2126
- Enregistré le: 11 Oct 2011, 18:42
-
par Rockleader » 10 Juin 2014, 15:30
Ok, c'est juste que je comprenais pas le sens du mot^^mais pas de soucis là dessus ;)
Merci !
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !
-
lulubibi28
- Membre Relatif
- Messages: 240
- Enregistré le: 10 Nov 2013, 11:18
-
par lulubibi28 » 12 Juin 2014, 10:16
Donc tu dois déclarer la variable tata juste aprés toto sinon il y'a un masquage de variable ou scope .
Mais tu essayes de faire quoi avec cette fonction main()?
-
ampholyte
- Membre Transcendant
- Messages: 3940
- Enregistré le: 21 Juil 2012, 07:03
-
par ampholyte » 12 Juin 2014, 12:56
lulubibi28 a écrit:Donc tu dois déclarer la variable tata juste aprés toto sinon il y'a un masquage de variable ou scope .
Mais tu essayes de faire quoi avec cette fonction main()?
Moi ? Rien de spécial c'était simplement un exemple pour Rockleader pour expliquer ce qu'était le scope.
-
lulubibi28
- Membre Relatif
- Messages: 240
- Enregistré le: 10 Nov 2013, 11:18
-
par lulubibi28 » 14 Juin 2014, 15:44
ampholyte a écrit:Moi ? Rien de spécial c'était simplement un exemple pour Rockleader pour expliquer ce qu'était le scope.
Rockleader connait vraisemblablement l'objectif de la fonction mais toi , est-ce que tu as saisi son rôle ?
-
fatal_error
- Membre Légendaire
- Messages: 6610
- Enregistré le: 22 Nov 2007, 12:00
-
par fatal_error » 14 Juin 2014, 16:34
Donc tu dois déclarer la variable tata juste aprés toto sinon il y'a un masquage de variable ou scope .
non.
c'est pas un masquage de variable.
ps, pdt que j'y suis
Rockleader connait vraisemblablement l'objectif de la fonction mais toi , est-ce que tu as saisi son rôle ?
quelque part, on s'en tamponne du role de la fonction vu que c'est une question technique concernant la portée de variable.
la vie est une fête

-
ampholyte
- Membre Transcendant
- Messages: 3940
- Enregistré le: 21 Juil 2012, 07:03
-
par ampholyte » 14 Juin 2014, 16:43
lulubibi28 a écrit:Rockleader connait vraisemblablement l'objectif de la fonction mais toi , est-ce que tu as saisi son rôle ?
Je pense que j'ai bien saisi son rôle vu que c'est un exemple que j'ai écris pour aider Rockleader.
Je faisais simplement une remarque sur la citation suivante :
Cliffe a écrit:tu peux créer ton const n'importe où dans le code :
en prévenant simplement rockleader qu'on peut créer des variables n'importe où mais qu'il faut faire attention à leur portée.
-
Rockleader
- Habitué(e)
- Messages: 2126
- Enregistré le: 11 Oct 2011, 18:42
-
par Rockleader » 14 Juin 2014, 16:47
Du moment que l'on sait qu'une variable est connu seulement dans les accolades les plus proches c'est bon^^
Au final un truc comme ça compilera
- Code: Tout sélectionner
int main()
{
if..
{
int k=0
}
//ici k n'est plus connu
if
{
int k=1;
}
//ici k n'est plus connu
}
Sauf si j'ai rien compris c'est ça un scope ^^
Pour ce que je veux faire je pense qu'un truc comme ça marchera parfaitement.
- Code: Tout sélectionner
const int Number(int N)
{
return (const int) N;
}
int main()
{
int nb;
const int NB;
scanf("%d",&nb);
NB=Number(nb);
//et ici NB ne pourra plus être modifié
}
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !
-
ampholyte
- Membre Transcendant
- Messages: 3940
- Enregistré le: 21 Juil 2012, 07:03
-
par ampholyte » 14 Juin 2014, 16:50
Bonjour,
C'est tout à fait ça. Je sais que tu as parfaitement compris, j'essaye juste de comprendre ce que lulubibi28 essaye de me dire ^^"
-
fatal_error
- Membre Légendaire
- Messages: 6610
- Enregistré le: 22 Nov 2007, 12:00
-
par fatal_error » 14 Juin 2014, 16:53
Pour ce que je veux faire je pense qu'un truc comme ça marchera parfaitement.
j'en doute!
- Code: Tout sélectionner
const int NB;
[COLOR=Green]//et ici NB ne pourra plus être modifié[/COLOR]
scanf("%d",&nb);
[COLOR=Red]NB=Number(nb);[/COLOR]
la vie est une fête

-
Rockleader
- Habitué(e)
- Messages: 2126
- Enregistré le: 11 Oct 2011, 18:42
-
par Rockleader » 14 Juin 2014, 16:59
fatal_error a écrit:j'en doute!
- Code: Tout sélectionner
const int NB;
[COLOR=Green]//et ici NB ne pourra plus être modifié[/COLOR]
scanf("%d",&nb);
[COLOR=Red]NB=Number(nb);[/COLOR]
Hum oui pas faux, j'ai oublié qu'en le créant il avait déjà une valeur par défaut même non initialisé.
Du coup
cons int NB=Number(nb); //suffit de le déclarer avant la fonction pour affecter

Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !
-
joel76
- Membre Relatif
- Messages: 230
- Enregistré le: 11 Fév 2013, 15:31
-
par joel76 » 14 Juin 2014, 17:09
Rockleader a écrit:Du moment que l'on sait qu'une variable est connu seulement dans les accolades les plus proches c'est bon^^
Sauf si j'ai rien compris c'est ça un scope ^^
Ben le scope d'une varialbe (ou portée de la variable en bon français) c'est presque ça : le bloc dan lequel cette variable est déclarée.
Le const me semble être un peu du "pipeau" en C, Haskell lui posséde vraiment des types constant ("immutable" je crois) .
-
lulubibi28
- Membre Relatif
- Messages: 240
- Enregistré le: 10 Nov 2013, 11:18
-
par lulubibi28 » 14 Juin 2014, 17:12
Ok! Je suis mal barrée pour saisir ton code @Rockleader .
Par contre , j'ai lu quelques parts que "scope" et le masquage de variable ont un lien étroit , mais ceci dépend du code bien évidemment ( en rapport avec le langage python qui ressemble au langage C )
@ampholyte Justement , c'est surement la portée des variables qui n'est pas claire dans ma tête . Dans un exo , j'ai du écrire un long code mais on m'a dit qu'il y'avait un masquage de variable . J'ai cherché sur Gogole mais pas de réponses concrètes .Et j'ai perdu le lien url (en anglais) que m'avait donné quelqu'un sur ce bidule :mur:
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 4 invités