Una duda con el almacenamiendo en c...

Iniciado por Ataulfo7, 11 Abril 2015, 16:53 PM

0 Miembros y 1 Visitante están viendo este tema.

Ataulfo7

Hola buenas, tengo este problemilla, tengo esta sintaxis.

#include <stdio.h>
#include <stdlib.h>

float * LeeVector(int n){
int v1[n];
for (int i=0;i<n;i++){
printf("Dame el %d numero del vector ",i+1);
scanf("%d",&v1[i]);
}
}

float * EscalarVector(float * v, int n, float x){}

void ImprimeVector(float * v, int n){
   for (int i=0;i<n;i++) printf("%d ",v[i]);
}

int main(){
int n;
printf("Intruduzca el tamano del vector ");
scanf("%d",&n);
LeeVector(n);
}

Pero lo que no consigo hacer, tras empezar en el main, e ir a "LeeVector", consigo crear un vector llamado v1, pero lo que no se, es como almacenarlo, para tras tener el vector ya leido con la funcion mencionada antes, poder llevarlo a la función Escalar vector, y de ahi, llevarlo a Imprimir vector, ya que si lo intento a secas poniendo ImprimirVector(v1,n) Me devuelve todo 0, y si lo pongo ImprimirVector(v1,n) me dice que la i no esta declarada.... No se si es con apuntadores, con malloc, pero no logro conseguirlo....
Gracias al que ayude! ^^  ;D

rir3760

Para empezar en la función "LeeVector" falta el valor de retorno y no puedes retornar el array "v1" ya que es local a esa función, cuando esta termina el array se destruye. Por ultimo indicas que el valor de retorno de la función es "float *" cuando los elementos del array son de tipo int.

En su lugar debes reservar un bloque de memoria mediante la función malloc usando la dirección de este como valor de retorno de la función. Mas o menos así:
#include <stdio.h>
#include <stdlib.h>

int *LeeVector(int n)
{
   int *p;
   int i;
   
   if ((p = malloc(n * sizeof *p)) != NULL)
      for (i = 0; i < n; i++){
         printf("Dame el %d numero del vector: ", i + 1);
         fflush(stdout);
         scanf("%d", p + i);
      }
   
   return p;
}

/* ... */

int main(void)
{
   int n;
   int *p;
   
   puts("Intruduce el tamano del vector:");
   scanf("%d", &n);
   p = LeeVector(n);
   
   /* Uso del bloque apuntado por p */
   
   free(p);
   
   return EXIT_SUCCESS;
}


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

Ataulfo7

Me has arreglado el problema de almacenar el vector con malloc, Gracias!
Pero seguiria con el mismo problema, de que cuando llamo a la función imprime vector, la pongo tal que asi, ImprimeVector(p,n); Y me da de vuelta solo 0 como números haya puesto...
Pero sin embargo en el propio main si lo escribo asi for (int i=0;i<n;i++) printf("%d ",*p);
Si me sale...
:-X :-X

rir3760

Eso sucede porque en el bloque de memoria almacenas los valores leídos con scanf de tipo int, para que las demás funciones tengan el comportamiento esperado las debes modificar en la misma linea: se recibe un puntero de tipo "int *" y se procesan los elementos del bloque como enteros.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language