Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Structure qui m'est inconnu

9 réponses
Avatar
azariel33
Bonjour à tous.
Je dois commenter une bibliothèque C déjà écrite.
Or le programmeur (que je ne peux pas interroger car il ne fait plus
partit de l'entreprise) a utilisé une structure que je ne connais pas
:

void toto( titi )
char *titi[10];
{
//Suite d'instructions avec des boucles ... conditions ...
}

Que vient faire ce char *titi[10] ?? Et surtout le point virgule ?
Est-ce équivalent à void toto(char *titi[10]) ?

De plus, dans les définition d'autres fonctions, il ne spécifie pas de
type de retour ...
Il écrit des choses de ce style :

Fonction()
{
//Suite d'instruction
return(1);
}

Je suis un peu larguée ... c'est loin des standard de programmation
que la fac m'a enseigné.
Merci si vous pouvez m'aider.

9 réponses

Avatar
Florent
Le Tue, 06 Apr 2004 01:41:30 -0700, Azariel a écrit :

Bonjour à tous.
Je dois commenter une bibliothèque C déjà écrite.
Or le programmeur (que je ne peux pas interroger car il ne fait plus
partit de l'entreprise) a utilisé une structure que je ne connais pas
:

void toto( titi )
char *titi[10];
{
//Suite d'instructions avec des boucles ... conditions ...
}

Que vient faire ce char *titi[10] ?? Et surtout le point virgule ?
Est-ce équivalent à void toto(char *titi[10]) ?


toto est une fonction ne retournant rien (donc une procédure) et dont le
paramètre titi est un tableau de 10 chaînes de caractères. J'ai vu
cette notation dans un vieux livre de C ("A Book on C" - Ira Pohl & Al
kelley (je ne suis pas sûr de l'orthographe, flemme d'aller jusqu'à ma
bibliothèque)), où les paramètres sont déclarés non pas entre les
parenthèses mais après le nom de la fonction. D'où le point-virgule.

De plus, dans les définition d'autres fonctions, il ne spécifie pas de
type de retour ...
Il écrit des choses de ce style :


Lorsque le type de retour n'est pas spécifié, le compilateur assume que
la fonction retourne un int. Mauvaise pratique cela dit ...

Je suis un peu larguée ... c'est loin des standard de programmation
que la fac m'a enseigné.


Normal, c'est une notation plutôt casse-pieds, mais elle existe ...

Merci si vous pouvez m'aider.


A ton service.

F.

Avatar
Horst Kraemer
On 6 Apr 2004 01:41:30 -0700, (Azariel) wrote:

Bonjour à tous.
Je dois commenter une bibliothèque C déjà écrite.
Or le programmeur (que je ne peux pas interroger car il ne fait plus
partit de l'entreprise) a utilisé une structure que je ne connais pas
:

void toto( titi )
char *titi[10];
{
//Suite d'instructions avec des boucles ... conditions ...
}


Il s'agit d'une définition de fonction dans un ancien style (le style
original "K&R" sans prototypes avant la norme du langage C) qui est
toujours permis selon la norme.

Aujourd'hui on écrirait

void toto (char *titi[10])
{
}


Que vient faire ce char *titi[10] ?? Et surtout le point virgule ?
Est-ce équivalent à void toto(char *titi[10]) ?


Comme définition c'est équivalent. L'effet dans un programme est
différent.

Quand le compilateur "voit" la définition

void toto( titi )
char *titi[10];
{
}

il ne s'intéresse pas aux paramétres, c.a.d. il accepterait un appel
quelconque comme

toto();
ou
toto(1,2,3);

De plus, dans les définition d'autres fonctions, il ne spécifie pas de
type de retour ...
Il écrit des choses de ce style :

Fonction()
{
//Suite d'instruction
return(1);
}


Selon l'ancien style (accepté toujours par la norme C90) une fonction
définie sans type de retour est considérée automatiquement comme si
elle était définie avec un type de retour 'int' (implicit int). C'est
donc équivalent à

int Fonction()
{
return 1;
}

--
Horst

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', (Azariel) wrote:

void toto( titi )
char *titi[10];
{
//Suite d'instructions avec des boucles ... conditions ...
}

Que vient faire ce char *titi[10] ?? Et surtout le point virgule ?
Est-ce équivalent à void toto(char *titi[10]) ?


Oui. C'est une définition 'à l'ancienne' (avant 1989).

Il existe un utilitaire (protoize) qui est censé faire les conversions.
Jamais pu le faire fonctionner...

De plus, dans les définition d'autres fonctions, il ne spécifie pas de
type de retour ...
Il écrit des choses de ce style :

Fonction()
{
//Suite d'instruction
return(1);
}


Là encore, c'est du vieux style. Le type par défaut est int. Il vaut mieux
être explicite (c'est d'allieurs exigé par la norme actuelle)

int Fonction (void)
{
...
return 1;
}

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?lib=cpp
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Avatar
azariel33
Oui, j'ai consulté mon responsable et il s'avère que cette
bibliothèque date de 1998 ... Elle est codée dans un vieux standard,
et je dois la remettre aux normes actuelles ... travail long et
fastidueux ...

Sinon j'ai une autre question (en fait un doute). Le compilateur C
fait-il une différence entre majuscule et minuscules ? Le programmeur
a mélanger majuscules et minuscules sans vraiment de logique.
Et je me retrouve avec des appels de fonctione à GET_env ... alors que
la seule fonction qui correspond est get_env.

Merci
Avatar
Yves ROMAN

Oui, j'ai consulté mon responsable et il s'avère que cette
bibliothèque date de 1998 ... Elle est codée dans un vieux standard,


Ca me parait bien récent. Ca serait pas plutot 89 ?

et je dois la remettre aux normes actuelles ... travail long et
fastidueux ...

Sinon j'ai une autre question (en fait un doute). Le compilateur C
fait-il une différence entre majuscule et minuscules ? Le programmeur
a mélanger majuscules et minuscules sans vraiment de logique.
Et je me retrouve avec des appels de fonctione à GET_env ... alors que
la seule fonction qui correspond est get_env.

Ca me parait plus un problème d'éditeur de liens que de compilateur.

Je me souviens que certains ne faisaient pas de différence (en particulier pour
linker avec des modules assembleur)
Mais maintenant, il vaut mieux rester cohérent et garder le même nom. On
pourrait croire, par exemple, que GET_env() est une macro qui appelle get_env()
...

Avatar
Antoine Leca
En , Yves ROMAN va escriure:

Oui, j'ai consulté mon responsable et il s'avère que cette
bibliothèque date de 1998 ... Elle est codée dans un vieux standard,


Ca me parait bien récent. Ca serait pas plutot 89 ?


Bah, moi j'écris bien (on est en 2004) du code au format K&R (parce que une
des cibles est un compilo pas ANSI). Bien sûr, j'utilise des prototypes avec
le truc de la macro P((proto)), qui élimine le prototype et laisse une
déclaration f() si pas conforme à la norme. Mais les définitions de
fonctions restent toutes au format K&R, à moins qu'elles n'aient un nombre
variable de paramètres.

D'ailleurs, la question s'est posée au moment de la rédaction de C99, et la
réponse a été claire: le fossile reste (je suppose que dans C0x, cela
disparaîtra; mais c'est un autre problème).


et je dois la remettre aux normes actuelles ... travail long et
fastidueux ...



Mais nécessaire.


Sinon j'ai une autre question (en fait un doute). Le compilateur C
fait-il une différence entre majuscule et minuscules ?



Oui. Ceux qui ne la faisaient pas ont été jeté il y a des années.
Inutilisables.

Le programmeur
a mélanger majuscules et minuscules sans vraiment de logique.
Et je me retrouve avec des appels de fonctione à GET_env ... alors
que la seule fonction qui correspond est get_env.



Regarde s'il n'y a pas une macro GET_env dans un coin.

En général, on utilise ce genre de truc pour améliorer les performances. La
fonction (écrite conventionellement en minuscules) fait le boulot, mais peut
avoir des performances très mauvaises. Donc on cache certaines données, et
les appels se font à travers une macro (conventionellement en majuscules,
mais parfois on peut vaoir l'écriture GET_env) qui va récupérer les données
dans le cache, et qui quand ce n'est pas possible, fait l'appel couteux à la
fonction.

Exception à cette règle de nommage: getc et putc à la place de FGETC ou
FPUTC.



Ca me parait plus un problème d'éditeur de liens que de compilateur.


Exact, c'est aussi possible.
Mais alors c'est vraiment du boulot de [censuré]


Antoine


Avatar
Régis Troadec
"Antoine Leca" a écrit dans le message de
news:c50da1$gr6$

Salut,

Regarde s'il n'y a pas une macro GET_env dans un coin.

En général, on utilise ce genre de truc pour améliorer les performances.
La

fonction (écrite conventionellement en minuscules) fait le boulot, mais
peut

avoir des performances très mauvaises. Donc on cache certaines données, et
les appels se font à travers une macro (conventionellement en majuscules,
mais parfois on peut vaoir l'écriture GET_env) qui va récupérer les
données

dans le cache, et qui quand ce n'est pas possible, fait l'appel couteux à
la

fonction.

Exception à cette règle de nommage: getc et putc à la place de FGETC ou
FPUTC.


Et les copains getchar et putchar, de meme que assert, va_start, va_arg,
va_en, setjmp, en tout cas pour C90.
J'ai bon, ou il y en a en trop (ou en manque t-il) ?

Regis

Avatar
Antoine Leca
En c50sif$j45$, Régis Troadec va escriure:
"Antoine Leca" a écrit dans le message de
news:c50da1$gr6$

Exception à cette règle de nommage: getc et putc à la place de FGETC
ou FPUTC.


Et les copains getchar et putchar, de meme que assert, va_start,
va_arg, va_en[d], setjmp, en tout cas pour C90.


J'avais bien pensé à getchar(), mais ce ne sont pas réellement des macros
masquant une implémentation de cache, plutôt des raccourcis techniques pour
getc(stdin) et putc(stdout,)

Les autres (et aussi offsetof()) sont des objets de la bibliothèques qui
sont normalement des macros, pas des fonctions. getc, putc, getchar et
putchar sont aussi des fonctions, tu peux par exemple obtenir un pointeur
d'icelles. Avec en général des perfs très différentes...


Antoine


Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', (Azariel) wrote:

Oui, j'ai consulté mon responsable et il s'avère que cette
bibliothèque date de 1998 ...


C'est pas très vieux. Je code en C standard (C89) depuis 1991 (Borland C 3.1
que je ne quitte plus!).

Elle est codée dans un vieux standard,
et je dois la remettre aux normes actuelles ... travail long et
fastidueux ...


L'utilitaire 'protoize' peut aider...

Sinon j'ai une autre question (en fait un doute). Le compilateur C
fait-il une différence entre majuscule et minuscules ?


Oui.

Le programmeur
a mélanger majuscules et minuscules sans vraiment de logique.


Qu'on le pende!

Et je me retrouve avec des appels de fonctione à GET_env ... alors que
la seule fonction qui correspond est get_env.


Il y a peut être une macro GET_env ... Faut voir...

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?lib=cpp
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/