• Jueves 14 de Noviembre de 2024, 19:42

Autor Tema:  Vector Por Valor  (Leído 1962 veces)

AnioN

  • Miembro MUY activo
  • ***
  • Mensajes: 339
    • Ver Perfil
Vector Por Valor
« en: Lunes 10 de Julio de 2006, 15:54 »
0
Hola, mi idea es saber si se puede pasar un vector a una funcion por valor?, o sea, si modifico el mismo dentro de la funcion que no se modifique en el main. Por ej:

Código: Text
  1. #include<stdio.h>
  2. #include<conio.h>
  3.  
  4. void vectorPuntero(int *v, int ce);
  5. void vectorCopia(int v[], int ce);
  6.  
  7.  
  8. void main() {
  9.  
  10.   int vecmain[5];
  11.   int i;
  12.  
  13.   for(i = 0;i < 5;i++) {
  14.     vecmain[i] = 0;
  15.   }
  16.  
  17.   for(i = 0;i < 5;i++) {
  18.     printf("\nvecmain[%d] = %d",i,vecmain[i]);
  19.   }
  20.  
  21.   vectorPuntero(vecmain, 5);
  22.  
  23.   for(i = 0;i < 5;i++) {
  24.     printf("\nvecmain[%d] = %d",i,vecmain[i]);
  25.   }
  26.  
  27.   vectorCopia(vecmain,5);
  28.  
  29.   for(i = 0;i < 5;i++) {
  30.     printf("\nvecmain[%d] = %d",i,vecmain[i]);
  31.   }
  32.  
  33.   printf("\nPresione una tecla para salir");
  34.   getch();
  35. }
  36.  
  37.  
  38. void vectorPuntero(int *v, int ce) {
  39.   int aux;
  40.  
  41.   for(aux = 0;aux < ce;aux++) {
  42.     printf("\nv[%d] = %d", aux, *(v+aux));
  43.   }
  44.  
  45.   for(aux = 0;aux < ce;aux++) {
  46.     *(v+aux) = 1;
  47.   }
  48.  
  49.   for(aux = 0;aux < ce;aux++) {
  50.     printf("\nv[%d] = %d", aux, *(v+aux));
  51.   }
  52.  
  53. }
  54.  
  55.  
  56. void vectorCopia(int v[], int ce) {
  57.   int aux;
  58.  
  59.   for(aux = 0;aux < ce;aux++) {
  60.     printf("\nv[%d] = %d", aux, v[aux]);
  61.   }
  62.  
  63.   for(aux = 0;aux < ce;aux++) {
  64.     v[aux] = 2;
  65.   }
  66.  
  67.   for(aux = 0;aux < ce;aux++) {
  68.     printf("\nv[%d] = %d", aux, v[aux]);
  69.   }
  70. }
  71.  
En el codigo anterior cree dos funciones para manejar un vector, en una usando aritmetica de punteros y en el otro manteniendo la indexacion. Ambas modifican el vector del main, o sea no se pasa por valor el parametro.

carmamezo

  • Miembro MUY activo
  • ***
  • Mensajes: 232
    • Ver Perfil
Re: Vector Por Valor
« Respuesta #1 en: Lunes 10 de Julio de 2006, 16:19 »
0
No se puede, un vector o array sólo puede pasarse a una función mediante su dirección, si quieres pasarle el valor de sus elementos deberás hacerlo pasándole uno a uno cada uno de los valores.
Un saludo.
No hay tonto más molesto que el ingenioso.

tonilope

  • Miembro activo
  • **
  • Mensajes: 51
    • Ver Perfil
Re: Vector Por Valor
« Respuesta #2 en: Lunes 10 de Julio de 2006, 17:15 »
0
Tendrás que copiar el vector en otro vector auxiliar dentro de la función que lo recibe.

Salu2 ;)

AnioN

  • Miembro MUY activo
  • ***
  • Mensajes: 339
    • Ver Perfil
Re: Vector Por Valor
« Respuesta #3 en: Lunes 10 de Julio de 2006, 18:12 »
0
y con respecto a las matrices bidimensionales pasa lo mismo, no?. Por que a veces en algunas funciones se recibe una matriz asi:
Código: Text
  1. void _matriz(int a[][12], int x, int y);
  2.  

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: Vector Por Valor
« Respuesta #4 en: Lunes 10 de Julio de 2006, 18:53 »
0
Si no deseas que se modifiquen los arreglos, pásalos como constantes.

Código: Text
  1.  
  2. void vectorCopia(const int v[], int ce);
  3.  
  4.  

Ahora, si quieres pasar un arreglo por valor, la única forma de hacerlo es meterlo dentro de una estructura y pasar dicha estructura a la función (las estructuras y clases si pueden pasarse por valor).

Saludos,
JJ (Geo).
La imaginación es el límite.
Hardware & Software | Mexchip

carmamezo

  • Miembro MUY activo
  • ***
  • Mensajes: 232
    • Ver Perfil
Re: Vector Por Valor
« Respuesta #5 en: Miércoles 12 de Julio de 2006, 11:03 »
0
Tampoco.
Los arrays bidimensionales se deben pasar igualmente por referencia no por valor.  
Esa manera de definirlos permite su uso dentro de la función como arreglo y no como puntero pues la gente suele tener problemas utilizando apuntadores de apuntadores...  Al final tanto asterisco vuelve loca a la gente, sobre todo porque hay que ser muy consciente de la prioridad de los operadores...:
no es lo mismo *a+1 que *(a+1)...
*a+1 = a[0] + 1;
*(a+1) = a[1];
En fin que resulta más fácil usar a[1] que *(a+1) y ya no te digo si te metes con arrays de varias dimensiones, hasta yo sudo con los punteros de punteros y de vez en cuando me lio... :lol:
Creo que era algo así... lo voy a hacer sin compilador así que si meto la pata que alguien me lo corrija sin dudarlo:
a[2][5] = *(*(a+2)+5);

Un saludo.
 :lightsabre:
No hay tonto más molesto que el ingenioso.

AnioN

  • Miembro MUY activo
  • ***
  • Mensajes: 339
    • Ver Perfil
Re: Vector Por Valor
« Respuesta #6 en: Miércoles 12 de Julio de 2006, 16:13 »
0
Muchas gracias. :D