Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Devolver vectores en C

Estas en el tema de Devolver vectores en C en el foro de C/C++ en Foros del Web. Hola tengo un problema con un problema en el que debo hacer una funcion que devuelva un vector que sea suma de dos vectores que ...
  #1 (permalink)  
Antiguo 25/11/2014, 13:57
 
Fecha de Ingreso: noviembre-2014
Mensajes: 3
Antigüedad: 9 años, 5 meses
Puntos: 0
Devolver vectores en C

Hola tengo un problema con un problema en el que debo hacer una funcion que devuelva un vector que sea suma de dos vectores que yo le paso.El problema viene cuando imprimo el valor de la suma que se le va la cabeza e imprible valores alazar.
El programa guarda bien los valores que hay en el archivo que le mando abrir que son {1,2,3} y {4,5,6} asique el problema esta al devolver el vector e imprimirlo.
Código PHP:
int Suma(int vec[10],int vec_2[10],int longi,int longi_2){
    
int *vec_tot;
    
int longi_tot;
    
int i;
    
i=0;
    if(
longi!=longi_2){
        
printf("Tamaño dos vectores distintos.");
        
getchar();
    }
    else{
        
longi_tot=longi+longi_2;
        
vec_tot=(int*)malloc(longi*sizeof(int));
        for(
i=0;i<longi;i++){
            
vec_tot[i]=vec[i]+vec_2[i];
        }
        return *
vec_tot;
    }
}
int Suma(int vec[10],int vec_2[10],int longi,int longi_2);

int main(int argcchar** argv) {
    
FILE*fp;
    
int longi;
    
int longi_2;
    
int longi_tot;
    
int *vec;
    
int *vec_2;
    
int *vec_tot;
    
int k=0;
    
int n=0;
    
int i=0;
    
fp=fopen("vectores.txt","r");

    if(
fp==NULL){
        
printf("aaaa");
    }
    else{
            
            
fscanf(fp,"%d",&longi);
            for(
k=0;k<longi;k++){
                
fscanf(fp,"%d",&vec[k]);
            }
            
longi_tot=longi+longi_2;
            
fscanf(fp,"%d",&longi_2);
            for(
n=0;n<longi_2;n++){
                
fscanf(fp,"%d",&vec_2[n]);
            }
            
            *
vec_tot=Suma(vec,vec_2,longi,longi_2);
           
            
printf("A suma e: %d",vec_tot);
            
    }

    return (
EXIT_SUCCESS);

  #2 (permalink)  
Antiguo 25/11/2014, 14:28
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Devolver vectores en C

no estoy muy seguro...Pero cuando haces return *vec_tot; estas devolviendo el valor.. O no se si me equivoco XD

¿No seria return vec_tot;? Lo digo por que vec_tot ya es un puntero, lo que necesitas retornar el la posicion donde se encuentra el primer elemento del vector. O eso creo. XDD

De todas las formas ya llegara la caballeria para salvarnos ;)

*vec_tot=Suma(vec,vec_2,longi,longi_2);
es como hacer:

*vec_tot= *vec_tot;
No tiene mucho sentido lo anterior.
Creo que seria: vec_tot = Suma(vec,vec_2,longi,longi_2); // return vec_tot;

Aun que de C estoy pillao con memoria dinamica.
  #3 (permalink)  
Antiguo 25/11/2014, 20:54
 
Fecha de Ingreso: noviembre-2014
Mensajes: 36
Antigüedad: 9 años, 5 meses
Puntos: 13
Respuesta: Devolver vectores en C

Primero debes cambiar el tipo de retorno de la función de int al tipo correcto int* es decir:
Código C++:
Ver original
  1. int* suma(int *vec, int *vec_2, int longi, int longi_2);
Esto no es técnicamente devolver un vector C no permite devolver un vector entero pero un puntero al primer elemento si; y como ya te ha indicado vangodp debes retornar vec_tot no *vec_tot

Saludos
  #4 (permalink)  
Antiguo 26/11/2014, 00:03
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 11 años, 10 meses
Puntos: 49
Respuesta: Devolver vectores en C

Cita:
Iniciado por pablomr960 Ver Mensaje
Hola tengo un problema con un problema en el que debo hacer una funcion que devuelva un vector que sea suma de dos vectores que yo le paso.El problema viene cuando imprimo el valor de la suma que se le va la cabeza e imprible valores alazar.
El programa guarda bien los valores que hay en el archivo que le mando abrir que son {1,2,3} y {4,5,6} asique el problema esta al devolver el vector e imprimirlo.
Tienes un par de errores más a lo que ya te han comentado.

* Después de obtener las longitudes no dimensionas los vectores:

Código C++:
Ver original
  1. scanf ( "%d" , &longi ) ;
  2. vec =  malloc ( longi * sizeof ( int ) ) ;
  3. ................................................  
  4. scanf( "%d" , &longi_2 ) ;
  5. vec_2 =  malloc ( longi_2 * sizeof ( int ) ) ;
  6. .........................................

* Intentas imprimir vec_tot como si fuera un int en :

Código C++:
Ver original
  1. printf("A suma e: %d",vec_tot);

Cuando lo que procede es imprimir sus componentes:

Código C++:
Ver original
  1. printf ( "LA suma es: "  ) ;
  2. for ( i = 0 ; i < longi_2 ; i++ )
  3.   printf ( "%d  ", vec_tot [i] );

* Si no son de igual longitud debes salir del programa. El getchar es sólo una pequeña pausa pero el código seguirá en main e imprimirá basura en ese caso:

