Go Down

Topic: Problemas al programar con funciones y punteros (Read 2062 times) previous topic - next topic

riscking

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

ToloBCN

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?


curro92

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: [Select]
if(puntero1 == puntero2), se usa la función strcmp()
Code: [Select]
if(strcmp(puntero1, puntero2) == 0)


riscking

Aupi, voy por partes
Code: [Select]
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: [Select]
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: [Select]
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.


ToloBCN

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"?

riscking

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: [Select]

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.

ToloBCN

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?

riscking

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.

Go Up