Autor Tema: :: CCS incializa vector :: (SOLUCIONADO) ::  (Leído 2402 veces)

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

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
:: CCS incializa vector :: (SOLUCIONADO) ::
« en: 19 de Junio de 2012, 08:43:56 »
Hola
El problema es que tengo dos vectores de tamaño 4 a y b.
cuando guardo numero su primera posicion del vector B y lo muestro
todo esta bien, pero cuando opero con el otro vector A y muestro de nuevo el b
este se inicializo sin más.


Ya no se cuantass veces lo he revisado, yo no se lo que pasa ...el CCS tambine tiene duendecillos?

pongo el codigo.el punto caliente es este

---> el vector g_post[]  vale 0 0 0 0

guardo el numero     2 en pos 0 del vector

                                         2 0 0 0

entre la linea 58 y 63 del main.c  empieza la cosa rara.....

hasta la linea 60 todo bien
pero cuando entra en

cmp_n_v(n_en_v, va1,t1);

en el depurado de proteus se ve como los elementos
del vector g_post[] cambian de 2 0 0 0 -> 0 0 0 0  sin tocarlos

se han inicializados sin apenas tocarlos, como es posible?
si antes de entar en cmp_n_v(n_en_v, va1,t1);  estaban

¿Alguien ve algo más ? creo que me quede ciego y no veo el error..



                

main.c

Código: C++
  1. #include "main.h"
  2.  
  3.  
  4. void main()
  5. {
  6.  
  7.    setup_adc_ports(NO_ANALOGS|VSS_VDD);
  8.    setup_adc(ADC_CLOCK_DIV_2);
  9.    setup_wdt(WDT_OFF);
  10.    setup_timer_0(RTCC_INTERNAL);
  11.    setup_timer_1(T1_DISABLED);
  12.    setup_timer_2(T2_DISABLED,0,1);
  13.    setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
  14.    setup_comparator(NC_NC_NC_NC);
  15.    setup_vref(FALSE);
  16. //Setup_Oscillator parameter not selected from Intr Oscillator Config tab
  17.  
  18.    // TODO: USER CODE!!
  19.    printf("\n\r ON: ");
  20.    SET_TRIS_C(0x0F);
  21.  
  22. printf("\n\r **************** PRUEBAS ************************");
  23.  
  24. int8 va1[4];                  //vector inicial
  25.    int8 g_post[4];               //vector destino
  26.    int8 t1;                      //tamaño vector inical
  27.    int8 t1_g;                    //tamaño vector destino
  28.    int8 cnt_p_vf=0;              //pos wr en vector destino
  29.    int8 n_z_va1=0;               //numero de ceros en v inicial
  30.    int8 n_en_v;                  //numero a wr en v destino
  31.    int8 pos_z;                   //posicon del cero en v inicial
  32.    int8 mi_n;                    // n ale del gen aleatorio
  33.  
  34.    t1=sizeof(va1);               // tamaño del vector
  35.    t1_g=sizeof(g_post);          // tamaño del vector
  36.    ini_v_es(va1,t1);             // inicia vector 1234
  37.    ini_v(g_post,t1_g,0);         // inicia vector 0000
  38.    muestra_v(va1,t1);            // muestra vector va1
  39.    
  40.    while(t1!=0){
  41.    
  42.    printf("\n\r ------- vector va1  -------R ");
  43.    muestra_v(va1,t1);            // muestra vector
  44.    
  45.    mi_n=genera_aleatorio(t1);          // genera aleatorio
  46.    printf("\n\r num rnd: %d "mi_n);    // muestra aleatorio
  47.    
  48.    t1_g=sizeof(g_post);                // tamaño del vector de guardado
  49.    printf("\n\r g_post size: %d"t1_g); // muestra tamaño
  50.    
  51.    //ini_v(g_post,t1_g,0);             // inicializa a 0 vector guarda posiciones
  52.    printf("\n\r ------- vector g_post  -------1 ");
  53.    muestra_v(g_post,t1_g);              // muestra vector g__post
  54.    n_en_v=guarda_n_v_v(va1,g_post,mi_n,cnt_p_vf); //guarda el numero de post en v
  55.    
  56.  
  57.    
  58.    printf("\n\r ------- vector g_post  -------2 ");
  59.    muestra_v(g_post,t1_g);       // muestra vector con el valor cargado
  60.    
  61.    cmp_n_v(n_en_v, va1,t1);      // marca con cero el ale en v inicio
  62.    
  63.    printf("\n\r ------- vector va1  -------3 ");
  64.    muestra_v(va1,t1);            // muestra vector inicial
  65.    printf("\n\r ------------");
  66.    n_z_va1=cnt_0(va1,t1);         // cnt n ceros en v inicial
  67.    pos_z=post_cero(va1,0,t1);     // posicion del cero en v ini
  68.    
  69.    printf("\n\r ini(0)pos del cero: %d"pos_z);   // muestra posicion del cero
  70.    desplaza_0(va1,pos_z,t1);      // desplaza cero 0123 -> 1230
  71.    
  72.    printf("\n\r ------- vector va1  -------4 ");
  73.    printf("\n\r T1 tamaño: %d"t1);       // muestra tamaño de v ini
  74.    printf("\n\r n_ ceros: %d"n_z_va1);   // muestra n ceros de v ini
  75.    muestra_v(va1,t1);                    // muestra vector
  76.    n_z_va1=cnt_0(va1,t1);                //-- cnt n ceros en v
  77.    t1=reduce_v(n_z_va1,t1);       // reduce busqueda
  78.    
  79.    printf("\n\r ------- vector va1  -------5 ");
  80.    printf("\n\r --- vector va1 --- ");   // vector va1
  81.    muestra_v(va1,t1);             // muestra vector va1 t1=0 => usar t1_g
  82.    printf("\n\r --- vector g_post --- ");   // vector va1
  83.    muestra_v(g_post,t1_g);        // muestra vector g_post_g
  84.    cnt_p_vf=cnt_p_vf+1;           // inc post de guardado de vector
  85.    
  86.    printf("\n\r ------- xxxxxxxxxx  -------5 ");
  87.    
  88.    }



main.h

Código: C++
  1. #FUSES MCLR                     //Master Clear pin enabled
  2. #FUSES LPT1OSC                  //Timer1 configured for low-power operation
  3. #FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
  4. #FUSES PLL12                    //Divide By 12(48MHz oscillator input)
  5. #FUSES CPUDIV4                  //System Clock by 4
  6. #FUSES USBDIV                   //USB clock source comes from PLL divide by 2
  7. #FUSES VREGEN                   //USB voltage regulator enabled
  8.  
  9. #use delay(clock=20000000)
  10. #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
  11. #use i2c(Master,Slow,sda=PIN_B0,scl=PIN_B1)
  12. #use STANDARD_IO(B)
  13.  
  14. #include "milib.c"
  15. #include "mi_f_p.c"
  16. #include <stdlib.h>                 //Archivo necesario para función rand()
  17. #include <stdio.h>


milib.c

Código: C++
  1. /**********************************************************
  2. *
  3. * milib.c:  Mi libreia con mis funciones
  4. *
  5. ***********************************************************/
  6. #define length(x) (sizeof(x)/sizeof(x[0]))
  7.  
  8. #include <stdlib.h>                 //Archivo necesario para función rand()
  9.  
  10. // genera aleatorio con rango variable
  11. int8 genera_aleatorio(int8 fin){
  12.  
  13.    int8 n_aleatorio;
  14.    srand(get_rtcc());
  15.    //n_aleatorio=rand() % (6);  //Numero aleatorio entre 0 y 255
  16.    n_aleatorio=rand() % (fin);
  17.    n_aleatorio=n_aleatorio+1;  //modifico para rango de 1 a fin
  18.    return n_aleatorio;
  19. }
  20.  
  21. //--marca aleatorio y guardalo
  22. // variable semi global cnt_p_vf
  23. // contador de posicion en vector
  24. // pos1 -< pos 0 del vector
  25. int8 guarda_n_v_v(*v_ini[],*v_fin[],int8 ale,int8 cnt_p_vf){
  26.   int8 n_p_v;
  27.   ale=ale-1;
  28.   v_fin[cnt_p_vf]=v_ini[ale];
  29.   n_p_v=v_ini[ale];
  30. return n_p_v;
  31. }
  32.  
  33.  
  34. // cmp n con pos del vector y si esta le pone 0
  35. // -- # esta se modifico y dse corrigio error #
  36. //-------------------------
  37. void cmp_n_v(int8 n, int8 *v[],int8 t){
  38.   int8 a;
  39.  
  40.   for (a=0;a<t;a++){  // se corrigio error
  41.  
  42.    if(v[a] == n){
  43.       v[a] = 0;
  44.    }
  45.   }
  46.  
  47. }
  48. //---------------------------
  49. // cuenta numero de ceros en un vector
  50.  
  51. int8  cnt_0(int8 *v[],int8 t){
  52.   int8 a,cnt;
  53.  
  54.   cnt=0;
  55.     for(a=0;a<t;a++){
  56.       if(v[a]==0){
  57.          cnt=cnt+1;
  58.       }
  59.    }
  60.  return cnt;
  61. }
  62.  
  63.  
  64. //cnt pos del cero
  65. int8 post_cero(*v[],int n_busca,int8 t){
  66.  int8 n_b,post_cero;
  67.  for(n_b=0;n_b<t;n_b++){
  68.    if(v[n_b]==n_busca){
  69.     post_cero=n_b; //posicion del vector cnt desde 0
  70.    }
  71.   }
  72.   return post_cero;
  73. }
  74.  
  75.  
  76. //----------------------------
  77. // reduce la busqueda del vector
  78. //tamaño
  79. int8 reduce_v(int8 ceros,int8 t){
  80.    t=t-ceros;
  81.    return t;
  82. }
  83. //----------------------------
  84.  
  85. //desplaza los ceros al final
  86. void desplaza_0(int8 *v[],int8 pos_z,int8 t){
  87.   int8 a;  
  88.    //pos_z=pos_z-1; // te post desde cero
  89.    for(a=pos_z;a<t;a++){
  90.       v[a]=v[a+1];
  91.    }
  92.   v[t-1]=0;
  93.   //1234
  94.   //0234
  95.   //2340
  96.  
  97. }
  98. //----------------------------
  99. // guarda contenido en pos del vector
  100.  
  101. int8 guarda_n_v(int8 *v[],int8 pos,int8 num){
  102.    
  103.    pos=pos-1;
  104.   v[pos]=num;
  105.   pos=pos+1;    
  106.  return pos;
  107. }
  108. //inicializa vector a un numero
  109. void ini_v(int8 *v[],int8 p_fin,int8 num){
  110.    int8 ava;
  111.    for(ava=0;ava<p_fin;ava++){
  112.     v[ava]=num;
  113.    }
  114. }
  115.  
  116. //inicializa vector a su posicion
  117. void ini_v_es(int8 *v[],int8 p_fin){
  118.    int8 ava;
  119.    for(ava=0;ava<p_fin;ava++){
  120.     v[ava]=ava+1;
  121.    }
  122. }
  123.  
  124. //copia un vector en otro dim =
  125. void copy_v(int8 *v_ini[],int8 *v_fin[],int8 t){
  126. int8 b;
  127.    for(b=0;b<t;b++){
  128.      v_fin[b]=v_ini[b];
  129.    }
  130. }
  131. //muestra vector printea
  132. //---------------------------
  133. void muestra_v(int8 *v[],int8 t){
  134.   int c;
  135.  
  136.   printf("\n\r ");
  137.   for(c=0;c<t;c++){
  138.     printf(" %d ",v[c]);
  139.   }
  140. }
  141. //------------------------
  142.  
  143. int8 size_v(int8 &vector){
  144.   int8 n;
  145.   n=sizeof(vector)/sizeof(int8);
  146.  
  147.   return n;
  148.   }
  149.  
  150. void m_change(int8 &n){//&n
  151.    n=7;
  152. }
  153.  
  154. int8 f_change(int8 n){
  155.   n=7;
  156.   return n;
  157. }
« Última modificación: 20 de Junio de 2012, 12:59:59 por pajaro »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: :: CCS incializa vector ::
« Respuesta #1 en: 19 de Junio de 2012, 11:37:09 »
Lo más conveniente es que tu que conoces bien lo que debe hacer el código lo debugges, podes usar proteus o MPLAB SIM. Si no sabes como hacerlo, utiliza el buscador  ;-)

Si trabajas con punteros revisa que recorra el espacio especificado, si son string debes tener en cuenta de dar espacio para el carácter nulo.



Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: CCS incializa vector ::
« Respuesta #2 en: 19 de Junio de 2012, 14:15:21 »
Lo más conveniente es que tu que conoces bien lo que debe hacer el código lo debugges, podes usar proteus o MPLAB SIM. Si no sabes como hacerlo, utiliza el buscador  ;-)

Si trabajas con punteros revisa que recorra el espacio especificado, si son string debes tener en cuenta de dar espacio para el carácter nulo.



Saludos!


Hola Suky

La cosa es que hice lo que dices lo pase por el debug de proteus paso a paso le puse puntos de parada
y detecte eso que el vector cuando entra en esa funcion cmp_n_v(n_en_v, va1,t1);

esta funcion solo compara un numero pasado como parametro con los elementos un vector
de dimension t1 tambien  pasado como parametro.

Me limpia el vector, g_post[] se inicializa lo mas gordo es que todo esto esta dentro de un while
y solo hace esto la primera vez, las siguientes opera bien, mire si se trataba de un problema de variables temporales pero
no es asi es una cosa muy rara.

tambiem mire si se trataba de un problema de la primera posición de llamarla uno y ser 0 o de ser 1 y llamarla 0
pero no solo lo hace al entrar en una funcion.

una cosa muy rara.

 :(


Desconectado Zardoz

  • PIC10
  • *
  • Mensajes: 18
    • ZardoZ the Technomage
Re: :: CCS incializa vector ::
« Respuesta #3 en: 19 de Junio de 2012, 20:24:34 »
Código: [Seleccionar]
void cmp_n_v(int8 n, int8 *v[],int8 t){
 int8 aa;
 
 for (aa=0;aa<=t;aa++){
  if(v[aa] == n){
     v[aa] = 0;
  }
 }
 
}

No sera más bien (entiendo que t es tamaño del array):
Código: [Seleccionar]
void cmp_n_v(int8 n, int8 *v[],int8 t){
 int8 aa;
 
 for ( aa=0 ; aa[b]<[/b]t ; aa++){ // siempre menor que t, ya que si el array es de tamaño t, entonces aa[t] apunta fuera del array
  if(v[aa] == n){
     v[aa] = 0;
  }
 }
 
}

Además, has mirado que el valor que le pasas en cmp_n_v(n_en_v, va1,t1); en t1 sea igual o menor al tamaño del array ? Si no, fácilmente puedes estar pisando otras partes de la memoria RAM y cambiando valores de otras variables tal como describes.

Un consejo, escribir nombre de variables y funciones un poco más compresibles es más que recomendable. Y también te diré que aunque poner comentarios es bueno y altamente recomendable, poner 1 comentario por cada linea es abusar (Y te lo dice alguien al que le tildan de poner demasiados comentarios!). Si es un printf y no eres capaz de saber que esta para mostrar algún dato o mensaje, val vamos.

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: :: CCS incializa vector ::
« Respuesta #4 en: 20 de Junio de 2012, 12:59:21 »
Hola Zardoz

ahi estaba el error,
Código: C++
  1. void cmp_n_v(int8 n, int8 *v[],int8 t){
  2.  int8 aa;
  3.  
  4.  for (aa=0;aa<=t;aa++){
  5.   if(v[aa] == n){
  6.      v[aa] = 0;
  7.   }
  8.  }
  9.  
  10. }

se cambia por:

Código: C++
  1. void cmp_n_v(int8 n, int8 *v[],int8 t){
  2.  int8 a;
  3.  
  4.  for (a=0;a<t;a++){
  5.   if(v[a] == n){
  6.      v[a] = 0;
  7.   }
  8.  }
  9.  
  10. }

En el codigo anterior posteado tambien lo cambie ahora el codigo funciona.

==========================================================
Es un progrma que  te genera aleatorios apartir de las posiciones de un vector
con ello se trata de subsanar que se repita el aleatorio y disminuir las veces de generar un
nuevo aleatorio,aunque se repita el leatorio el valor es diferente.
===========================================================
El titulo:: Aleatorio / Vector /  
===========================================================

Al parecer la funcion se salia de rango y escribia fuera de la variable
y seguro que sobre escribia el otro vector.

Una vez encontrado el error ya funciona.

Cuando llevas mucho rato delante del mismo codigo los errores se camuflan tanto que no los ves.

Muchas gracias por contribuir a la solución del problema

** lo de los comentarios en mi caso es necesario ya que si llevas varios codigos a la vez no sabes por donde vas o lo que hacen, ademas en este caso gran parte de los printf eran para debuguear el codigo, y hacer el seguimiento y
el programa final no tendra ni la cuarta parte de estos.

GRacias a todos por colaborar.

Un Saludo.

« Última modificación: 29 de Junio de 2012, 14:11:38 por pajaro »