TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Duende_Azul en 03 de Agosto de 2010, 19:06:27
-
Tengo la siguiente definicion:
typedef struct
{ // 552 bytes (+4 overhead using malloc) ==> 556 bytes required per file opened
int clus_start; // Starting cluster of open file
int clus_current; // Current cluster of open file
int clus_next; // Next (reading) cluster of open file
int clus_prev; // Previous cluster of open file
char sec_offset; // Current sector withing current cluster
long entry_sec_addr; // Sector address of File entry of open file
FILE_DIR_ENTRY *file_dep; // Entry Pointer to the offset of the File Info
char buff[512]; // Open file read/write buffer
long length; // Length of file
long position; // Current position in file relative to begining
char mode; // 0=>closed, 1=>open for read, 2=>open for write, 3=> open for append
char error; // Error indicator
char EOF_flag; // End of File Flag
char *pntr; // Pointer for file data use
#ifdef _NO_MALLOC_
char used_flag; // Flag to see if the file is used or not
#endif
} FILE;
Luego defino la variable Archivo como FILE de la siguiente forma:
FILE *Archivo;
Long longitud;
En cierta parte del programa a "Archivo" se le asignan los valores y eso se hace correctamente tanto en simulación como en la realidad pero al intentar pasar el valor de "length" mediante la instruccion:
longitud = Archivo.Length; longitud toma un valor erroneo :5] pero, si hago esto: longitud = Archivo -> length; si funciona.
¿Alguien podria decir que esta pasando? ¿acaso las dos formas no son equivalentes?
-
Hola
Si usas archivo.length significa que la ubicación ram de la variable length es calculada directamente a partir de la estructura FILE. Pero si usas archivo->length, la ubicación ram de length debe calcularse haciendo uso de apuntadores. Un apuntador que ubique el comienzo de la estructura FILE y después otro que calcule la posición relativa de length.
Esto se explica así...
FILE archivo; //se ubica ram para la estructura (552 bytes)
FILE *archivo2; //sólo ubica ram para el apuntador (2 bytes), no para la estructura
//Como archivo2 aún no tiene ram apartada, debe asignársele
archivo2=(FILE *)malloc(...);
//Forma correcta de apuntar o leer datos
//Para estructura normal
archivo.length=15;
//Para estructura accesada vía apuntador
archivo2->length=15;
Si aún tienes dudas, acá hay otro ejemplo.
http://www.dgp.toronto.edu/~neff/teaching/CWebsite/pointersToStructures.html
El amigo BrunoF ha comentado que hay bugs con el uso de estructuras en CCS. Hay que tener cuidado ;-)
También hay que tener cuidado con inicializar una estructura dinámica (FILE *) antes de usarla.
-
El problema es que defines un puntero, entonces longitud = Archivo -> length; es igual a longitud = (*Archivo).length;
Saludos!
-
:) Mil gracias MigSantiago y Suky.. me ha quedado bastante claro.