Pages: [1]   Go Down
Author Topic: Problemas al programar con funciones y punteros  (Read 1489 times)
0 Members and 1 Guest are viewing this topic.
Orduña- Bizkaia
Offline Offline
Sr. Member
****
Karma: 0
Posts: 317
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola, tengo bastante avanzao mi proyecto pero depurando codigo me ha salido un problemilla que no llego a comprender porque.
Tengo una funcion que lee de una sd dos archivos

char *puntero[10]; //declarada como global el arrray para las lineas del segundo archivo
char *puntero2[10]; //declaro como global el arrray para las lineas del segundo archivo

void compara(char archivo1[], char archivo2[]){

leo el primer archivo y quedan
*puntero[0] -->primera linea archivo 1
*puntero[1] -->primera linea archivo 2
*puntero[2] -->primera linea archivo 3

leo el segundo archivo y quedan

*puntero2[0] -->primera linea archivo 1
*puntero2[1] -->primera linea archivo 2

comparo para hacer otras cosas
int h;
for(h=0;h<3;h++){
if(*puntero[0]==*puntero2[1]){
Serial.Print("funciona");
}
}

Asi funciona correctamente pero dado que las lecturas las repito mucho para otras cosas queria hacer q lea cada archivo de forma separada, pero se me corrompen los datos o no los lee bien y no estiendo el porque, si hago asi:
void leer_primero(char archivo1[]){
*puntero[0] -->primera linea archivo 1
*puntero[1] -->primera linea archivo 2
*puntero[2] -->primera linea archivo 3
}
void leer_segundo(char archivo2[]){
*puntero2[0] -->primera linea archivo 1
*puntero2[1] -->primera linea archivo 2
}

void compara(){

leer_primero("archivo1.txt");   //llamo a la funciona para leer el primero
leer_segundo("archivo2.txt"); //llamo a la funcion para leer el segundo

int h;
for(h=0;h<3;h++){
if(*puntero[0]==*puntero2[1]){
Serial.Print("funciona");}
}

De esta segunda manera los datos se corrompen y no se porque, es posible que se guarden en la misma parte de memoria o algo al hacerlo por separa cuando haciendolo en una misma funcion funciona?? es la unica explicacion q tengo porque si la programacion esta bien deberia ir bien.

A ver si a alguien le ha pasado esto antes, no he puesto el codigo de lectura para no extender la cosa, a ver si doy con el problema o si se puede solucionar, ya que me rebaja bastates el codigo.

Nos vemos y gracias de antemano.
Un saludo
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 45
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Perdón por mi ignorancia. ¿Porqué usas los corchetes al declarar el los argumentos)

esto: void leer_segundo(char archivo2[])

siempre he usado : void leer_segundo(char *archivo2)

¿Es lo mismo?

Logged

Euskadi
Offline Offline
God Member
*****
Karma: 16
Posts: 710
Arduinotarrak
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola,
no he probado nunca leer desde  una SD, pero si estás usando dos punteros a cadenas char, no creo que se puedan comparar dos cadenas directamente
Code:
if(puntero1 == puntero2)
, se usa la función strcmp()
Code:
if(strcmp(puntero1, puntero2) == 0)

Logged

Orduña- Bizkaia
Offline Offline
Sr. Member
****
Karma: 0
Posts: 317
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Aupi, voy por partes
Code:
if(puntero1 == puntero2)
curro92 como dices tu así no funciona tienes q ponerle * para que compare el contenido e indicarle cual de los strings del array es :
Code:
if(*puntero[0]==*puntero2[1]) //compara la primera linea del primer archivo con la segunda del segundo
Tambien es valida la otra opcion que has dicho.
Code:
if(strcmp(puntero[h], puntero2[0])==0)

ToloBCN creo que el funcionamiento es el mismo porque con char archivo[] le digo que le voy a pasar una cadena sin tamaño definido y con *archivo le paso el contenido donde apunta el puntero.

El problema es porque  en la primera forma si que leo los archivos, que es como es realmente osea:
90
180
270
360

180
25
36

y en la segunda
180
À



¼ã¼
¼
À
Vamos que se corrompen y no se como evitarlo, ni porque se da eso, no lo acabo de entender.
Nos vemos.

Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 45
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Si utilizas punteros es por que las "lineas", los datos reales, están en algún sitio. ¿ No los machacarás al leer repetidas veces? ¿Están bien "protegidos"?
Logged

Orduña- Bizkaia
Offline Offline
Sr. Member
****
Karma: 0
Posts: 317
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Solo tengo declarados los punteros como globales, yo me imagino que el probla es ese que al leer dos veces se machacan los datos pero esque no se como protegerlos, te pongo el codigo estero que esta dentro de la funcion que quiero partir en tres partes.
Yo esque vengo de programar con php y estos problemas la verdad que ahi no se tienen y me traen de cabeza.

Code:
void escritura(char fileopen[],char fileopen2[]){

    if (!card.init(SPI_HALF_SPEED)) error("card.init failed");

  // initialize a FAT volume
  if (!volume.init(&card)) error("volume.init failed");

  // open the root directory
  if (!root.openRoot(&volume)) error("openRoot failed");

  if (file.open(&root, fileopen, O_READ)) {  }
  else{
    error("file.open failed");
  }
   char texto[33];  
  int n;

  int16_t c;

  n = 0;
  while ((c = file.read()) > 0)
  {  
    texto[n++] = c;
  }

  texto[n] = '\0';
  puntero[0]=texto;
  byte b= 0;
  byte v =1;
  while(texto[b]) // hasta que termine
  {
    if(texto[b] == '+')
    {
      texto[b] = '\0'; // sustituyo salto de linea por fin
      puntero[v] = &texto[b+1]; // puntero al principio de la cadena
      v++;
    }
    b++;
  }
file.close();
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if (file.open(&root, fileopen2, O_READ)) {
    //Serial.println("Opened"+fileopen2);
    //lcd.LCD_3310_write_string(1, 2, "Opened PRINT00.TXT", MENU_NORMAL);
  }
  else{
    error("file.open failed");
  }
   char texto2[33];

  int16_t p;

  n = 0;
  while ((p = file.read()) > 0)
  {  
    texto2[n++] = p;
  }

  texto2[n] = '\0';
  puntero2[0]=texto2;
  b= 0;
  int m =1;
  
  while(texto2[b]) // hasta que termine
  {
    if(texto2[b] == '+')
    {
      texto2[b] = '\0'; // sustituyo salto de linea por fin
      puntero2[m] = &texto2[b+1]; // puntero al principio de la cadena
      m++;
    }
    b++;
  }
  byte h;
  for(h=0;h<v;h++)
 {  
   if(*puntero[h]==*puntero2[0]){
     lcd.LCD_3310_write_string(10, 0, "Menu", MENU_NORMAL);
 lcd.LCD_3310_write_string(12, 2, "^", MENU_NORMAL);
  lcd.LCD_3310_write_string(12, 4, "_", MENU_NORMAL);
  lcd.LCD_3310_write_string(30, 1, puntero[h-1], MENU_NORMAL);
  lcd.LCD_3310_write_string(65, 2 , "*", MENU_NORMAL );
   lcd.LCD_3310_write_string_big(20, 2, puntero[h], MENU_NORMAL);
   lcd.LCD_3310_write_string(30, 5 , puntero[h+1], MENU_NORMAL);

  }
 }

  file.close();
  root.close ();
  }


Un saludo y gracias.
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 45
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Nunca he usado esta librería, no seré el más adecuado para responder pero... ¿No tendrás el fallo en open.file,  en root.openRoot ó en el close() de alguno de ellos?
Logged

Orduña- Bizkaia
Offline Offline
Sr. Member
****
Karma: 0
Posts: 317
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

No se que puede fallar, esas funciones lo unico que hacen es inicializar la ruta donde esta el archivo y abrir y cerrar el archivo, no se,
De momento estoy metiendo todas las funciones enteras, y el programa esta pesando 21300 bytes, y llevo la mitad mas o menos, espero q me llegue con los 30720 de maximo que permite el arduino.
Logged

Pages: [1]   Go Up
Jump to: