SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: cotolon en Viernes 9 de Noviembre de 2012, 20:39

Título: Array a Función me cambia valor
Publicado por: cotolon en Viernes 9 de Noviembre de 2012, 20:39
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
Título: Re:Array a Función me cambia valor
Publicado por: ProfesorX en Viernes 9 de Noviembre de 2012, 21:03
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/ (http://www.cplusplus.com/reference/clibrary/cstring/memcpy/)

Saludos :)
Título: Re:Array a Función me cambia valor
Publicado por: cotolon en Viernes 9 de Noviembre de 2012, 21:09
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?
Título: Re:Array a Función me cambia valor
Publicado por: ProfesorX en Viernes 9 de Noviembre de 2012, 22:24
La seguna seria la forma correcta:

Código: [Seleccionar]
memcpy(vec, rvec,sizeof(int) * cantidad);
Saludos :)
Título: Re:Array a Función me cambia valor
Publicado por: cotolon en Viernes 9 de Noviembre de 2012, 22:39
Gracias!  :smartass: