Dev - C++ - ayuda con vectores en funciones

 
Vista:
Imágen de perfil de daniel

ayuda con vectores en funciones

Publicado por daniel (4 intervenciones) el 08/02/2015 00:51:41
buenas tardes , quería hacer una pregunta con respecto a este sencillo código y es que a la hora de pasar el vector adentro de una función con el algoritmo de inserción, la función no realiza ningún cambio en el vector , ya revise el algoritmo y si anda perfectamente , pero a la hora de introducirlo en una función y que esta me entregue el vector ordenado no lo hace , el vector sigue tal cual.
Así que mi duda es : como le hago para que dicha función si me entregue el vector ordenado ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <iostream>
#include <cstdlib>
using namespace std;
 
 
void insertion(int *a);
int main(int argc, char *argv[])
{
	int A[]={10,9,8,7,6,5,4,3,2,1};
	int r = sizeof A/sizeof*A;
 
	cout<<"Asi se ven antes de ser ordenados : "<<endl;
	for(int i=0 ; i<r ; i++)
	{
		if(i == (r-1))
			cout<<A[i];
		else
			cout<<A[i]<<",";
	}
	cout<<endl;
///////////////////////////
	insertion(A);
///////////////////////////
	cout<<"Asi se ven ya ordenados : "<<endl;
	for(int i=0 ; i<r ;i++)
	{
		if(i == (r-1))
			cout<<A[i];
		else
			cout<<A[i]<<",";
	}
	cout<<"\n"<<endl;
	system("pause");
	return 0;
}
 
 
void insertion(int *a)
{
	int r = sizeof a/sizeof*a;
	int aux;
	for(int i=1 ; i<r ; i++)
	{
		aux = a[i];
		for(int j=(i-1) ; j>=0 && a[j]>aux  ; j--)
		{
			a[j+1] = a[j];
			a[j] = aux;
		}
  	}
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 338
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

ayuda con vectores en funciones

Publicado por Martín (158 intervenciones) el 08/02/2015 01:49:53
Hola; el problema es que al pasar un puntero como parámetro de la función insertion() se pierde la información del tamaño del array A, y en insertion(), donde pones:
1
int r = sizeof a/sizeof*a;
sizeof a devuelve sizeof(int*) y sizeof *a devuelve sizeof(int), de modo que el valor de r va a depender de si estás compilando para una plataforma de 32 bits o de 64, donde cambia el tamaño de los punteros. De todos modos, usado como control en el ciclo for no es lo que se pretende.

Entonces, como al pasar un puntero con la dirección de un array se pierde su dimensión, se suele pasar como parámetro adicional esa dimensión, de modo que tu función insertion() podría quedar:
1
void insertion(int *a, int r);
y usarías ese valor de r sin volver a calcularlo.

En C++ no se recomienda el uso de arrays de estilo C, en su lugar puedes elegir usar algún contenedor de la biblioteca estándar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de daniel

ayuda con vectores en funciones

Publicado por daniel (4 intervenciones) el 08/02/2015 04:45:08
Gracias por tu respuesta :) , pero me da curiosidad , como me recomendarías usar el array entonces en c++, soy algo novato todavía, me gustaría conocer mas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 338
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

ayuda con vectores en funciones

Publicado por Martín (158 intervenciones) el 08/02/2015 06:47:14
Si conoces el tamaño con que se va a crear el array (y si tu compilador acepta el estándar C++11), y sabes que ese tamaño no va a cambiar, puedes usar el contenedor de la biblioteca estándar <arrary>, con muy pocos cambios en tu código original.

Otra opción, si el tamaño del array sí va a ser modificado durante la ejecución, o si tu compilador no acepta el estándar C++11, o si el tamaño no se conoce de antemano, podrías usar un <vector> o un <deque>, donde la elección va a depender de lo que necesites hacer.

Con un array de C++, tu programa con mínimos cambios podría quedar:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
#include <array>
 
using namespace std;
 
 
void insertion(array<int, 10>& A);
 
int main(int argc, char *argv[])
{
    array<int, 10>A { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
    int r = A.size();
 
    cout << "Asi se ven antes de ser ordenados : " << endl;
    for (int i = 0; i<r; i++) {
        if (i == (r - 1))
            cout << A[i];
        else
            cout << A[i] << ",";
    }
    cout << endl;
    ///////////////////////////
    insertion(A);
    ///////////////////////////
    cout << "Asi se ven ya ordenados : " << endl;
    for (int i = 0; i<r; i++) {
        if (i == (r - 1))
            cout << A[i];
        else
            cout << A[i] << ",";
    }
    cout << "\n" << endl;
    system("pause");
    return 0;
}
 
 
void insertion(array<int,10>& A)
{
    int aux;
    int r = A.size();
    for (int i = 1; i<r; i++) {
        aux = A[i];
        for (int j = (i - 1); j >= 0 && A[j]>aux; j--) {
            A[j + 1] = A[j];
            A[j] = aux;
        }
    }
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de vangodp
Val: 73
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

ayuda con vectores en funciones

Publicado por vangodp (287 intervenciones) el 08/02/2015 02:04:39
en la función estas esperando un puntero: void insertion(int *a). cuando le pasas A insertion(A); estas pasando un puntero que apunta al primer de los valores que es 10. En efecto esto insertion(A), es lo mismo que insertion(&A[0]);. Entonces ya no puedes obtener el tamaño de la misma forma que haces en main con sizeof de esta forma: int r = sizeof A / sizeof * A;

Si pusieras un cout<<r<<endl; luego después de hacer int r = sizeof A / sizeof * A;, tanto en main como en la función insertion, verías que lo que arrollan son dos resultados distintos. En main cout<<r<<endl;, luego después de r = sizeof A / sizeof * A imprime un 10 que significa que tienes 10 caracteres. No obstante en la función insertion cout imprime un 1 ya que como comente antes, lo que estas pasando es un puntero que apunta a un solo valor y no todo el arreglo, el bucle for no trabaja correctamente.

El problema se soluciona pasando r desde main junto con A a la función insetion: void insertion(int *a, r) o void insertion(int *a, sizeof A / sizeof * A). claro esta que debes declarar la función a modo que espere el r, y no que lo intente calcular el tamaño del arreglo dentro de insertion, ya que lo que tenemos es apenas un puntero y no el arreglo, por ese motivo hay que recibir el tamaño del arreglo junto con el puntero.

Espero que haya servido de ayuda ;)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de daniel

ayuda con vectores en funciones

Publicado por daniel (4 intervenciones) el 08/02/2015 04:40:01
Muchísimas gracias por la ayuda , de verdad se agradece bastante , ademas de que se aprende algo nuevo , saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de vangodp
Val: 73
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

ayuda con vectores en funciones

Publicado por vangodp (287 intervenciones) el 08/02/2015 14:18:05
Si quieres ayuda para aprender puedes agregarme en skype y te puedo ayudar si lo necesitas ;). Allá me llamo igual.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar