Ver Mensaje Individual
  #4 (permalink)  
Antiguo 26/11/2014, 00:03
Avatar de leosansan
leosansan
 
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 12 años
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