Foro de elhacker.net

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:

Código
  1. #define stdin (&_iob[0])

Donde _iob es un arreglo de estructura tipo FILE.

¿Despues yo podria hacer esto? ¿Por que?

Código
  1. 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:

Código
  1. #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:

Código
  1. #include<stdio.h>
  2.  
  3. #define _ printf
  4.  
  5. int main() {
  6. _("Hello World\n");
  7. return 0;
  8. }

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
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í:

Código
  1. #define stdin (_iob)

En este caso al aplicarle el operador de desreferencia:
Código
  1. *(_iob)

estarías accediendo al primer elemento del arreglo:

Código
  1. (_iob[0])

en el otro caso:

Código
  1. #define stdin (&_iob[0])

este codigo es equivalente a este otro:

Código
  1. #define stdin (&*(_iob+0))
al aplicar el operador de desregerencia:
Código
  1. * (&*(_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
Código
  1. #define stdin (&*(_iob+0))
Esto se desarrollaría así:
Código
  1. #define stdin (&*K) // K -> FILE[]
  2. #define stdin (&K) // K -> FILE
  3. #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
Código
  1. #define stdin (&*(_iob+0))
Esto se desarrollaría así:
Código
  1. #define stdin (&*K) // K -> FILE[]
  2. #define stdin (&K) // K -> FILE
  3. #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
Código
  1. #define stdin (&*A) // A -> FILE[]
  2. // B = *A
  3. #define stdin (&B) // B -> FILE
  4. // C = &B
  5. #define stdin C // C -> FILE*