C/Visual C - dua en la macro #define getc(p) del stdio.h

 
Vista:

dua en la macro #define getc(p) del stdio.h

Publicado por ruben (4 intervenciones) el 14/12/2007 00:56:30
Hola estoy estudiando la biblioteca estandar de e/s de c, y en el stdio.h del manual
que sigo me encuentro con la siguiente macro

#define getc(p) (--(p)->cnt >=0 ? (unsigned char) *(p)->ptr++ : fillbuf(p))

p es una estructura de tipo FILE, con los siguientes atributos:
int cnt ;//caracteres que quedan en la memoria intermedia
char *ptr;//puntero al caracter siguiente de la memoria intermedia
char *base;//puntero al inicio de la memoria intermedia
int flag;//modo de acceso al fichero y estado del mismo
int fd;//descriptor del fichero al que queremos acceder

Bueno, mi duda es que no entiendo la logica de la macro, porque si p->cnt son los caracteres que
quedan en el buffer, estos siempre van a ser o 0, o mas de 0, por lo que la primera condicion del if
siempre se cumpliria, y siempre devolveria ese puntero a p->ptr++.
¿Alguien me puede explicar en que casos (p)->cnt es menor de 0 y por lo tanto se realiza la
llamada a fillbuf(p) ?
Muchas gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:dua en la macro #define getc(p) del stdio.h

Publicado por Nelek (816 intervenciones) el 14/12/2007 11:41:48
La respuesta correcta no las se, pero a ver si esto te dice algo:

Un char tiene 8 bits, segun ello puede ir de 0x00 a 0xFF y si, teoricamente nunca va a ser menor que cero.

Pero resulta que eso es en binario/hexa (equivalente seria 0... 256), pero entonces de donde sale el rango (-128 ... 127)?

Eso sale porque el bit de mayor significacion, es decir el 7, contiene el signo, por lo tanto 0x00 a 0x7F son los numeros positivos y el resto los negativos.

es decir:

0000 0001 = 1
1000 0001 = -127

0000 1111 = 15
1000 1111 = -113

Puede que vaya por ahi, si te das cuenta solo castea a unsigned char* cuando es positivo.

P.S. Puede que esto que acabo de decir sean una sarta de chorradas, que no tengan nada que ver. A ver que dicen otros usuarios con mas nivel.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:dua en la macro #define getc(p) del stdio.h

Publicado por Tom (619 intervenciones) el 14/12/2007 11:59:24
Bueno, pues seguramente la respuesta también la tienes en la librería standard.
Debes buscar el tratamiento que se hace de cnt que puede _no_ indicar el número de caracteres que quedan por leer.

Si aplicas la lógica, verás que cnt vale 0 _antes_ de leer el último carácter del buffer. Después de leerlo valdrá -1 (posiblemente).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:dua en la macro #define getc(p) del stdio.h

Publicado por ruben (4 intervenciones) el 14/12/2007 16:50:10
Gracias a los dos por responderme tan rapido. Voy a revisar ahora mismo la biblioteca a ver si con las ideas que me habeis dado encuentro el momento en que cnt<0
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar