C : plusieurs noms pour une même variable
Fermé
benoitg
-
19 nov. 2008 à 16:35
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 - 21 nov. 2008 à 11:17
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 - 21 nov. 2008 à 11:17
7 réponses
mype
Messages postés
2435
Date d'inscription
jeudi 1 novembre 2007
Statut
Membre
Dernière intervention
16 août 2010
436
19 nov. 2008 à 16:37
19 nov. 2008 à 16:37
faut utiliser typedef
typedef type nouveau_type;
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
19 nov. 2008 à 16:37
19 nov. 2008 à 16:37
Salut,
Avec des define?
Avec des define?
En fait je pense avoir trouvé tout seul :
#define Buzzer RC2
Ca compile en tout cas..
#define Buzzer RC2
Ca compile en tout cas..
Salut
ton #define buzzer RC2 va remplacer tout tes buzzer par RC2 à la compilation donc ce sera seulement peut etre plus compréhensible mais je dirais pas que c'est portable
tu peux très bien faire comme l'exemple qu'on t as donnée en C++ seulement en C la reference n'existe pas et il me semble que ca en est, par contre tu peux utiliser les pointeur seulement pour initialiser au début :
int buzzer;
&buzzer = &RC2;
si c'est une compilation croisée et que ton RC2 est déclaré dans un autre fichier C
tu as juste a ajouter
extern int RC2;
ton #define buzzer RC2 va remplacer tout tes buzzer par RC2 à la compilation donc ce sera seulement peut etre plus compréhensible mais je dirais pas que c'est portable
tu peux très bien faire comme l'exemple qu'on t as donnée en C++ seulement en C la reference n'existe pas et il me semble que ca en est, par contre tu peux utiliser les pointeur seulement pour initialiser au début :
int buzzer;
&buzzer = &RC2;
si c'est une compilation croisée et que ton RC2 est déclaré dans un autre fichier C
tu as juste a ajouter
extern int RC2;
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
>
Pierre Richard
20 nov. 2008 à 10:44
20 nov. 2008 à 10:44
&buzzer = &RC2;
ça ne devrais pas compiler, tu ne peux pas modifier l'adresse d'une telle variable normalement.
Sinon, tu peux utiliser une fonction pour la lecture : int buzzer(){return RC2;}
en C++, tu pourrai faire en lecture écriture avec int& buzzer(){return RC2;}
Je ne comprends pas pourquoi il n'y a pas ce passage par référence en C alors que c'est le cas dans les autre langages (C++, pascal, Fortran), bien qu'il est clair que c'est plus rigoureux en C (en effet, sinon comment savoir si f(x) modifie ou non x ?).
ça ne devrais pas compiler, tu ne peux pas modifier l'adresse d'une telle variable normalement.
Sinon, tu peux utiliser une fonction pour la lecture : int buzzer(){return RC2;}
en C++, tu pourrai faire en lecture écriture avec int& buzzer(){return RC2;}
Je ne comprends pas pourquoi il n'y a pas ce passage par référence en C alors que c'est le cas dans les autre langages (C++, pascal, Fortran), bien qu'il est clair que c'est plus rigoureux en C (en effet, sinon comment savoir si f(x) modifie ou non x ?).
_Pierre_Richard_
Messages postés
11
Date d'inscription
jeudi 20 novembre 2008
Statut
Membre
Dernière intervention
5 janvier 2011
>
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
20 nov. 2008 à 11:14
20 nov. 2008 à 11:14
Dsl Char Sniper a raison, tu peux pas faire, il y a en effet une erreur a la compilation
&buzzer = &RC2;
il faut déclarer buzzer en pointeur par ex :
int RC2;
int * buzzer = &RC2;
mais apres il faut ecrire *buzzer a chaque fois que tu veux utiliser/modifier la valeur et non le pointeur
*buzzer = 10;
printf("buzzer = %d", *buzzer);
Ben en C il y a les pointeur est c tout f(x) ne modifie pas la variable x a moins que ce soit un pointeur et qu'il modifie x dans f bien sur. car on peut passer des pointeurs pour gagner de la place sans pr autant modifier x. Apres on peux expliciter qu'on ne modifie pas la variable avec const ...
&buzzer = &RC2;
il faut déclarer buzzer en pointeur par ex :
int RC2;
int * buzzer = &RC2;
mais apres il faut ecrire *buzzer a chaque fois que tu veux utiliser/modifier la valeur et non le pointeur
*buzzer = 10;
printf("buzzer = %d", *buzzer);
Ben en C il y a les pointeur est c tout f(x) ne modifie pas la variable x a moins que ce soit un pointeur et qu'il modifie x dans f bien sur. car on peut passer des pointeurs pour gagner de la place sans pr autant modifier x. Apres on peux expliciter qu'on ne modifie pas la variable avec const ...
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
19 nov. 2008 à 16:53
19 nov. 2008 à 16:53
En C++, c'est sur ça fonctionne, il faut déclarer ainsi (à toi de tester)
double &buzzer=RC2;
double &buzzer=RC2;
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
19 nov. 2008 à 17:09
19 nov. 2008 à 17:09
ba non justement, tu gère buzzer ! C'est un vrai alias.
j'ai mis un & et pas un * !
j'ai mis un & et pas un * !
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
19 nov. 2008 à 17:18
19 nov. 2008 à 17:18
Mais je ne suis pas sûr que le C++ soit génial pour un microcontrolleur. Enfin, encore que...
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
>
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
20 nov. 2008 à 08:29
20 nov. 2008 à 08:29
Ce que je disais, c'est que j'avais des doutes sur la compatibilité C de cette déclaration, mais si tu dit que c'est réservé au C++, alors il ne faut pas l'utiliser.
C'est la seule procédure que je vois pour contrôler l'adresse d'une variable non alloué avec new. Le #define est une solution, mais pas très propre, les macros entraînes des erreurs à la con, et il vaut mieux les éviter au maximum !
C'est la seule procédure que je vois pour contrôler l'adresse d'une variable non alloué avec new. Le #define est une solution, mais pas très propre, les macros entraînes des erreurs à la con, et il vaut mieux les éviter au maximum !
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
>
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
20 nov. 2008 à 11:02
20 nov. 2008 à 11:02
En fait oui le define est la seule solution à son problème. Les références n'existent pas en C.
Donc rien à faire sinon du crade.
Donc rien à faire sinon du crade.
benoitg
>
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
20 nov. 2008 à 12:07
20 nov. 2008 à 12:07
Merci pour votre aide sur le sujet.
Pour info je reste avec mon #define qui marche niquel. Je n'avais jamais entendu que ce n'était pas propre et au contraire. Dans l'embarqué c'est très utilisé et ça permet de gagner énormément de temps quand un paramètre change. Et puis ça ne m'a jamais posé de problème de compilation avec mplab ou codewarrior par exemple.
Et la dans mon cas précis ça facilitera belle et bien la portabilité puisqu'il suffira de remplacer RC2 par le nouveau port si je change de plateforme.
Et dernier point ça améliore grandement la lisibilité.
A+
Pour info je reste avec mon #define qui marche niquel. Je n'avais jamais entendu que ce n'était pas propre et au contraire. Dans l'embarqué c'est très utilisé et ça permet de gagner énormément de temps quand un paramètre change. Et puis ça ne m'a jamais posé de problème de compilation avec mplab ou codewarrior par exemple.
Et la dans mon cas précis ça facilitera belle et bien la portabilité puisqu'il suffira de remplacer RC2 par le nouveau port si je change de plateforme.
Et dernier point ça améliore grandement la lisibilité.
A+
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
>
benoitg
20 nov. 2008 à 13:09
20 nov. 2008 à 13:09
Non t'inquiète ce n'est pas une solution crade. C'est une solution tout court.
Une solution crade c'est quand il y a de la bidouille. Là, c'est fait pour. Après effectivement, il peut y avoir des erreurs bêtes, mais ça c'est parce que l'utilisateur s'en est mal servi (je pense notamment à l'utilisation du point virgule dans le define ^^).
Sinon par contre en C, au lieu d'utiliser les macros, c'est mieux d'utiliser les fonctions inline.
Cdlt
Une solution crade c'est quand il y a de la bidouille. Là, c'est fait pour. Après effectivement, il peut y avoir des erreurs bêtes, mais ça c'est parce que l'utilisateur s'en est mal servi (je pense notamment à l'utilisation du point virgule dans le define ^^).
Sinon par contre en C, au lieu d'utiliser les macros, c'est mieux d'utiliser les fonctions inline.
Cdlt
_Pierre_Richard_
Messages postés
11
Date d'inscription
jeudi 20 novembre 2008
Statut
Membre
Dernière intervention
5 janvier 2011
20 nov. 2008 à 14:15
20 nov. 2008 à 14:15
Ben en terme de maintenance je dirais que c'est pas top mais bon c'est en effet une solution. Après c'est comme le débat sur les goto et les macro / fct inline
C'est pas "mieux" d'utiliser les macros c'est juste que la fonction inline fait comme une macro et que c'est plus agréable à lire
a+
C'est pas "mieux" d'utiliser les macros c'est juste que la fonction inline fait comme une macro et que c'est plus agréable à lire
a+
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
20 nov. 2008 à 14:27
20 nov. 2008 à 14:27
Et surtout il y a une vérification de type avec les fonctions inline, chose que ne font pas les macros.
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
20 nov. 2008 à 14:32
20 nov. 2008 à 14:32
En terme de maintenance ?
Faut savoir faire la part des choses. Tout coder en macro, effectivement c'est illisible. Par contre utiliser des define pour définir une constante (#define MAX 50), ça c'est tip top (surtout en C, norme 89) Après, il y a d'autres cas où c'est bien pratique (comme le guard, etc).
C'est pas "mieux" d'utiliser les macros c'est juste que la fonction inline fait comme une macro et que c'est plus agréable à lire
Les fonctions inline sont mieux que les macros dans le sens que le compilateur les gère mieux. Dans une macro, le contrôle des types n'existe pas par exemple. Donc, ce n'est pas juste une question de lisibilité.
Faut savoir faire la part des choses. Tout coder en macro, effectivement c'est illisible. Par contre utiliser des define pour définir une constante (#define MAX 50), ça c'est tip top (surtout en C, norme 89) Après, il y a d'autres cas où c'est bien pratique (comme le guard, etc).
C'est pas "mieux" d'utiliser les macros c'est juste que la fonction inline fait comme une macro et que c'est plus agréable à lire
Les fonctions inline sont mieux que les macros dans le sens que le compilateur les gère mieux. Dans une macro, le contrôle des types n'existe pas par exemple. Donc, ce n'est pas juste une question de lisibilité.
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
20 nov. 2008 à 14:32
20 nov. 2008 à 14:32
pour la maintenance, c'est une plaie les macro, en effet. Pour llustrer, ce qui m'est arriver : windows.h contient "#define IN" et le source que j'essayais de compiler "int IN" et forcément, ça génère une erreur, qui n'est pas du tout évidente à trouver !!!
Pour utiliser les nom de macro, je te conseil de les nommé en majuscule et avec un "_" devant, soit "_BUZZER_" pour ton cas.
Le goto, je li partout que c'est vraiment à éviter.
La fonction inline est vraiment mieux, la macro peut entrainer des erreurs vraiment chiante. Par exemple prenons la macro fonction :
#define SQR(x) x*x
Si dans le code source tu fais :
SQR(1+2) le résultat sera 5 (et non 9), car le préprocesseur écrira : 1+2*1+2
C'est pour ces raisons que j'évite au maximum de mélanger ce qui est dans les macros avec ce qui est dans le source, surtout que bien souvent il est possible de faire autrement.
Pour utiliser les nom de macro, je te conseil de les nommé en majuscule et avec un "_" devant, soit "_BUZZER_" pour ton cas.
Le goto, je li partout que c'est vraiment à éviter.
La fonction inline est vraiment mieux, la macro peut entrainer des erreurs vraiment chiante. Par exemple prenons la macro fonction :
#define SQR(x) x*x
Si dans le code source tu fais :
SQR(1+2) le résultat sera 5 (et non 9), car le préprocesseur écrira : 1+2*1+2
C'est pour ces raisons que j'évite au maximum de mélanger ce qui est dans les macros avec ce qui est dans le source, surtout que bien souvent il est possible de faire autrement.
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
>
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
20 nov. 2008 à 14:33
20 nov. 2008 à 14:33
Et, je ne peux même pas dire copieur car t'as posté avant moi :s
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
>
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
20 nov. 2008 à 14:36
20 nov. 2008 à 14:36
Eh oui, les macro, c'est pas terrible pour ça lol. Vive l'inline :d
Les goto, c'est à éviter d'une manière générale car algorithmiquement moche, et illisible.
Mais il y a des cas, ou c'est bien plus joli. Notamment pour la gestion d'erreurs. Faut juste éviter le code spaghetti ^^.
Les goto, c'est à éviter d'une manière générale car algorithmiquement moche, et illisible.
Mais il y a des cas, ou c'est bien plus joli. Notamment pour la gestion d'erreurs. Faut juste éviter le code spaghetti ^^.
_Pierre_Richard_
Messages postés
11
Date d'inscription
jeudi 20 novembre 2008
Statut
Membre
Dernière intervention
5 janvier 2011
20 nov. 2008 à 14:45
20 nov. 2008 à 14:45
J'utilise les macro pour verifier les pointeurs ou libéré un pointeur s'il est différent de null et c'est très bien. Utiliser une fonction inline dans ce cas je n'en vois pas l'intéret de plus pr la compilation rien de plus simple.
Je pense que c'est comme le goto a eviter dans la majorité des cas seulement des fois c'est bien utile
Je pense que c'est comme le goto a eviter dans la majorité des cas seulement des fois c'est bien utile
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
21 nov. 2008 à 11:17
21 nov. 2008 à 11:17
Ah oui tout à fait j'ai jamais dit le contraire...