Autor Tema: Problema de compilación (Punteros en CCS)  (Leído 3110 veces)

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

Desconectado PicMinor

  • PIC16
  • ***
  • Mensajes: 236
Problema de compilación (Punteros en CCS)
« en: 04 de Julio de 2014, 05:50:17 »
¡ Saludos al grupo !

Tengo que almacenar una gran serie de datos en la memoria de programa que incluyen arrays de distinto tamaño. He intentado utilizar este código pero no compila. Me da el error "Expression must evaluate to a constant"

¿Alguien puede orientarme?

Código: [Seleccionar]

struct Estructura {
long Valor_Long;
  char Valor_Char;
  long *Array_Long;
};

static const long Array_A[] = {
386, 491, 187, 290,
};

static const long Array_B[] = {
503, 177, 431, 714, 874, 102,
};

static const struct Estructura Valores[] = {
{ 12345,
67,
Array_A,
},

{ 54321,
76,
Array_B,
},

};



¡ Gracias por anticipado !

Desconectado Jorge555

  • PIC18
  • ****
  • Mensajes: 496
    • JMN
Re: Problema de compilación (Punteros en CCS)
« Respuesta #1 en: 04 de Julio de 2014, 07:49:21 »
¿Si quitas const de la última declaración, valores, te sigue dando el error? Estás asignando la dirección del puntero como constante, puntero que a lo mejor no se ha colocado todavía en memoria en la compilación. Pregunto ya que no sé mucho de C.

Desconectado man3s

  • PIC12
  • **
  • Mensajes: 69
Re: Problema de compilación (Punteros en CCS)
« Respuesta #2 en: 08 de Julio de 2014, 19:18:34 »
Que tal amigo, con que elimines el modificador "const" de Array_A y Array_B dejara de arrojarte ese error.

Saludos


Desconectado PicMinor

  • PIC16
  • ***
  • Mensajes: 236
Re: Problema de compilación (Punteros en CCS)
« Respuesta #3 en: 14 de Julio de 2014, 04:18:56 »
Por supuesto si elimino const me compila. El problema es que si quiero almacenar unos 100 array de cada tipo no me caben en RAM.

Desconectado Jorge555

  • PIC18
  • ****
  • Mensajes: 496
    • JMN
Re: Problema de compilación (Punteros en CCS)
« Respuesta #4 en: 14 de Julio de 2014, 23:46:43 »
 Añadiendo en la declaración del puntero que es puntero a una constante?, const long *Array_long

Desconectado PicMinor

  • PIC16
  • ***
  • Mensajes: 236
Re: Problema de compilación (Punteros en CCS)
« Respuesta #5 en: 15 de Julio de 2014, 07:45:59 »
Nada, que no hay forma.

Respecto a lo de quitar const en la declaración de los arrays os adjunto un pequeño código que no se puede compilar por insuficiente RAM

Código: [Seleccionar]
#include <16F886.h> // Cabecera del Micro Utilizado

struct Estructura {
long Valor_Long;
   char Valor_Char;
   long *Array_Long;
};

long Array_A[] = {
386, 491, 187, 290, 386, 491, 187, 290, 386, 491, 187, 290, 386, 491, 187, 290, 945, 777, 187, 290, 945,
};

long Array_B[] = {
503, 177, 431, 714, 874, 102, 503, 177, 431, 714, 874, 102, 503, 177, 431, 714, 874, 102, 431, 714, 874, 102,
};

long Array_C[] = {
386, 491, 187, 290, 386, 491, 187, 290, 386, 491, 187, 290, 386, 491, 187, 290, 386, 491, 187, 290, 386,
};

long Array_D[] = {
503, 177, 431, 714, 874, 102, 503, 177, 431, 714, 874, 102, 503, 177, 431, 714, 874, 102, 431, 714, 874, 102,
};

long Array_E[] = {
386, 491, 187, 290, 386, 491, 187, 290, 386, 491, 187, 290, 386, 491, 187, 290, 386, 491, 187, 290, 386,
};

long Array_F[] = {
503, 177, 431, 714, 874, 102, 503, 177, 431, 714, 874, 102, 503, 177, 431, 714, 874, 102, 431, 714, 874,
};

long Array_G[] = {
386, 491, 187, 290, 386, 491, 187, 290, 386, 491, 187, 290, 290, 386, 491, 187, 290, 333, 491, 187, 290, 888
};

long Array_H[] = {
503, 177, 431, 714, 874, 102, 503, 177, 431, 714, 874, 102, 503, 177, 431, 714, 874, 102, 431, 714, 874,
};


const struct Estructura Valores[] = {
{ 12345,
67,
Array_A,
},

{ 54321,
76,
Array_B,
},

{ 12345,
67,
Array_C,
},

{ 54321,
76,
Array_D,
},

{ 12345,
67,
Array_E,
},

{ 54321,
76,
Array_F,
},

{ 12345,
67,
Array_G,
},

{ 54321,
76,
Array_H,
},
};

void main() {

}


La única solución es asignar longitud fija al array en la declaración de la estructura pero hay que darle la máxima por lo que al crear la estructura se desperdicia una cantidad tremenda de memoria de programa, sobre todo si los arrays son de longitud muy desigual, lo que es mi caso precisamente.

A ver si a alguien se le ocurre la manera de compilar este código.

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Problema de compilación (Punteros en CCS)
« Respuesta #6 en: 15 de Julio de 2014, 09:41:24 »
Lo correcto es pasarte a un mcu con mas RAM. No puedes mezclar datos de RAM con ROM puesto que no se interpretan de la misma forma, los datos en la ROM se hacen transferencias hacia la ram para "usarlos", sin embargo los datos en la RAM simplemente se utilizan directamente.

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2062
Re: Problema de compilación (Punteros en CCS)
« Respuesta #7 en: 15 de Julio de 2014, 14:52:12 »
El uso de la memoria rom para almacenar datos en el ccs es posible, pero tiene ciertos detalles tecnicos que aun la gente de ccs no a logrado afinar.
Yo te recomendaria que si tienes que almacenar muchos datos utilices una memoria externa y si necesitas velocidad que esta se comunique por spi  :mrgreen:
De hecho los ejemplos que trae la ayuda del ccs; he incluso en las nuevas caracteristicas que trae el ccs 5.xxx tienen errores  :?, si puedes date un paseo por el foro de ccs y veras lo que digo.

Saludos

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Problema de compilación (Punteros en CCS)
« Respuesta #8 en: 15 de Julio de 2014, 15:53:27 »
Me parece que lo más sencillo sería repartir las cosas en dos arrays unidimensionales, todos constantes.

Un con todos los elementos:

static const unsigned int16 Valores[] = {
      12345,
      67,      
      386, 491, 187, 290,    //ex Array_A

      54321,
      76,      
      503, 177, 431, 714, 874, 102,  //ex Array_B
};

y el otro con los indices y tamaños de cada array:

const unsigned int16 offsetLen[] = {0, 6, 6, 8};           //offset of first element , length of first element, offset of second element, length of second element, etc...
            
Los length se podrían suprimir si calcula todo mendiante sólo los offsets.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.


 

anything