CCS Problema al imprimir un vector

Buenas, tal vez alguien puede ayudarme con este problema que llevo rato y no veo en que estoy fallando. tengo dos funciones: void SimularSalidas y void Guardar. En la función SimularSalidas llamo a Guardar y los paramentros que le envío son &valor, &valores. He verificado y a la función Guardar le llegan correctamente los datos, el problema esta en que cuando quiero mostrar los datos en VECTOR FILA algunos valores no son los correctos como muestro en la imagen adjunta y a continuacion
Código:
VECTOR FILA              [ 0.00   0.00   0.00   4.00   5.00     6.00   0.00]

VECTTOR COLUMNA          [2.00    4.00   6.00   8.00   10.00   12.00  0.00]

lo correcto que deberia mostrar es lo siguiente

Código:
VECTOR FILA              [ 1.00   2.00   3.00   4.00   5.00     6.00    0.00  ]

VECTTOR COLUMNA           [2.00    4.00   6.00   8.00   10.00   12.00  0.00]

CSS:
#include <punteroarray.h>
#use rs232(baud =9600, parity=N, xmit=PIN_c6, rcv=pin_c7, bits=8)

int cont1=0;

void SimularSalidas();
void Guardar ( float *Fila1, float *Columna1 );

void main()
{
    while(TRUE)
   {
        SimularSalidas();
   }
}


void SimularSalidas(){
float valor=0;
float valores=0 ;

for (int Fila =0; Fila<2; Fila++)
{
 
   for(int Columna =0; Columna<3; Columna++){

   valor = valor +1;
   valores = valores +2;

   printf(" (Simular Salidas: [ %f ] [%f]) \r", valor, valores);  
   Guardar( &valor, &valores)   ;
   }
}                                 
}


void Guardar ( float *Fila1, float *Columna1 )
{

float X [10];
float Y [10];

cont1 ++;

X [cont1-1]= *Fila1;
Y [cont1-1]= *Columna1;


if (cont1==6)
{
   printf("VECTOR FILA    [   ");
   for (int j=0; j<=6;j++){
   printf(" %f: ",X [j]);
   }
   printf("]\r");
}

if (cont1==6)
{
   printf("VECTOR COLUMNA [   ");
   for (int K=0; K<=6;K++){
   printf(" %f: ", Y [K]);
   }
   printf(" ]\r");
}

}
 

Adjuntos

  • punteros.png
    punteros.png
    13.7 KB · Visitas: 8

D@rkbytes

Moderador
Supongo que dentro del archivo "punteroarray.h" solo está la configuración del PIC
Lo digo porque no se ve que se esté usando algo que no se encuentre en el programa.

El problema debe ser porque cont1 se sigue incrementando.
Debería limpiarse cuando se cumpla if (cont1 == 6)

Y sería mejor que cont1 se incremente después, así evitas restar 1
Por ejemplo:
C:
    X[cont1]= *Fila1;
    Y[cont1]= *Columna1;

    cont1 ++;

Como recomendación:
Si tu PIC tiene módulo USART sería mejor que lo uses en lugar de hacerlo por software.
 
Simulé tu código, el problema desaparece si a los arrays X[10] e Y[10] los declarás globales.

No se, como si el CCS pisa memoria que no debe cuando es local.
 

D@rkbytes

Moderador
Simulé tu código, el problema desaparece si a los arrays X[10] e Y[10] los declarás globales.
También lo pensé, pero al hacer eso el programa se detiene y los datos aunque correctos no mantienen la secuencia que deben.
No sé, como si el CCS pisa memoria que no debe cuando es local.
Lo que pasa es que como cont1 se sigue incrementando se produce un error cuando se trata de escribir en un vector que no existe.

Yo arreglé el problema de esta forma:

C:
void Guardar (float *Fila1, float *Columna1)
{
    static float X[10];
    static float Y[10];
    
    X[cont1]= *Fila1;
    Y[cont1]= *Columna1;
    
    cont1 ++;

    if (cont1 > 5)
    {
        cont1 = 0;
        
        printf("VECTOR FILA    [");
        
        for(int j = 0; j < 7; j++)
            printf("%f :",X[j]);
        printf("]\r");
        
        printf("VECTOR COLUMNA [");
        
        for (int K = 0; K < 7; K++)
            printf("%f :", Y[K]);
        puts("]\r");
    }
}
 

Adjuntos

  • Prueba.rar
    29.5 KB · Visitas: 2

Dr. Zoidberg

Well-known-Papá Pitufo
Con el static haces lo mismo que si las declaras globales (van al heap) solo que el scope se mantiene local.
El problema con los PICs gama "media" (mas bien chica) es que tienen poco stack...algo de 8 bytes recuerdo haber leído, pero yo tuve problemas parecifos anidando invocaciones a funciones...
 
También lo pensé, pero al hacer eso el programa se detiene y los datos aunque correctos no mantienen la secuencia que deben.
....
Me pasaba lo mismo y reseteaba cont1 mas o menos como hiciste vos.

Hace un rato me di cuenta de lo que pasaba, y era evidente: Declara los vectores como locales, carga un valor y retorna - > como era local, una vez que sale se es libre de sobreescribir esa zona. Solamente como static o global se mantiene reservada.
...
El problema con los PICs gama "media" (mas bien chica) es que tienen poco stack...algo de 8 bytes recuerdo haber leído, pero yo tuve problemas parecifos anidando invocaciones a funciones...
El stack en los pics no es accesible desde desde el programa y solamente van a parar ahi las direcciones de retorno. Lo podes corromper por anidación pero nunca te va a pisar memoria porque es circular.
A diferencia de la compilación en C para entornos x86, donde los argumentos de llamada y variables locales van de cabeza al stack, en los pics van a memoria y comparte el espacio con demás variables locales.
En cambio en C para avr, como tienen muchos registros internos los usa para los argumentos de llamada.
 
Última edición:
Hace un rato me di cuenta de lo que pasaba, y era evidente: Declara los vectores como locales, carga un valor y retorna - > como era local, una vez que sale se es libre de sobreescribir esa zona. Solamente como static o global se mantiene reservada.

Gracias por sus respuestas, me han ayudado a comprender lo que sucedía :) La solución es declararla como static

static float X[10]; static float Y[10];

He aprendido mucho en estos foros... Gracias :)
 

Dr. Zoidberg

Well-known-Papá Pitufo
El stack en los pics no es accesible desde desde el programa y solamente van a parar ahi las direcciones de retorno. Lo podes corromper por anidación pero nunca te va a pisar memoria porque es circular.
A diferencia de la compilación en C para entornos x86, donde los argumentos de llamada y variables locales van de cabeza al stack, en los pics van a memoria y comparte el espacio con demás variables locales.
En cambio en C para avr, como tienen muchos registros internos los usa para los argumentos de llamada.
Si señor!! Tiene toda la razón (y) (y) (y)
PD: en la serie 18 de los PICs el stack-pointer y el TOS son accesibles pero de una forma medio rara...
 
Arriba