Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: HastatusXXI en 29 Octubre 2016, 12:04 pm



Título: [SOLUCIONADO] Array pasado por referencia a una función no se modifica
Publicado por: HastatusXXI en 29 Octubre 2016, 12:04 pm
Hola.
Intento hacer un programa al que se le pase por parámetro (en la línea de comandos) el tamaño de un array tipo float. Tengo que reservar el espacio necesario con malloc. El usuario debe introducir los valores del array. El programa los imprime. A continuación invierte el vector (aquí viene el problema) y se vuelve a imprimir el array. El array se imprime en el orden original otra vez. Debe de ser algún problema con las referencias, pero no lo encuentro ¿Alguien me echa un cable?

Para hacer más fácil la revisión, diré que el problema probablemente esté en la función invertir, lo demás funciona sin problemas.

Edito: ya lo he resuelto. El problema no es de referencias. En la función invertir escribí mal la condición de fin del for. Debe acabar cuando el índice i supere al tam, es decir, el for quedaría:

Código
  1. for(int i = 0; i < tam; i++) {
  2. tmp = array[i];
  3. array[i] = array[tam];
  4. array[tam] = tmp;
  5. tam--;
  6. }
  7.  


Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int POW(int a, int b);
  5. void invertir(float *array, int tam);
  6.  
  7. int main(int argc, char *argv[]) {
  8. if(argc < 2 | argc > 2) {
  9. printf("Este programa solo admite 1 argumento.\n");
  10. return 1;
  11. }
  12. int numero = 1;
  13. for(int i = 0; argv[1][i] != '\0'; i++) {
  14. if(argv[1][i] < 48 || argv[1][i] > 57) {
  15. numero = 0;
  16. }
  17. }
  18.  
  19. if(numero == 0) {
  20. printf("Argumento NO entero\n");
  21. return 2;
  22. }
  23.  
  24. int tam = 0; //tamaño del vector de floats (argumento programa)
  25. int tam_cadena = 0; //será el tamaño de la cadena argv[1]
  26.  
  27. for(int i = 0; argv[1][i] != '\0'; i++) {
  28. tam_cadena++;
  29. }
  30.  
  31. printf("Tamaño de la cadena argumento: %d\n", tam_cadena);
  32.  
  33. for(int i = 0; argv[1][i] != '\0'; i++) {
  34. tam += ((int)argv[1][i] - 48) * POW(10, tam_cadena-1-i);
  35. }
  36.  
  37. printf("%d\n", tam);
  38. //Creación del array tipo float de tamaño introducido por el usuario
  39. float *dir_array_float;
  40. dir_array_float = (float*)malloc(tam*sizeof(float));
  41.  
  42. float elem;
  43.  
  44. for(int i = 0; i < tam; i++) {
  45. printf("Introduzca el elemento (float) nº %d del array: \n", i+1);
  46. scanf("%f", &dir_array_float[i]);
  47. }
  48.  
  49. printf("\n");
  50.  
  51. for(int i = 0; i < tam; i++) {
  52. printf("%f\n", dir_array_float[i]);
  53. }
  54.  
  55. invertir(dir_array_float, tam);
  56.  
  57. printf("\n");
  58.  
  59. for(int i = 0; i < tam; i++) {
  60. printf("%f\n", dir_array_float[i]);
  61. }
  62.  
  63. return 0;
  64. }
  65.  
  66. int POW(int a, int b) {
  67. int base = a;
  68.  
  69. if(b>0) {
  70. while(b>1) {
  71. a *= base;
  72. b--;
  73. }
  74. }
  75. else if(b == 0) {
  76. return 1;
  77. }
  78.  
  79. return a;
  80. }
  81.  
  82. void invertir(float *array, int tam) {
  83. float tmp;
  84. tam--;
  85.  
  86. for(int i = 0; i > tam; i++) {
  87. tmp = array[i];
  88. array[i] = array[tam];
  89. array[tam] = tmp;
  90. tam--;
  91. }
  92.  
  93. return;
  94. }


Título: Re: [SOLUCIONADO] Array pasado por referencia a una función no se modifica
Publicado por: araes en 1 Noviembre 2016, 13:21 pm
for(int i = 0; i > tam; i++) {
   tmp = array;
   array = array[tam];
   array[tam] = tmp;
   tam--;
}

Tienes i < tam, y tiene que ser i< tam, sino nunca te entrará en el bucle  ;)