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

K&R p125 126 déclarations complexes

22 réponses
Avatar
Jean Pierre Daviau
Bonjour à tous,

J'ai remplacé getch(0 par getche() dans la fonction gettoken() afin de voir
sur la fenêtre dos ce que j'écrivais.
La fonction gettoken() a été testé avec l'application dcl() de K&R page
122-123-124 et elle fonctionne normalement.

La fonction undcl(), elle ne fonctionne pas très bien en ce qu'il n'y a pas
moyen de la faire cesser avec la ligne:
while(gettoken() != EOF) dans main.

Voici un copie du programme donnée en exemple par KR chap 5.12
"Complicated declaration".

/*
undcl.c
"x is a function returning a pointer to an array of pointers to functions
returning char"

undcl convert word description to declaration
x () * [] * () char char (*(*x())[])()

*/

#include "dcl.h"

int main(){ /* page 126 */

int type;
char temp[MAXTOKEN];

while(gettoken() != EOF){
strcpy(out, token);
while((type = gettoken()) != '\n'){
if(type == PARENS || type == BRACKETS){
strcat(out, token);
}else if(type == '*'){
sprintf(temp, "(*%s)", out);
strcpy(out, temp);
}else if (type == NAME){
sprintf(temp, "%s %s", token, out);
strcpy(out, temp);
}else{
printf("invalid input at %s\n", token);
}

printf("%s\n", out);
}
}

return 0;
}
#include <stdio.h>
#include <string.h>
#include <ctype.h>

#define MAXTOKEN 100

enum {NAME, PARENS, BRACKETS};

void dcl(void);
void dirdcl(void);
int gettoken(void);

int tokentype; /* type of last token */
char token[MAXTOKEN]; /* last token string */
char name[MAXTOKEN]; /* identifyer name */
char datatype[MAXTOKEN]; /* data type = char, int, etc. */
char out[1000]; /* output string */

int gettoken(void){ /* return next token fonction commune a dcl() */

int c, getche(void);
void ungetch(int);
char *p = token;

while((c = getche()) == ' ' || c == '\t')
;
if(c == '('){
if((c = getche()) == ')'){
strcpy(token, "()");
return tokentype = PARENS;
}else{
ungetch(c);
return tokentype = '(';
}
}else if(c == '['){
for(*p++ = c; (*p++ = getche()) != ']'; )
;
*p = '\0';
return tokentype = BRACKETS;
}else if (isalpha(c)){
for(*p++ = c; isalnum(c = getche()); )
*p++ = c;
*p = '\0';
ungetch(c);
return tokentype = NAME;
}else
return tokentype = c;
}


--
Jean Pierre Daviau
--
http://jeanpierredaviau.com

10 réponses

1 2 3
Avatar
Emmanuel Delahaye
Jean Pierre Daviau wrote on 13/03/05 :
J'ai remplacé getch(0 par getche() dans la fonction gettoken() afin de voir
sur la fenêtre dos ce que j'écrivais.



Gni ? On parle de getch() dans le K & R ? Je veux une preuve.

--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html

"C is a sharp tool"

Avatar
Benoit Izac
Bonjour,

le 13/03/2005 à 20:54, Emmanuel Delahaye a écrit
dans le message :

J'ai remplacé getch(0 par getche() dans la fonction gettoken() afin
de voir sur la fenêtre dos ce que j'écrivais.


Gni ? On parle de getch() dans le K & R ? Je veux une preuve.


Je confirme, c'est dans la version originale. Mais c'est pas le getch
auquel tu penses :

char buf[BUFSIZE]; /* buffer for ungetch */
int bufp = 0; /* next free position in buf */

int getch(void) /* get a (possibly pushed-back) character */
{
return (bufp > 0) ? buf[--bufp] : getchar();
}

Dans la version française la fonction s'appelle lirecar().

--
Benoit Izac


Avatar
Jean Pierre Daviau
Second Edition 1988
isbn 0-13-110362-9

Page 78
What are getch() and ungetch()? It is often the case ....



"Emmanuel Delahaye" a écrit dans le message de news:

Jean Pierre Daviau wrote on 13/03/05 :
J'ai remplacé getch(0 par getche() dans la fonction gettoken() afin de
voir sur la fenêtre dos ce que j'écrivais.



Gni ? On parle de getch() dans le K & R ? Je veux une preuve.

--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html

"C is a sharp tool"




Avatar
Emmanuel Delahaye
Jean Pierre Daviau wrote on 13/03/05 :
Second Edition 1988
isbn 0-13-110362-9

