Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: fafafa01 en 5 Septiembre 2017, 11:59 AM

Título: Definición de stdin en C
Publicado por: fafafa01 en 5 Septiembre 2017, 11:59 AM
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)
Título: Re: Definición de stdin en C
Publicado por: ivancea96 en 5 Septiembre 2017, 15:16 PM
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.
Título: Re: Definición de stdin en C
Publicado por: AlbertoBSD en 5 Septiembre 2017, 16:44 PM
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!
Título: Re: Definición de stdin en C
Publicado por: 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).
Título: Re: Definición de stdin en C
Publicado por: ivancea96 en 6 Septiembre 2017, 20:19 PM
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.
Título: Re: Definición de stdin en C
Publicado por: fafafa01 en 6 Septiembre 2017, 22:16 PM
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.
Título: Re: Definición de stdin en C
Publicado por: 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.
Título: Re: Definición de stdin en C
Publicado por: fafafa01 en 9 Septiembre 2017, 21:53 PM
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?
Título: Re: Definición de stdin en C
Publicado por: ivancea96 en 10 Septiembre 2017, 12:39 PM
#define stdin (&*A) // A -> FILE[]
// B = *A
#define stdin (&B) // B -> FILE
// C = &B
#define stdin C // C -> FILE*