elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema con vector y direcciones
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema con vector y direcciones  (Leído 5,457 veces)
OnLOL

Desconectado Desconectado

Mensajes: 25


Ver Perfil
Problema con vector y direcciones
« en: 21 Noviembre 2010, 03:47 am »

Estoy precticando, e intente hacer un "ordenador" de numeros, los numeros dentro de un vector, se los deberia ordenar de menor a mayor, pero el compilador me esta dando problemas, se que es con las direcciones pero no se donde tocar, fuero de eso el programa no esta terminado, por que no se como automatizar que se de cuenta si ya se termino de ordenar o le falta.

Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int OrdenarMeMa(int);
  5.  
  6. int array[10];
  7. int main()
  8. {
  9. int a=0, *arrayrta[10];
  10. for(a==0;a<10;a++){//obteniendo valores
  11. cout<<"ingrese el valor numero "<<a<<" de "<<sizeof(array)/sizeof(int)<<": "<<endl;
  12. cin>>array[a];
  13. }
  14. cout<<"Estado:"<<endl;//muestra el array obtenido
  15. for(a==0;a<10;a++)
  16. {
  17. cout<<array[a]<<" | ";
  18. }
  19. (int)arrayrta=OrdenarMeMa(array);
  20.  
  21. for(a==0;a<10;a++)//Muestra el array ordenado
  22. {
  23. cout<<arrayrta[a]<<" | ";
  24. }
  25. return 0;
  26. }
  27.  
  28. int OrdenarMeMa(int array)
  29. {
  30. int aux, a=0, b=0, array2[10];
  31. bool listo;
  32. while (0==listo)//ordena el array
  33. {
  34. a++;
  35. b = a+1;
  36. if (array2[a]>array2[b])
  37. {
  38. aux = array2[b];
  39. array2[b] = array2[a];
  40. array2[a]= aux;
  41.  
  42. }
  43. return (int)array2;
  44. }
  45.  
  46. }


Aca los Errores:
Código:
   19:32: error: conversión inválida de ‘int*’ a ‘int’
   19:32: error:   argumento de inicialización 1 de ‘int OrdenarMeMa(int)’
   19:32: error: se requiere un l-valor como operando izquierdo de la asignación
   30: aviso: se devolvió la dirección de la variable local ‘array2’
para compilar uso el GCC, saludos y desde ya muchas gracias


« Última modificación: 21 Noviembre 2010, 14:41 pm por OnLOL » En línea

Mr.Blue


Desconectado Desconectado

Mensajes: 441



Ver Perfil WWW
Re: Problema con vector y direcciones
« Respuesta #1 en: 21 Noviembre 2010, 04:47 am »

Hola, bueno primero usa las etiquetas geshi para poder ver bien el codigo. :xD
Si no me quedo siego. :P

En primer lugar tenes unos problemas de sintaxis en tu codigo como por ejemplo esto

Citar
for(a==0;a<10;a++){//obteniendo valores

a==0  // Estas comparando o preguntando si a es igual a cero
no es necesario en este caso inicializar int a=0, y menos aun, no podes preguntar en el for si a efectivamente es 0.

Citar
for(a=0;a<10;a++){//obteniendo valores

Ahi quedaria

Respecto a usar un puntero, me parece q te hiciste mucho lio, primero trata de entender como es la logica del ordenamiento, y luego implementa punteros, detodas formas, no usastes los punteros correctamente.
Mirate este post

http://foro.elhacker.net/programacion_cc/c_iniciacion_al_manejo_de_los_punteros-t299174.0.html

en la funcion no entiendo que haces ahi con declarar, bool listo;
y en el while (0==listo), no entiendo q haces ahi.

entodo caso podes inicializar una variale ej int k=0;
y luego hacer esto

while (k==0){
k=1;
............

y ahi dentro ir preguntado con if si la cadena en la posicion i es mayo q cadena en la posicion i+1.
algo asi


if (cad>cad[i+1]){
aux=cad[a];
cad[a]=cad[a+1];
cad[a+1]=aux;
}


saludos.


En línea

OnLOL

Desconectado Desconectado

Mensajes: 25


Ver Perfil
Re: Problema con vector y direcciones
« Respuesta #2 en: 21 Noviembre 2010, 18:29 pm »

Lei lo de punteros, y lo modifique pero me sigue diciendo lo mismo, creo que el problema esta en el return, va me suena por ahi, lo que queria hacer con la variable boleana ("listo" ahora se llama "ordenado") era  pasar el valor a True cuando estuviera ordenado todo el vector, para que salga del while y devuelva el valor.

Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int OrdenarMeMa(int);
  5.  
  6.  
  7.  
  8. int main()
  9. {
  10. int a=0,array[10], *arrayord=NULL;
  11. for(a=0;a<10;a++){//obteniendo valores
  12. cout<<"ingrese el valor numero "<<a<<" de "<<sizeof(array)/sizeof(int)<<": "<<endl;
  13. cin>>array[a];
  14. }
  15. cout<<"Estado:"<<endl;//muestra el array obtenido
  16. for(a==0;a<10;a++)
  17. {
  18. cout<<array[a]<<" | ";
  19. }
  20. arrayord=OrdenarMeMa(array);
  21.  
  22. for(a=0;a<10;a++)//Muestra el array ordenado
  23. {
  24. cout<<*arrayord[a]<<" | ";
  25. }
  26. return 0;
  27. }
  28.  
  29. int OrdenarMeMa(int* array)
  30. {
  31. int aux, a=0,i, array2[10];;
  32. bool ordenado=false;
  33. while (false==ordenado)//ordena el array
  34. {
  35.  
  36.  
  37. if (array2[a]>array2[a+1]) //compara si el antecedente es mayor al consecuente
  38. {
  39. aux = array2[a+1]; //pasa el consecuente a una varialbe auxiliar
  40. array2[a+1] = array2[a];//pasa el antecedente a la pocicion del consecuente
  41. array2[a]= aux;//pasa el valor de la variable auxiliar al antecedente
  42.  
  43. }
  44. for(i=0;i<10;i++)//Comprobador
  45. {
  46. if(array[i]<array[i+1]) ordenado=true;//si el antecedente es menor al consecuente, ordenando cambia a True y sale del while
  47. ordenado=false;
  48. }
  49. a++;
  50. }
  51. return &array2;
  52.  
  53. }
  54.  

Lo que no entiendo es por que si yo devuelvo los valores de "array2" al puntero "arrayord" me da el error de la conversion.

Aca los errores:
Código:
   20:27: error: conversión inválida de ‘int*’ a ‘int’
   20:27: error:   argumento de inicialización 1 de ‘int OrdenarMeMa(int)’
   20:27: error: conversión inválida de ‘int’ a ‘int*’
   24:20: error: argumento de tipo inválido del unario ‘*’
   51:10: error: conversión inválida de ‘int*’ a ‘int’
« Última modificación: 21 Noviembre 2010, 18:42 pm por OnLOL » En línea

Littlehorse
All the world's a stage
Moderador
***
Desconectado Desconectado

Mensajes: 2.714


Nie Dam Sie


Ver Perfil WWW
Re: Problema con vector y direcciones
« Respuesta #3 en: 21 Noviembre 2010, 19:18 pm »

Los arreglos locales declarados en una función permanecen solamente en el ámbito de la función respectiva.

Todo esto:

Código
  1. int aux, a=0,i, array2[10];;

desaparece al finalizar la función "OrdenarMeMa" por lo tanto no puedes acceder a "array2" desde otro modulo por mas que trates de retornar su dirección; al finalizar la función "OrdenarMeMa", "array2" es inaccesible.
No se que le pasara a tu GCC, porque como mínimo te tendría que haber dado un warning al retornar la dirección de una variable local desde una función.



Luego, el valor de retorno de la función "OrdenarMeMa" es incorrecto, ya que esta declarada como para retornar un entero y vos estas retornando un puntero a entero:

Debería ser algo así:

Código
  1. int* OrdenarMeMa(int* array)

o simplemente retornar un valor entero (0,1 u bool: true, false, como gustes) para chequear si la función fallo o cumplió su tarea correctamente. Si estas pasando el arreglo a ordenar mediante un puntero, no necesitas retornar nada, ya que los arreglos locales se pasan automáticamente por referencia dado que su identificador (su nombre) actúa en forma similar a un puntero.



Seguís teniendo los errores que ya te mencionaron:

Código
  1. for(a==0;a<10;a++)

== es para comparar, = es para asignar.

Código
  1. cout<<*arrayord[a]<<" | ";

Estas tratando a un puntero como a un doble puntero.




Dale un repaso al tema de punteros, parece difícil al principio pero luego se hace mas fácil.

Saludos
« Última modificación: 21 Noviembre 2010, 19:22 pm por Littlehorse » En línea

An expert is a man who has made all the mistakes which can be made, in a very narrow field.
OnLOL

Desconectado Desconectado

Mensajes: 25


Ver Perfil
Re: Problema con vector y direcciones
« Respuesta #4 en: 21 Noviembre 2010, 21:54 pm »

Me baje un manual de punteros , y pude arreglar el programa, sin embargo parece que no era lo unico :P, ahora que me deja ejecutar lo fui viendo con el depurador el gdb creo que es, uso CodeLite que me viene todo junto, y al llegar a

Código
  1. for(a=0;a<10;a++)
  2. {
  3. //cout<<array[a]<<" | ";
  4. cout<<"aux: "<<*aux<<" | ";
  5.  
  6. aux++;
  7. }

El cout no me muestra el valor de donde apunta el puntero "aux", lo raro es que en el debuger, el valor de la direccion incrementa y tambien me muestra el valor de "*aux" que son correctos ambos, hice un programa aparte  y si me lo muestra.

Aca el codigo completo:
Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int* OrdenarMeMa(int*);
  5.  
  6.  
  7. int array2[10],array[10];
  8. int main()
  9. {
  10. int a=0, *arrayord=NULL,*aux;
  11. for(a=0;a<10;a++){//obteniendo valores
  12. cout<<"ingrese el valor numero "<<a<<" de "<<sizeof(array)/sizeof(int)<<": "<<endl;
  13. cin>>array[a];
  14. }
  15. cout<<"Estado:"<<endl;//muestra el array obtenido
  16. aux=&array[0];
  17. for(a=0;a<10;a++)
  18. {
  19. //cout<<array[a]<<" | ";
  20. cout<<"aux: "<<*aux<<" | ";
  21.  
  22. aux++;
  23. }
  24. arrayord=OrdenarMeMa(array);
  25.  
  26. for(a=0;a<10;a++)//Muestra el array ordenado
  27. {
  28. //cout<<*arrayord[a]<<" | ";
  29. cout<<*arrayord<<" | ";
  30. arrayord++;
  31. }
  32.  
  33. return 0;
  34. }
  35.  
  36. int* OrdenarMeMa(int *array)
  37. {
  38. int aux, a=0,i ;
  39. bool ordenado=false;
  40. while (false==ordenado)//ordena el array
  41. {
  42. if (array2[a]>array2[a+1]) //compara si el antecedente es mayor al consecuente
  43. {
  44. aux = array2[a+1]; //pasa el consecuente a una varialbe auxiliar
  45. array2[a+1] = array2[a];//pasa el antecedente a la pocicion del consecuente
  46. array2[a]= aux;//pasa el valor de la variable auxiliar al antecedente
  47.  
  48. }
  49. for(i=0;i<10;i++)//Comprobador
  50. {
  51. if(array[i]<array[i+1]) ordenado=true;//si el antecedente es menor al consecuente, ordenando cambia a True y sale del while
  52. ordenado=false;
  53. }
  54. a++;
  55. }
  56. return array2;
  57.  
  58. }

En línea

Littlehorse
All the world's a stage
Moderador
***
Desconectado Desconectado

Mensajes: 2.714


Nie Dam Sie


Ver Perfil WWW
Re: Problema con vector y direcciones
« Respuesta #5 en: 21 Noviembre 2010, 22:45 pm »

No he visto todo el código porque deje de leer cuando vi los arreglos globales. Yo te recomendaría que te bajes "Como programar en C/C++" de Deitel y Deitel y en todo caso vayas directo al capitulo de punteros.
Si no entendes algo de lo mencionado anteriormente, postea las dudas puntuales y las vemos.

Esto te lo digo porque al parecer no entendiste lo que te mencione antes, y me pareció que estaba bien explicado. Es decir, en vez de modificar el diseño del programa para pasar el array por referencia, optaste por usar un array global logrando que no tenga sentido siquiera pasar nada por referencia. Es decir, un array declarado en un scope global permite que puedas acceder a ese array desde cualquier función sin necesidad de ningún tipo de pasaje ni de ningún tipo de retorno, por tanto el uso de los punteros en este caso en particular pierde el sentido completamente.

Mira este ejemplo:

Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. void imprimir(); //Funcion que retorna void, no acepta ningun parámetro.
  5.  
  6. int array[]={1,2,3,4,5}; //Array global
  7.  
  8. int main()
  9. {
  10. imprimir(); //Llamando funcion
  11.  
  12. cin.get();
  13. }
  14.  
  15. void imprimir()
  16. {
  17. for(int i=0;i<5;i++)//Imprimiendo elementos del array global
  18. cout<<array[i]<<endl;
  19. }
  20.  

Como podrás ver, accedes perfectamente desde cualquier función al array global sin necesidad de pasarlo siquiera como parámetro, por eso mismo se denomina global. Es una mala practica declarar variables/objetos globales dado que cualquier función puede modificar su contenido y por ende se hace mas difícil validar los datos u controlar los errores.



Por otro lado, el manejo de punteros es bastante amplio y dependiendo de como se utilicen depende el significado de la sentencia, no es lo mismo hacer esto:

Código
  1. cout<<*ptr<<endl;
  2. ptr++;

que hacer esto:

Código
  1. cout<<ptr[i]<<endl; // == *(ptr+i);

Un ejemplo:


Para ordenar un array pasándolo como referencia a una función, te basta con seguir este pequeño bosquejo:


Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. void imprimir(int*); //Puede ser bool o int, dependiendo si queres retornar algun valor util para chequeo de errores
  5.  
  6. int main()
  7. {
  8. int array[]={1,2,3,4,5};
  9.  
  10. imprimir(array); // Pasaje por referencia automatico, el identificador del array es como si fuese un puntero
  11.  
  12. cin.get();
  13. }
  14.  
  15. void imprimir(int *ptr)
  16. {
  17.  
  18. for(int i=0;i<5;i++)
  19. cout<<ptr[i]<<endl;
  20. }

Añadiendo las funciones de ordenamiento y por supuesto del ingreso de datos. El proceso a seguir es similar.

Pero recomiendo que te bajes el libro que te mencione al principio, explica los punteros de manera bastante amigable y comprensible.

Saludos
« Última modificación: 21 Noviembre 2010, 22:47 pm por Littlehorse » En línea

An expert is a man who has made all the mistakes which can be made, in a very narrow field.
OnLOL

Desconectado Desconectado

Mensajes: 25


Ver Perfil
Re: Problema con vector y direcciones
« Respuesta #6 en: 23 Noviembre 2010, 00:41 am »

Bueno, lei lo que me dijeron, y con la mano de un amigo el programa funciona y esta mejorado, por supuesto le faltan cosas, como comprobar si hay valores repetidos, o si pongo un numero grande da cualquier cosa :P, Muchas gracias a ambos por ayudar ^.^ dejo el codigo.

Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4.  
  5.  
  6. #define SIZE_ARRAY 10
  7. void ordenarMeMa(int* array, int* arrayOrd);
  8. void copiarArray(int* array, int* arrayCopia,  int size);
  9. bool intercambio(int* array, int nroPasada);
  10.  
  11.  
  12.  
  13. int main() {
  14. int a=0, *aux;
  15. int array[SIZE_ARRAY], arrayOrd[SIZE_ARRAY];
  16.  
  17. for(a=0; a<10; a++) {  //obteniendo valores
  18. cout << "ingrese el valor numero " << a << " de " << (sizeof(array)/sizeof(int))-1 << ": " << endl;
  19. cin>>array[a];
  20. }
  21.  
  22. aux = array;
  23. cout<<" Vector desordenado: "<<endl;
  24. for(a=0; a<10; a++) {//muestra el vector desordenado
  25. //cout<<array[a]<<" | ";
  26. if(a==0){cout <<"| ";}
  27. cout << *aux <<" | ";
  28. aux++;
  29. }
  30. cout << endl << endl;
  31.  
  32. ordenarMeMa(array, arrayOrd);
  33. cout<<" Vector ordenado: "<<endl;
  34. for(a=0; a<10; a++) {  // Muestra el array ordenado
  35. if(a==0){cout <<"| ";}
  36. cout << arrayOrd[a]<< " | ";
  37. }
  38. //cout<<endl;
  39.  
  40. cin>>a;
  41.  
  42. return 0;
  43. }
  44.  
  45. /** Pre: Los arrays pasados por parámetros deben poseer el mismo tamaño
  46.  */
  47. void copiarArray(int* array, int* arrayCopia, int size) {
  48. int i;
  49.  
  50. for(i=0; i< size; i++)
  51. arrayCopia[i] = array[i];
  52. }
  53.  
  54. void ordenarMeMa(int* array, int* arrayOrd) {
  55. int i;
  56. int nroPasada = 0;
  57. bool ordenado=false;
  58.  
  59. copiarArray(array, arrayOrd, SIZE_ARRAY);
  60.  
  61. while(ordenado != true) {
  62. for(i=0; i < SIZE_ARRAY-1; i++) {
  63. ordenado = intercambio(arrayOrd,nroPasada);
  64. nroPasada++;
  65. }
  66. }
  67.  
  68. }
  69.  
  70. bool intercambio(int* array, int nroPasada) {
  71. int aux, i;
  72.  
  73. for(i=0; i< SIZE_ARRAY - nroPasada; i++) {
  74. if( array[i] > array[i+1]) {
  75. aux = array[i];
  76. array[i] = array[i+1];
  77. array[i+1] = aux;
  78. }
  79. }
  80. if(i==0) return true;
  81. else return false;
  82. }

Saludos, y gracias :D
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema en volver la posición del elemento maximo de un vector
Programación C/C++
Denok 8 7,464 Último mensaje 15 Diciembre 2011, 15:34 pm
por Denok
Problema con librería vector.
Programación C/C++
bemone 3 2,665 Último mensaje 19 Mayo 2012, 20:09 pm
por RyogiShiki
Problema con un vector
Programación C/C++
NekoOs 4 2,516 Último mensaje 22 Julio 2012, 00:13 am
por do-while
[C] [?] Problema con vector de caracteres
Programación C/C++
alt_369 2 2,002 Último mensaje 13 Enero 2013, 23:30 pm
por alt_369
Problema con std::vector y static
Programación C/C++
anonimo12121 0 1,430 Último mensaje 10 Junio 2013, 23:59 pm
por anonimo12121
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines