Autor Tema: Crear un array de bytes en c18  (Leído 2562 veces)

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

Desconectado Maria33

  • PIC12
  • **
  • Mensajes: 54
Crear un array de bytes en c18
« en: 27 de Marzo de 2009, 13:54:18 »
Hola! Estoy trabajando con c18 y necesito crear un array de bytes pero el tamaño del array no lo se hasta que no reciba una trama por el puerto serie. Esta trama me indicará la longitud del array a crear pero ¿como creo el array?
Yo lo que hago es guardar en un byte la longitud y despues hago:
BYTE array[longitud];

Pero me sale el siguiente error: Error [1219] integer constant expected

Sin embargo si hago BYTE array[20] no me sale el error.

¿alguien sabe como puedo quitar este error?
Gracias

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Crear un array de bytes en c18
« Respuesta #1 en: 27 de Marzo de 2009, 14:08:55 »
Hola, el tamañp de un array en ANSI C tiene que ser constante, en tu caso podes especificar un tamaño máximo que va a depender de la aplicación.

Saludos !

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Crear un array de bytes en c18
« Respuesta #2 en: 27 de Marzo de 2009, 14:11:43 »
Hola

Lo que necesitas es un array dinámico. En c se pueden crear así...

Código: [Seleccionar]
#include malloc.h //librería que ubica ram disponible

...

void main()
{
BYTE *array;
int tamano;
...

tamano=valorx; //obtienes el tamaño del array de acuerdo al programa

array=(byte *)malloc(tamano); //buscas memoria ram disponible para ubicar el nuevo arreglo array

//Y luego lo usas como si nada
array[0]=0xff;
array[tamano-1]=0x00;
}

Esto funciona en el c tradicional y en ccs. Nunca lo he probado en C18, pero debe ser similar.

Una vez que ya no necesites el arreglo en memoria, lo liberas...

Código: [Seleccionar]
free(array);

Desconectado Maria33

  • PIC12
  • **
  • Mensajes: 54
Re: Crear un array de bytes en c18
« Respuesta #3 en: 27 de Marzo de 2009, 14:17:55 »
migsantiago  respecto a lo que me has dicho, lo he probado y la función malloc no la puedo usar en c18.
Respecto a la respuesta de  RICHI777, es cierto que podría hacerlo asi pero necesitaría si se pudiese crear el array del tamaño exacto.

Muchas gracias

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Crear un array de bytes en c18
« Respuesta #4 en: 27 de Marzo de 2009, 14:27:40 »
Hola mig, aunque lo que planteas es totalemente válido hay que tener mucho cuidado con el uso de memoria dinamica en sistemas con poco recurso de RAM, a veces es mas conveniente tomar una decisión de compromiso como lo seria de definir un largo máximo.

Citar
Respecto a la respuesta de  RICHI777, es cierto que podría hacerlo asi pero necesitaría si se pudiese crear el array del tamaño exacto.

En si no se puede, el compilador al momento de compilar debe tener como constante el tamaño del mismo, no puede ser variable, algunos compiladores implementan una función que no es ANSI C llamada Alloca que es similar al malloc, pero el espacio obtenido no es sacado del heap ( malloc trabaja asi ) sino del stack, con lo cual al salir de scope de la función ese espacio es restituido.



Saludos !
« Última modificación: 27 de Marzo de 2009, 14:33:24 por RICHI777 »

Desconectado Maria33

  • PIC12
  • **
  • Mensajes: 54
Re: Crear un array de bytes en c18
« Respuesta #5 en: 27 de Marzo de 2009, 14:57:35 »
Muchas gracias por la aclaración. Otra consulta es la siguiente:
Si me creo un array del siguiente modo:
BYTE A[];
y posteriormete en mi código copio un array de tamaño 50  dentro de este creado anteriormente,¿el tamaño del arrray A será 50?

¿Puede esto dar problema en cuando al uso de la memoria RAM?

Gracias,un saludo

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Crear un array de bytes en c18
« Respuesta #6 en: 27 de Marzo de 2009, 15:06:21 »
Hola Maria, no deberia compilarte una declaracion de ese estilo, y cuando copias un array a otro es responsabilidad del programador asegurarse que el array destino tenga el suficiente espacio como para garantizar que no se sobre escriba memoria.

Saludos !

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Crear un array de bytes en c18
« Respuesta #7 en: 27 de Marzo de 2009, 17:22:04 »
Bueno, tienes razón Richi, es mejor declarar un arreglo con el máximo tamaño posible desde el principio.

María, si todavía tienes ganas de implementarlo dinámico, acá el link de Microchip que dice cómo.

Dynamic Memory Allocation for the MPLAB® C18 C Compiler
AN914
http://www.microchip.com/Stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1824&appnote=en012157

Desconectado Maria33

  • PIC12
  • **
  • Mensajes: 54
Re: Crear un array de bytes en c18
« Respuesta #8 en: 27 de Marzo de 2009, 21:07:30 »
Muchas gracias por vuestras aclaraciones.Miraré el link a ver si consigo hacerlos dinamico y de no ser así crearé el array con  con el maximo tamaño posible desde el principio.

Gracias