Programación General > C/C++

 Problemas funciones con entrada y retorno de arrays

(1/3) > >>

throwk:
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 --- #include <stdio.h>#include <string.h>#include <stdlib.h>  int enviaByte(unsigned int data){    int i;    unsigned int data_env;    data_env=data;      for (i=0;i<8;i++){  //DATOS                if (data_env & 0x01) { printf("1"); }        else { printf("0"); }        data_env = data_env >> 1;    }      printf(" "); } void enviaString(char *frase,int longitud){    unsigned int data;    int s;    int i;         printf("LONGITUD: %i rn",longitud);    //char cadena[longitud];    //strcpy(cadena,frase);    //  strncat(cadena, "n", 1);    for (i=0;i<longitud;i++){        data=frase[i];        enviaByte(data);    }    }   int leeByte(){    int i, data; // hay que cambiarlo por un uint8_t     data = 90;     /*    for (i = 0; i <= 7; i++) {         data <<= 1;        if (bit_is_set (TWI_PIN_SDA, bSDA))            data++;    }    */     return data;} char* leeString(){    int data;    char * frase = "aaaaa";    int i;    int longitud;    char cadena[longitud];     longitud = strlen(frase);    printf("LONGITUD2: %i rn",longitud);      for (i=0;i<5;i++){        data = leeByte();        printf("data: %c rn", (char)data);        cadena[i] = data;           }    strcpy(frase,cadena);        strncat(frase, "", 1);    printf("FRASE: %s rn", frase);    return frase;}        int main(){   int longitud = 8;  char *frase_rec;   frase_rec = leeString(); longitud = strlen(frase_rec); printf("LONGITUD1: %i rn",longitud);printf("temp2: %s rn",frase_rec);    enviaString(frase_rec,longitud); }    

m0skit0:

--- Código: C ---int longitud;char cadena[longitud]; ¿Qué valor tiene longitud?  :P

throwk:
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:
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:
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!

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa