• Martes 30 de Abril de 2024, 14:39

Autor Tema:  Array a Función me cambia valor  (Leído 2559 veces)

cotolon

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Array a Función me cambia valor
« en: Viernes 9 de Noviembre de 2012, 20:39 »
0
Hola a todos, soy Cotolon. Y tengo una duda. Bueno voy a explicar el código antes de la pregunta (después del código está la pregunta).  hace esto :

- (Input) Pide al usuario tamaño del array
- (Input) Pide al usuario introducir los valores tipo int del array
- (Output) Muestra el array
- (Output) Muestra el primer elemento sumado 2, por cada 0 que haya en el array
- (Output) Muestra el array

Código: [Seleccionar]

#include <iostream>
#include <conio.h>
using namespace std;

int suma2PrimeroPorCadaCero(int[], int);

int main()
{
    int cantidad;
    cout << "Tamanio array?: "; cin >> cantidad;
    cout << endl;
    int vec[cantidad], i;
    for(i = 0; i < cantidad; i++ )  cin >> vec[i];
    cout << endl << endl;
    //Tu vector:
    for(i = 0; i < cantidad; i++ )  cout << vec[i] << "   ";
    cout << endl << endl;
    //Primer elemento sumado 2 por cada cero
    cout << "Primer elemento: " << suma2PrimeroPorCadaCero(vec, cantidad);
    cout << endl << endl;
    //Tu vector:
    for(i = 0; i < cantidad; i++ )  cout << vec[i] << "   ";
    cout << endl << endl;

    getche();
    return 0;
}

int suma2PrimeroPorCadaCero(int arr[], int tamanio){
    for (int x = 0; x < tamanio; x++)
            if (arr[x] == 0)
                arr[0] +=2;
    return arr[0];
}


Bueno esta es mi duda:

Yo ingrese por ejemplo  6 -> 6 = tamaño array

Ingreso estos valores:  4  5   0  3   0   0

Me muestra el array: 4  5   0  3   0   0

Hay 3 ceros así que suma +6 al 4.

Muestra Primer elemento array:  10

Muestra el array  10  5   0  3   0   0

El problema aquí, es que creo que el parámetro "arr[]" está funcionando como un puntero ya que me cambia el valor del primer elemento de 4 a 10.
¿Hay alguna forma de pasar el array "vec" a la función, sin que me cambie el valor de algún elemento de "vec"

La única solución por ahora que hice fue en main crear un "rvec" que sería un array de respaldo que contiene los valores de "vec" y después de llamar a la función, le asignaría a los valores de "vec" los valores de "rvec"

Gracias a todos por pasar y comentar

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re:Array a Función me cambia valor
« Respuesta #1 en: Viernes 9 de Noviembre de 2012, 21:03 »
0
Hola cotolon, bienvenido al foro
A ver tratataremos de responder a tus dudas
Citar
El problema aquí, es que creo que el parámetro "arr[]" está funcionando como un puntero ya que me cambia el valor del primer elemento de 4 a 10.

Exactamente, tal como mencionas es correcto, en C/C++ los arreglos funcionan como punteros, es decir, en el caso de arreglos, en lugar mandar un copia del vector, SIEMPRE, se manda la direccion del vector. Y esto no se puede cambiar, el lenguaje C asi esta diseñado para funcionar.


Citar
¿Hay alguna forma de pasar el array "vec" a la función, sin que me cambie el valor de algún elemento de "vec"

Para redondear lo dicho anteriormente, NO HAY FORMA de hacer lo que dices, pero tal como descubriste, la solucion para evitar cambios en tu arreglo original es hacer una copia del arreglo, y mandarle como parametro a la funcion la copia.

Puedes hacer la copia manualmente o puedes utilizar la funcion memcpy de la libreria string.h/cstring

http://www.cplusplus.com/reference/clibrary/cstring/memcpy/

Saludos :)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

cotolon

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Re:Array a Función me cambia valor
« Respuesta #2 en: Viernes 9 de Noviembre de 2012, 21:09 »
0
Muchas gracias profesorX

Bueno si quisiera copiar el array debería ser


memcpy(vec, rvec,sizeof(rvec));  ? 

memcpy(vec, rvec,sizeof(int) * cantidad);  ? 

O de alguna otra forma?

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re:Array a Función me cambia valor
« Respuesta #3 en: Viernes 9 de Noviembre de 2012, 22:24 »
0
La seguna seria la forma correcta:

Código: [Seleccionar]
memcpy(vec, rvec,sizeof(int) * cantidad);
Saludos :)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

cotolon

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Re:Array a Función me cambia valor
« Respuesta #4 en: Viernes 9 de Noviembre de 2012, 22:39 »
0
Gracias!  :smartass: