K&R C Ejercicio 4-11, Variables estáticas

Así que he estado revisando el libro de K&R en las últimas semanas. Lo he hecho todo en orden, realmente no me he saltado mucho. Si me quedo atascado en algo, generalmente puedo buscar en Google el ejemplo y encontrar una respuesta, pero esta vez me he quedado perplejo.

La sección 4.6 trata sobre la declaración de variables estáticas, tanto interna como externamente. El ejercicio dice esto:

Ejercicio 4-11. Modifique getop para que no necesite usar ungetch. Sugerencia: utilice una variable estática interna.

Esto tiene que ver con una calculadora polaca. getop recopila el siguiente operador u operando, y ungetch empuja un carácter de regreso a la pila de entrada.

La función original se ve así:

int getop(char s[])
{
int i, c;

while ((s[0] = c = getch()) == ' ' || c == '\t')
    ;

s[1] = '\0';    
if (!isdigit(c) && c != '.' && c != '-' )
    return c;       /* not a number */          
i = 0;
if (c == '-') {
    if (isdigit(c = getchar())) {
        s[i] = '-';
        ungetch(c);
    }
    else {
        ungetch(c);
        return '-';
    }
}

if (isdigit(c))     /* collect integer part */
    while (isdigit(s[++i] = c = getch()))
    ;

if (c == '.')       /* collect a fraction part */
    while (isdigit(s[++i] = c = getch()))
    ;

s[i] = '\0';

if (c != EOF)
    ungetch(c);

return NUMBER;
}

La mayoría de los ejemplos que he buscado se ven así:

static int buf = EOF;

if (buf != EOF && buf != ' ' && buf != '\t'
    && !isdigit(buf) && buf != '.') {
    c = buf;
    buf = EOF;
    return c;
}
if (buf == EOF || buf == ' ' || buf == '\t') 
    while ((*s = c = getch()) == ' ' || c == '\t')
        ;
else 
    *s = c = buf;
buf = EOF;

Mi problema es que no tiene en cuenta la modificación que se suponía que íbamos a hacer antes, que era para manejar números negativos. Ninguno de los ejemplos que he encontrado también parece hacer uso del hecho de que la variable es estática y, por lo tanto, permanece después de llamar a la función. Simplemente lo configuramos en EOF al final. Si no importa cuál es la variable entre las llamadas a funciones, ¿por qué usar una variable estática?

Finalmente, no estoy seguro de cómo usar la variable estática para volver a colocar c en la pila de entrada. getch usa una matriz compartida entre getch y ungetch de la que getop no tiene conocimiento.

Perdón por la publicación más larga para un ejemplo tan simple.

preguntado el 03 de mayo de 12 a las 19:05

1 Respuestas

La idea básica es que en cualquier lugar getop que tienes actualmente ungetch(), en su lugar, establece su variable estática en el valor que no obtendría. Entonces, donde sea que llames getch(), obtendría el valor de la variable estática en su lugar si es válida (es posible que necesite una segunda variable estática para decir si es válida, que borra cuando la lee y establece cuando la quita).

contestado el 03 de mayo de 12 a las 20:05

Gracias por la ayuda. Lo tengo funcionando para valores negativos, pero no puedo hacer que la resta funcione sin ungetch(). Sin embargo, creo que entiendo la mayoría de los conceptos del ejercicio, así que seguiré adelante. He pasado demasiado tiempo en esto. ¡Gracias de nuevo! - austin marrón

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.