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
Bonjour,

Pour des raisons de portabilité j'aimerais créer, en langage C, une variable équivalente à une autre mais avec un nom différent. (si possible sans passer par un pointeur)

Pour être plus concret, je programme un microcontrôleur PIC en C et une librairie me donne directement accès à des variable correspondant à des ports du PIC (RC2 par exemple). Pour pouvoir plus rapidement porter le code sur un autre type de microcontrôleur et avoir un code plus lisible j'aimerais par exemple avoir une variable s'appelant "Buzzer" que je puisse utiliser à la place de RC2.

Avez vous la solution?

Merci d'avance pour votre aide.

Benoit

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
faut utiliser typedef
typedef type nouveau_type;
0
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
Salut,

Avec des define?
0
En fait je pense avoir trouvé tout seul :

#define Buzzer RC2

Ca compile en tout cas..
0
Pierre Richard
20 nov. 2008 à 09:53
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;
0
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
&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 ?).
0
_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
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 ...
0
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
En C++, c'est sur ça fonctionne, il faut déclarer ainsi (à toi de tester)
double &buzzer=RC2;
0
oui mais avec cette solution je gère un pointeur. Donc je passe de RC2 à *Buzzer. C'est moins propre.
0

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
ba non justement, tu gère buzzer ! C'est un vrai alias.
j'ai mis un & et pas un * !
0
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
Mais je ne suis pas sûr que le C++ soit génial pour un microcontrolleur. Enfin, encore que...
0
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
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 !
0
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
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.
0
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
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+
0
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
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
0
_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
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+
0
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
Et surtout il y a une vérification de type avec les fonctions inline, chose que ne font pas les macros.
0
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
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é.
0
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
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.
0
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
Et, je ne peux même pas dire copieur car t'as posté avant moi :s
0
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
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 ^^.
0
_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
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
0
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
Ah oui tout à fait j'ai jamais dit le contraire...
0