Page 78
What are getch() and ungetch()? It is often the case ....


Quel chapître (j'ai l'édition française qui a francisé les fonctions
non standard!)

--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html

"Clearly your code does not meet the original spec."
"You are sentenced to 30 lashes with a wet noodle."
-- Jerry Coffin in a.l.c.c++

Avatar
Jean Pierre Daviau
Section 4.3
Juste avant les Exercices

Ma question réfère à la section 5.12

JP
"Emmanuel Delahaye" a écrit dans le message de news:

Jean Pierre Daviau wrote on 13/03/05 :
Second Edition 1988
isbn 0-13-110362-9

Page 78
What are getch() and ungetch()? It is often the case ....


Quel chapître (j'ai l'édition française qui a francisé les fonctions non
standard!)

--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html

"Clearly your code does not meet the original spec."
"You are sentenced to 30 lashes with a wet noodle."
-- Jerry Coffin in a.l.c.c++




Avatar
Emmanuel Delahaye
Jean Pierre Daviau wrote on 13/03/05 :
Section 4.3
Juste avant les Exercices

Ma question réfère à la section 5.12


lirecar()
remettrecar()

Ok.

--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html

"C is a sharp tool"

Avatar
Jean Pierre Daviau
Error: Unresolved external '_lirecar' referenced from C:DOCUMENTS AND
SETTINGSJEAN PIERREBUREAUUNDCL.OBJ
Error: Unresolved external '_remettrecar' referenced from C:DOCUMENTS AND
SETTINGSJEAN PIERREBUREAUUNDCL.OBJ
Avatar
Antoine Leca
En xdfZd.39922$, Jean Pierre Daviau va
escriure:
Error: Unresolved external '_lirecar' referenced from C:DOCUMENTS
AND SETTINGSJEAN PIERREBUREAUUNDCL.OBJ
Error: Unresolved external '_remettrecar' referenced from
C:DOCUMENTS AND SETTINGSJEAN PIERREBUREAUUNDCL.OBJ


Ga ?
Moi pas comprendre.

Or should it be, sorry: I do not get your point?


Eussiez-vous oublié de changer getch() par lirecar() et ungetch() par
remettrecar()?

Ou alors n'eûtes-vous point de changement à faire, ce qui constituerait à
coup sûr un motif pour votre initial problème...


Antoine

Avatar
Jean Pierre Daviau
lirecar()
remettrecar()
Ok.
Emmanuel
précédemment


me donne

Error: Unresolved external '_lirecar' referenced from C:DOCUMENTS AND
SETTINGSJEAN PIERREBUREAUUNDCL.OBJ
Error: Unresolved external '_remettrecar' referenced from C:DOCUMENTS AND
SETTINGSJEAN PIERREBUREAUUNDCL.OBJ

comprenich?

ces deux fonctions ne sont pas dans Borland 5.5
and probably knot too dans devc++
Voilà le noeud de la question:
while ((c=lirecar()) != EOF){
}

comment faire une boucle dont on sort en tapant return(OK) au clavier

Avatar
Antoine Leca
En 6HjZd.53495$, Jean Pierre Daviau va
escriure:
ces deux fonctions ne sont pas dans Borland 5.5


Non. Car elles sont données dans le livre. Au chapitre 4 ou quelque par là,
comme tu l'as expliqué dans un de tes messages précédents.

Et bien sûr il faut les lier au programme principal, sinon on a l'erreur que
tu cites.

Et si tu remplaces "getch" par "lirecar", à la fois dans le source de la
fonction et aussi dans l'appel dans "gettoken", le résultat doit être le
même.

Et si tu utilises un getche à la place de getch, et bien il faut en fournir
le source aussi, sinon cela peut ne pas marcher.

Et enfin, si à la place de la focntion décrite par Biran tu laisses le
compilateur utiliser sa version à lui (parce qu'il y a une duplication de
nom imprévue), et que le comportement des deux n'est pas exactement le même
dans des cas limites, eh bien tu as exactement le comportement que tu nous a
raconté.


comment faire une boucle dont on sort en tapant return(OK) au
clavier


En tapant TOUT ce que le bouquin te dis de taper, sans essayer de tirer au
plus court.


Maintenant, il y a une autre solution, mais ne l'appliques pas aveuglement
;-)

#define EOF 13

devrait marcher dans ton cas...


Exercice: pourquoi?

Antoine

1 2 3