• Jueves 14 de Noviembre de 2024, 04:26

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - throwk

Páginas: [1]
1
C/C++ / Problemas funciones con entrada y retorno de array [SOLUCION
« en: Miércoles 24 de Junio de 2009, 22:53 »
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.  

2
C/C++ / Re: Problemas funciones con entrada y retorno de arrays
« en: Martes 23 de Junio de 2009, 18:15 »
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

3
C/C++ / Re: Problemas funciones con entrada y retorno de arrays
« en: Martes 23 de Junio de 2009, 00:15 »
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

4
C/C++ / Re: Problemas funciones con entrada y retorno de arrays
« en: Lunes 22 de Junio de 2009, 20:38 »
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

5
C/C++ / Re: Problemas funciones con entrada y retorno de arrays
« en: Lunes 22 de Junio de 2009, 08:35 »
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!

6
C/C++ / Re: Problemas funciones con entrada y retorno de arrays
« en: Domingo 21 de Junio de 2009, 09:45 »
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

7
C/C++ / Problemas funciones con entrada y retorno de arrays
« en: Sábado 20 de Junio de 2009, 19:42 »
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.  

Páginas: [1]