Código C++:
Ver original
  1. if ( longi != longi_2 ) {
  2.   printf("Tamaño dos vectores distintos.") ;
  3.   exit (1) ;
  4. }

* Como hagas un programa un poco serio se te van a acabar las líneas si usas una para cada variable. Un método es agruparlas por tipo, algo como:

Código C++:
Ver original
  1. int  i , longi , longi_2  ;
  2. int *vec , *vec_2, *vec_tot ;

Y acostúmbrate a usar si procede una misma variable para diferentes bucles que no estén anidados, no un índice para cada bucle:

Código C++:
Ver original
  1. for ( i = 0  ; i < longi ; i++ )
  2.     scanf ( "%d" , &vec [i] ) ;
  3. .........................................
  4. for ( i = 0 ; i < longi_2 ; i++ )
  5.   scanf( "%d" , &vec_2 [i] ) ;
  6. ...........................................
  7. printf ( "LA suma es: "  ) ;
  8. for ( i = 0 ; i < longi_2 ; i++ )
  9.   printf ( "%d  ", vec_tot [i] );

Como ves he usado un sola variable para los tres bucles.

* return no es una función por lo que no es necesario el uso del paréntesis en EXIT_SUCCESS.

Y para que no se diga, y ya que has propuesto un código trabajado, te pongo uno pero con scanf, para que veas que funciona. Ya tú tendrás que pasarlo a fscanf y al fichero:

Código C++:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int *Suma ( int *vec  , int *vec_2  , int longi , int longi_2  ) ;
  5.  
  6. int main ( void ) {
  7.   int  i , longi , longi_2  ;
  8.   int *vec , *vec_2, *vec_tot ;
  9.  
  10.   scanf ( "%d" , &longi ) ;
  11.   vec =  malloc ( longi* sizeof ( int ) ) ;
  12.   for ( i = 0  ; i < longi ; i++ )
  13.     scanf ( "%d" , &vec [i] ) ;
  14.    
  15.   scanf( "%d" , &longi_2 ) ;
  16.   vec_2 =  malloc ( longi_2* sizeof ( int ) ) ;
  17.   for ( i = 0 ; i < longi_2 ; i++ )
  18.     scanf( "%d" , &vec_2 [i] ) ;
  19.    
  20.   vec_tot = Suma ( vec , vec_2 , longi , longi_2  ) ;
  21.  
  22.   printf ( "LA suma es: "  ) ;
  23.   for ( i = 0 ; i < longi_2 ; i++ )
  24.     printf ( "%d  ", vec_tot [i] );        
  25.   return EXIT_SUCCESS ;
  26. }  
  27.  
  28. int *Suma( int *vec  , int *vec_2 , int longi , int longi_2  ) {
  29.     int i , *vec_tot;
  30.     if ( longi != longi_2 ) {
  31.       printf("Tamaño dos vectores distintos.") ;
  32.       exit (1) ;
  33.     }
  34.     else {
  35.       vec_tot =  malloc ( longi * sizeof ( int ) ) ;
  36.       for ( i = 0 ; i < longi ; i++ )  
  37.         vec_tot [i] = vec [i] + vec_2 [i] ;  
  38.     }
  39.     return vec_tot;
  40. }

¡¡¡Saluditos!!!


Última edición por leosansan; 26/11/2014 a las 00:12
  #5 (permalink)  
Antiguo 26/11/2014, 08:11
 
Fecha de Ingreso: noviembre-2014
Mensajes: 36
Antigüedad: 9 años, 5 meses
Puntos: 13
Respuesta: Devolver vectores en C

Cita:
Iniciado por pablomr960 Ver Mensaje
El programa guarda bien los valores que hay en el archivo que le mando abrir que son {1,2,3} y {4,5,6}
Seguro que guarda bien los números? porque yo veo algunas inconsistencias en tu código si tu intención es leer datos de un fichero con el siguiente formato:

Código C++:
Ver original
  1. 1 2 3
  2. 4 5 6
Te propongo el siguiente cambio:

Código C++:
Ver original
  1. int main(void)
  2. {
  3.     FILE* fp;
  4.     int cols = 3;
  5.     int *vec_1 = malloc(sizeof(int)*cols);
  6.     int *vec_2 = malloc(sizeof(int)*cols);
  7.     int *vec_tot = NULL;
  8.     int i;
  9.     char ch;
  10.  
  11.     fp = fopen("vectores.txt","r");
  12.  
  13.     if (fp == NULL)
  14.         perror("Error");
  15.     else
  16.     {
  17.         for(i = 0; i < cols; )
  18.         {
  19.             fscanf(fp, "%d%c", &vec_1[i++], &ch);
  20.             if(ch == '\n') break;
  21.         }
  22.         int longi_1 = i;
  23.         i = 0;
  24.         while(1 == fscanf(fp, "%d", &vec_2[i]))
  25.             if(++i == cols) break;
  26.         int longi_2 = i;
  27.         fclose(fp);
  28.  
  29.         vec_tot = Suma(vec_1, vec_2, longi_1, longi_2);
  30.     //imprimir el resultado de la suma
  31.     }
  32.     free(vec_1);
  33.     free(vec_2);
  34.     free(vec_tot);
  35.  
  36.     return 0;
  37. }

Saludos

Última edición por kutcher; 26/11/2014 a las 09:48

Etiquetas: char, devolver, funcion, int, programa, vectores
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:20.