Autor Tema: Pregunta sobre Struct en CCS...  (Leído 3416 veces)

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

Desconectado Duende_Azul

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 902
Pregunta sobre Struct en CCS...
« en: 03 de Agosto de 2010, 19:06:27 »
Tengo la siguiente definicion:

Código: [Seleccionar]
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?







Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Pregunta sobre Struct en CCS...
« Respuesta #1 en: 03 de Agosto de 2010, 19:56:02 »
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í...

Código: [Seleccionar]
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.
« Última modificación: 03 de Agosto de 2010, 19:58:58 por migsantiago »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Pregunta sobre Struct en CCS...
« Respuesta #2 en: 03 de Agosto de 2010, 20:13:09 »
El problema es que defines un puntero, entonces longitud = Archivo -> length;   es igual a longitud = (*Archivo).length;  


Saludos!
« Última modificación: 03 de Agosto de 2010, 20:18:30 por Suky »
No contesto mensajes privados, las consultas en el foro

Desconectado Duende_Azul

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 902
Re: Pregunta sobre Struct en CCS...
« Respuesta #3 en: 03 de Agosto de 2010, 21:06:59 »
 :)  Mil gracias MigSantiago y Suky.. me ha quedado bastante claro.


 

anything