Go Down

Topic: Lio con tamaño variables char (Read 1 time) previous topic - next topic

riscking

Buenas, con el tema de las memorias y demas y comprobando tamaños y cuanto ocupan las variables me ha surgido una duda, y espero  que me la podais aclarar.
char nombre[]="12345";
Serial.println (sizeof nombre);  //me dice 6, si tiene 5 digitos no deberia ser 4 en vez de 6????


byte test [sizeof nombre];
byte err = readEEPROM (0x50,4, test, sizeof test); //lo leo de la memoria eeprom

int f=atoi((char *) test); //convierto la cadena a integet sin problema y integer ahora contiene 12345

char str[0]; //declaro str como cadena y pongo 0 porque no me deja ponerla vacia

itoa (f, str, 10);  10 significa base decimal para convertir el integer a char, y ahora aqui mi duda si en un principio el char tenia un tamaño de 6 segun esto ahora tiene un valor de 0 su tamaño, como se como esto???? porque funcionar funciona.
Serial.println (str);


curro92

#1
Feb 27, 2013, 06:22 am Last Edit: Feb 27, 2013, 06:27 am by curro92 Reason: 1
Hola,
en el lenguaje C la cadena char siempre tiene un carácter final, el carácter null, representado como '\0'. Por eso,  tu cadena char nombre[]="12345" ocupa 6 bytes, los cinco dígitos más el null. Y también por eso, para leer una cadena char se testea el null
while(nombre[n] != '\0')
  ...

En lo que declaras como char str[0] en realidad no puedes guardar nada, tan solo el null

Quote
me dice 6, si tiene 5 digitos no deberia ser 4 en vez de 6?

Una cosa es que el índice de las posiciones de la cadena sea 0,1,2,3... Y otra el tamaño, que se expresa de forma normal, empezando a contar desde 1.




 

fm

Realmente debería devolverte 2 (arquitectura de 8 bits, pero los punteros ocupan 16bits) porque es el tamaño de un puntero. Por alguna razón el gcc esta devolviendo el tamaño de lo que contiene.

Lo que se debería usar es strlen y como bien dicen un "string" tiene al final el '\0' por lo que la longitud sería 6.
   

riscking

vale str con sizeof me devuelve 0 mientras que con strlen me devulve 5, q si he leido bien cuenta hasta el \0 asique veo que no es 0 , jeje, ya me cuadra mas, lo del 4 se me fue quise poner 5 se q cuenta desde 1 pero asi mas claro agua, ahora una cuestion con punteros y referencias, estoy leyendo una memoria eeprom y lo estoy haciendo con ambas y realmente funciona pero quisiera saber si es la mejor manera.

Code: [Select]


//funcion de lectura, la escritura lo hago practicamente igual
void eeprom_read_page( int deviceaddress, unsigned int eeaddress,
  byte *buffer, int length )
  {
   Wire.beginTransmission(deviceaddress);
   Wire.write((int)(eeaddress >> 8));   // MSB
   Wire.write((int)(eeaddress & 0xFF)); // LSB
   Wire.endTransmission();
   Wire.requestFrom(deviceaddress,length);
   int c = 0;
   for ( c = 0; c < length; c++ )
   if (Wire.available()) buffer[c] = Wire.read();
  } 
char ji[] = "12345"; //el dato almacenado en la posicion 0 y sucesivas

//comienzo lectura
char pi3[0];
Serial.println (sizeof ji);
byte *Dato3 = (byte *) &pi3; //con esta linea me ahorro el convertir nada paso el byte *buffer a int o a char, pero no entiendo muy bien como funciona ni si ocupa demasiado o se puede mejorar.
eeprom_read_page(0x50,0,Dato3,sizeof ji);
delay(10);
Serial.println(pi3); //saco el valor por el serial monitor y va pero esto es un char o un *char


La verdad que tengo un cacao con los punteros y refencia de aupa.

fm

Milagroso que funcione. Si puedo te comento algo.
   

Go Up