Definición de stdin en C

Iniciado por fafafa01, 5 Septiembre 2017, 11:59 AM

0 Miembros y 1 Visitante están viendo este tema.

fafafa01

Es legal definir stdin como sigue:

#define stdin (&_iob[0])

Donde _iob es un arreglo de estructura tipo FILE.

¿Despues yo podria hacer esto? ¿Por que?

stdin->flag

y entrar a la variable flag de la estructura FILE
¿Se pueden usar el operador de desreferencia sobre una dirección de memoria?

o debria definir a stdin asi:

#define stdin (_iob)

ivancea96

El operador desreferencia es precisamente para acceder a lo apuntado por una dirección de memoria. ¿Por qué no ibas a poder?

De todos modos, evita acceder a los campos de la estructura FILE, puedes hacer las operaciones con las funciones que la librería trae consigo.

AlbertoBSD

De poderse de puede hacer pero como te comentan es mejor usar las definiciones que ya tienen las librerias.

La clausula define es solo para el compilador y sustituye cada occurencia del primer parametro por el segundo en el codigo fuente antes de compilarlo ejemplo:

#include<stdio.h>

#define _ printf

int main() {
_("Hello World\n");
return 0;
}


Sustituye en el codigo cada _ por printf

En tu caso sustituiria cada stdin por la definicion que muestras.

Saludos!
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

fafafa01

El operador de desreferencia sirve para acceder a lo apuntado por una dirección de memoria. El problema es que esa dirección de memoria no apunta a nada, esa dirección de memoria es una estructura tipo FILE no un puntero. ( O ESO ES LO QUE ENTIENDO).

ivancea96

Cita de: fafafa01 en  6 Septiembre 2017, 12:12 PM
El operador de desreferencia sirve para acceder a lo apuntado por una dirección de memoria. El problema es que esa dirección de memoria no apunta a nada, esa dirección de memoria es una estructura tipo FILE no un puntero. ( O ESO ES LO QUE ENTIENDO).
_iob es una matriz de FILE, que contiene varios FILE. Aunque sea un array, se puede acceder a él como si fuera un puntero. Hay pequeñas diferencias entre array y puntero, pero bueno, parecidos.

fafafa01

Claro pero para mi se tendría que definir así:

#define stdin (_iob)

En este caso al aplicarle el operador de desreferencia:
*(_iob)

estarías accediendo al primer elemento del arreglo:

(_iob[0])

en el otro caso:

#define stdin (&_iob[0])
este codigo es equivalente a este otro:

#define stdin (&*(_iob+0))
al aplicar el operador de desregerencia:
* (&*(_iob+0))
Le estarias aplicando el operador de desreferencia a la direccion de memoria del primer elemento de la  estructura FILE.

ivancea96

#define stdin (&*(_iob+0))
Esto se desarrollaría así:
#define stdin (&*K) // K -> FILE[]
#define stdin (&K) // K -> FILE
#define stdin K // K -> FILE*


Ten en cuenta, en el último paso, que '&' es una referencia; "añade un puntero (*)".

Por tanto, stdin es un FILE.

fafafa01

Cita de: ivancea96 en  6 Septiembre 2017, 22:23 PM
#define stdin (&*(_iob+0))
Esto se desarrollaría así:
#define stdin (&*K) // K -> FILE[]
#define stdin (&K) // K -> FILE
#define stdin K // K -> FILE*


Ten en cuenta, en el último paso, que '&' es una referencia; "añade un puntero (*)".

Por tanto, stdin es un FILE.

No entiendo ¿que es esa K?

¿Como yo quiero definir stdin esta mal?

ivancea96

#define stdin (&*A) // A -> FILE[]
// B = *A
#define stdin (&B) // B -> FILE
// C = &B
#define stdin C // C -> FILE*