• Jueves 14 de Noviembre de 2024, 17:11

Autor Tema:  Problemas funciones con entrada y retorno de arrays  (Leído 1844 veces)

throwk

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Problemas funciones con entrada y retorno de arrays
« en: Sábado 20 de Junio de 2009, 19:42 »
0
Hola a todos, estoy intentando hacer un programa que lea varios numeros del teclado como un byte (por ejemplo un 90 que corresponde a una Z en ASCII), este dato se recoge en un array tipo char y aqui está el problema que explico mas abajo. Despues estos datos guardados en el array se escriben en formato binario. Ya se que se podria hacer todo en una funcion pero tengo que hacerlo asi por separado para hacer otros avances más adelante.

El problema en sí está en :      strcpy(frase,cadena);     que da fallo de segmentacion, imagino que porque una esta como puntero y la otra como array. He probado a hacerlo asi tb :  frase = data;   y salta aqui el fallo de segmentacion     y tb con   cadena = itoa(data);   y da error de compilacion

Espero que me puedan ayudar porque ya no se que mas probar. Muchisimas gracias


Código: C
  1.  
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5.  
  6.  
  7. int enviaByte(unsigned int data){
  8.     int i;
  9.     unsigned int data_env;
  10.     data_env=data;
  11.  
  12.  
  13.     for (i=0;i<8;i++){  //DATOS
  14.        
  15.         if (data_env & 0x01) { printf("1"); }
  16.         else { printf("0"); }
  17.         data_env = data_env >> 1;
  18.     }
  19.       printf(" ");
  20.  
  21. }
  22.  
  23. void enviaString(char *frase,int longitud){
  24.     unsigned int data;
  25.     int s;
  26.     int i;
  27.    
  28.  
  29.     printf("LONGITUD: %i rn",longitud);
  30.     //char cadena[longitud];
  31.     //strcpy(cadena,frase);
  32.    
  33. //  strncat(cadena, "n", 1);
  34.     for (i=0;i<longitud;i++){
  35.         data=frase[i];
  36.         enviaByte(data);
  37.     }
  38.    
  39. }
  40.  
  41.  
  42. int leeByte()
  43. {
  44.     int i, data; // hay que cambiarlo por un uint8_t
  45.  
  46.     data = 90;
  47.  
  48.     /*
  49.     for (i = 0; i <= 7; i++) {
  50.  
  51.         data <<= 1;
  52.         if (bit_is_set (TWI_PIN_SDA, bSDA))
  53.             data++;
  54.     }
  55.     */
  56.  
  57.     return data;
  58. }
  59.  
  60. char* leeString(){
  61.     int data;
  62.     char * frase = "aaaaa";
  63.     int i;
  64.     int longitud;
  65.     char cadena[longitud];
  66.  
  67.     longitud = strlen(frase);
  68.     printf("LONGITUD2: %i rn",longitud);
  69.  
  70.  
  71.     for (i=0;i<5;i++){
  72.         data = leeByte();
  73.         printf("data: %c rn", (char)data);
  74.         cadena[i] = data;      
  75.     }
  76.     strcpy(frase,cadena);
  77.         strncat(frase, "", 1);
  78.     printf("FRASE: %s rn", frase);
  79.     return frase;
  80. }
  81.  
  82.  
  83.  
  84.  
  85.  
  86.  
  87.  
  88.  
  89. int main(){
  90.  
  91.   int longitud = 8;
  92.   char *frase_rec;
  93.  
  94.  
  95.  frase_rec = leeString();
  96.  longitud = strlen(frase_rec);
  97.  printf("LONGITUD1: %i rn",longitud);
  98. printf("temp2: %s rn",frase_rec);
  99.  
  100.  
  101.   enviaString(frase_rec,longitud);
  102.  
  103. }
  104.  
  105.  
  106.  
  107.  

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Problemas funciones con entrada y retorno de arrays
« Respuesta #1 en: Domingo 21 de Junio de 2009, 03:09 »
0
Código: C
  1. int longitud;
  2. char cadena[longitud];
  3.  
¿Qué valor tiene longitud?  :P

throwk

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Re: Problemas funciones con entrada y retorno de arrays
« Respuesta #2 en: Domingo 21 de Junio de 2009, 09:45 »
0
La inicializo a 8 y luego le asigno el valor de la longitud del array que en este ejemplo resulta 5 porque   char * frase = "aaaaa";  ( de la funcion leeString() )

#  int longitud = 8;
...
#  longitud = strlen(frase_rec);

Gracias por contestar

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Problemas funciones con entrada y retorno de arrays
« Respuesta #3 en: Domingo 21 de Junio de 2009, 20:04 »
0
Vamos a ver... En tu código no hay ninguna incialización de longitud (línea 63). A menos que te refieras a la variable longitud en main(). Si es así, te diré que no tiene nada que ver con la otra. Deberías repasar el alcance de las variables, y el concepto de variables locales.

Además, no puedes usar una variable como tamaño de un array en char cadena[longitud];, debe ser un valor constante (error C2057: expected constant expression).

Saludos

throwk

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Re: Problemas funciones con entrada y retorno de arrays
« Respuesta #4 en: Lunes 22 de Junio de 2009, 08:35 »
0
Tienes razon, no habia caido en que el array debe ser de tamaño constante, de todas formas no esta ahi el error. Creo que me falla en la funcion LeeString:

char* leeString(){
    int data;
   char * frase = "aaaaa";
    int i;
   int longitud;
   char cadena[9];

   longitud = strlen(frase);
   printf("LONGITUD2: %i rn",longitud);


    for (i=0;i<5;i++){
      data = leeByte();
       printf("data: %c rn", (char)data);
      cadena = data;      
    }
   strncat(cadena, "", 1);
   strcpy(frase,cadena);
          
   printf("FRASE: %s rn", frase);
    return frase;
}


Segun a salida que tengo, falla justo en   strcpy(frase,cadena);   me imagino que por el tipo de datos porque uno lo declaro como puntero y el otro no. Lo que quiero conseguir es meter bytes en un array y devolverlo.  Te muestro la salida:


LONGITUD2: 5
data: Z
data: Z
data: Z
data: Z
data: Z
Fallo de segmentación

La Z viene de la funcion LeeByte que devuelve un 90 (Z en ascii)

Un saludo!

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Problemas funciones con entrada y retorno de arrays
« Respuesta #5 en: Lunes 22 de Junio de 2009, 10:27 »
0
Usa las etiquetas de código, que no cuesta ná...  :P

Tu problema radica en que LeeByte() no devuelve un byte, sino un int (4 bytes). Esto te debería dar problemas de compilación aquí:

Código: C
  1. cadena[i] = data;
  2.  
a menos que tengas silenciado tu compilador, o no hagas casos de los avisos que te marca, cosa que no te aconsejo.

cadena es char (1 byte) y data es int (4 bytes), por tanto te pasas del espacio reservado de 9 bytes que tienes. Declara char data y char LeerByte() y lo tienes solucionado.

Saludos

PD: de todo esto te avisa el compilador, a ver si le haces algo de caso  &lt;_&lt;

throwk

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Re: Problemas funciones con entrada y retorno de arrays
« Respuesta #6 en: Lunes 22 de Junio de 2009, 20:38 »
0
He cambiado el retorno de la funcion LeeByte por un char, y el data tambien como byte pero el resultado es el mismo. Me falla al meter el byte en el array frase
También he probado a meterle por parámetro la direccion del array haciendo algo similar a la funcion EnviaByte pero a la inversa y nada, sigue fallando. El compilador no me ha dado ningun error, antes con otras cosas de tipos de datos si, pero en este codigo que pego en principio no hay errores de compilacion o será que no me muestra este tipo de errores. En este caso como puedo hacer que me los muestre?

Aqui va el codigo completo:

Código: C
  1.  
  2.  
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <stdlib.h>
  6.  
  7.  
  8. int enviaByte(unsigned int data){
  9.     int i;
  10.     unsigned int data_env;
  11.     data_env=data;
  12.  
  13.  
  14.     for (i=0;i<8;i++){  //DATOS
  15.        
  16.         if (data_env & 0x01) { printf("1"); }
  17.         else { printf("0"); }
  18.         data_env = data_env >> 1;
  19.     }
  20.       printf(" ");
  21.  
  22. }
  23.  
  24. void enviaString(char *frase,int longitud){
  25.     unsigned int data;
  26.     int s;
  27.     int i;
  28.    
  29.  
  30.     printf("Longitud de la frase enviada: %i rn",longitud);
  31.  
  32.     for (i=0;i<longitud;i++){
  33.         data=frase[i];
  34.         enviaByte(data);
  35.     }
  36.    
  37. }
  38.  
  39.  
  40. char leeByte()
  41. {
  42.     char data;
  43.     data = 90;
  44.  
  45.     return data;
  46. }
  47.  
  48. char* leeString(char *frase){
  49.     int data;
  50.  
  51.     int i;
  52.     int longitud;
  53.     char cadena[9];
  54.  
  55.     longitud = strlen(frase);
  56.     printf("LONGITUD2: %i rn",longitud);
  57.  
  58.  
  59.     for (i=0;i<5;i++){
  60.         data = leeByte();
  61.         printf("data: %c rn", (char)data);
  62.         frase[i] = data;
  63.     }
  64.  
  65.     //strncat(cadena, "", 1);
  66.     //strcpy(frase,cadena);
  67.         
  68.     printf("recibida: %s rn", frase);
  69.     return frase;
  70. }
  71.  
  72.  
  73.  
  74.  

Gracias y un saludo

throwk

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Re: Problemas funciones con entrada y retorno de arrays
« Respuesta #7 en: Martes 23 de Junio de 2009, 00:15 »
0
Hola de nuevo, he estado investigando un poco mas acerca del retorno de arrays de una funcion y he hecho este codigo que funciona "a medias" y sin sentido. Lo pego y explico

Código: C
  1.  
  2.  
  3. #include <stdio.h>
  4. #include <string.h>
  5.  
  6. char *devuelve1(void);
  7. char *devuelve2(void);
  8.  
  9. int main (void)
  10. {
  11.  
  12. char uno[6];
  13. char dos[6];
  14.  
  15. strcpy(uno, devuelve1());
  16. printf("frase recibida 1: %sn", uno);
  17. strcpy(dos, devuelve2());
  18. printf("frase recibida 2: %sn", dos);
  19.  
  20. return 0;
  21. }
  22.  
  23.  
  24. char *devuelve1(void)
  25. {
  26. char *p , b[] = { 'c' , '' , 20 , 30 , 40 , 50 , 60 , 70 , 80 , 90 } ;
  27.  
  28. p = b ;
  29.  
  30. printf("valor de 1: %c rn",*(p+8));
  31.  
  32.  
  33. return p;
  34. }
  35.  
  36.  
  37. char *devuelve2(void)
  38. {
  39.  
  40. char *p , a[] = { 'b' , '' , 20 , 30 , 40 , 50 , 60 , 70 , 80 , 90 } ;
  41.  
  42. p = a ;
  43.  
  44. printf("valor de 2: %c rn",*(p+8));
  45.  
  46. return p;
  47. }
  48.  
  49.  


Hay dos funciones que devuelven un array, una contiene una b y otra una c, pero en la salida sólo se ve el array de la funcion devuelve2 que retorna una b. Esta es la salida:

valor de 1: P
frase recibida 1:
valor de 2: P
frase recibida 2: b


Si comento la funcion devuelve1() del main, la funcion devuelve2 no retorna el valor que hasta ahora retornaba. Se supone que son funciones independientes pero algo pasa que si comento la primera la otra no funciona y sólo funciona si estan las dos. Esta es la salida comentando la primera funcion:

valor de 2: P
frase recibida 2:


Ya si que no entiendo nada

Saludos

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Problemas funciones con entrada y retorno de arrays
« Respuesta #8 en: Martes 23 de Junio de 2009, 09:54 »
0
Vamos por partes. Primero sigamos con lo de antes, luego vemos esto último, que si no es un lío, ¿vale?

Estaría bien que me pusieras la función main() para que pueda probarlo en las mismas condiciones que tú.

Un saludo

throwk

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Re: Problemas funciones con entrada y retorno de arrays
« Respuesta #9 en: Martes 23 de Junio de 2009, 18:15 »
0
Lo siento, no me di cuenta que no se pegó. Este es el main


Código: C
  1.  
  2.  
  3. int main(){
  4.  
  5.   int longitud;
  6.   char *frase_rec;
  7.  
  8.  frase_rec = leeString(frase_rec);
  9.  
  10.  longitud = strlen(frase_rec);
  11.  printf("longitud de la frase recibida: %i rn",longitud);
  12.  printf("frase recibida: %s rn",frase_rec);
  13.  
  14.  
  15.   enviaString(frase_rec,longitud);
  16.  
  17. }
  18.  
  19.  
  20.  

un saludo

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Problemas funciones con entrada y retorno de arrays
« Respuesta #10 en: Miércoles 24 de Junio de 2009, 10:29 »
0
Como sospechaba  :P

No reservas espacio para la cadena char *frase_rec en main() :P. Sólo declaras un puntero, es normal que te violación de memoria, porque estás usando un puntero no inicializado, sin memoria reservada  &lt;_&lt;

throwk

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Problemas funciones con entrada y retorno de array [SOLUCION
« Respuesta #11 en: Miércoles 24 de Junio de 2009, 22:53 »
0
Acabo de solucionarlo. Lo he hecho pasando un puntero al array que contiene su direccion a la funcion LeeString. De esta manera el array recibido se guarda en esta direccion porque creo que el problema estaba en que se guardaba en una variable local y al terminar la funcion, esta direccion de memoria se pisaba.

Muchisimas gracias por tus respuestas, se agradece mucho.

 Dejo el codigo que funciona por si a alguien le pudiera venir bien ya que creo que es algo básico pero algo lioso de hacer en C.


Código: C
  1.  
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5.  
  6.  
  7. int enviaByte(unsigned int data){
  8.     int i;
  9.     unsigned int data_env;
  10.     data_env=data;
  11.  
  12.  
  13.     for (i=0;i<8;i++){  //DATOS  Envia un byte en Ascii comenzando por el LSB
  14.        
  15.         if (data_env & 0x01) { printf("1"); }
  16.         else { printf("0"); }
  17.         data_env = data_env >> 1;
  18.     }
  19.       printf(" ");
  20.  
  21. }
  22.  
  23. void enviaString(char *frase,int longitud){
  24.     unsigned int data;
  25.     int s;
  26.     int i;
  27.    
  28.  
  29.     printf("Longitud de la frase enviada: %i rn",longitud);
  30.     printf("enviada en EnviaString: %s rn", frase);
  31.  
  32.     for (i=0;i<longitud;i++){
  33.         data=frase[i];
  34.         //printf("data en EnviaString: %c rn", data);
  35.         enviaByte(data);
  36.     }
  37.    
  38. }
  39.  
  40.  
  41. char leeByte()      // a esta funcion se le puede anadir un scanf para que tome los datos del teclado.
  42. {
  43.     char data;
  44.     data = 'a';
  45.  
  46.     return data;
  47. }
  48.  
  49. char* leeString(char *frase){
  50.     int data;
  51.  
  52.     int i;
  53.     int longitud;
  54.     char cadena[9];
  55.  
  56.  
  57.     printf("direccion de la frase recibida en el main: %p rn",frase);
  58.  
  59.  
  60.     longitud = strlen(cadena);
  61.     printf("LONGITUD2: %i rn",longitud);
  62.  
  63.     for (i=0;i<8;i++){
  64.         data = leeByte();
  65.         printf("data: %c rn", (char)data);
  66.         cadena[i] = data;
  67.     }
  68.     cadena[8] = '';   // ponemos el delimitador de array
  69.  
  70.     strcpy(frase,cadena);   // copiamos la cadena en "frase" que es la variable que hemos pasado por parametro. frase = cadena tb funciona
  71.         
  72.     //frase = cadena;
  73.  
  74.     printf("recibida en LeeString: %s rn", frase);
  75.     printf("primer caracter %c rn", frase[0]);
  76.     printf("direccion en LeeString: %p rn", frase);
  77.     return frase;
  78. }
  79.  
  80.  
  81. int main(){
  82.  
  83.     int longitud;
  84.     char frase_rec[40];
  85.     char *pfrase;
  86.  
  87.     pfrase = frase_rec;
  88.  
  89.     printf("direccion del array frase en el main: %p rn",pfrase);
  90.  
  91.     strcpy(frase_rec,leeString(pfrase));
  92.  
  93.     printf("direccion de la frase recibida en el main: %p rn",pfrase);
  94.  
  95.     longitud = strlen(frase_rec);
  96.     printf("longitud de la frase recibida: %i rn",longitud);
  97.     printf("frase recibida: %s rn",frase_rec);
  98.  
  99.  
  100.     enviaString(frase_rec,longitud);
  101.  
  102. }
  103.  
  104.