• Jueves 14 de Noviembre de 2024, 16:56

Autor Tema:  Pasar Array de una funcion a otra  (Leído 2761 veces)

oliveros.maestre

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Pasar Array de una funcion a otra
« en: Domingo 1 de Junio de 2014, 03:50 »
0
Saludos a todos, antes que nada soy nuevo en el foro y espero en la medida de lo posible poder ayudarles, de momento me gustaria que me ayudaran a salir de un problema que se me presenta con el siguiente codigo, explico en que consiste, su fin es llenar dos vectores codigo[], cantidad[] en una funcion AnhiadirArticulos() y luego si el usuario desea ver los articulos la funcion VerArticulos() debe encargarse de mostrar los dos arreglos contenidos en la funcion primero mencionada...

el problema esta en que no se como hacer que eso suceda, agradezco toda ayuda que me puedan facilitar...

Código: C++
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <iostream>
  4. #include <cstdlib>
  5.  
  6. using namespace std;
  7.  
  8. int AnhiadirArticulos();
  9. int Transacciones();
  10. int VerArticulos( int codigo[], int cantidad[], int art );
  11.  
  12. int menu()
  13. {
  14.     int opcion, codigo, cantidad, art;
  15.  
  16.     [.....]
  17.  
  18.     cin >> opcion;
  19.  
  20.      [.....]
  21.  
  22.     case 2:
  23.         VerArticulos( codigo[art], cantidad[art], art );
  24.         break;
  25.  
  26.     [.....]
  27. }
  28.  
  29. int AnhiadirArticulos()
  30. {
  31.     int art, tran, op, cod;
  32.     int cantrecibida, cantvendida;
  33.  
  34.     cout<<"CON CUANTOS ARTICULOS INICIA EL ALMACEN:  ";
  35.     cin>>art;
  36.  
  37.     int codigo[art];
  38.     int cantidad[art];
  39.  
  40.     for ( int i=0; i<=art; i++ )
  41.     {
  42.         system("cls");
  43.  
  44.         cout << endl << endl;
  45.         cout << "INGRESE EL ARTICULO " << i << endl;
  46.         cout << "CODIGO    ";
  47.         cin >> codigo[i];
  48.         cout << "CANTIDAD  ";
  49.         cin >> cantidad[i];
  50.     }
  51.  
  52.     VerArticulos( codigo, cantidad, art );
  53.  
  54.     menu();
  55.  
  56.     return art;
  57. }
  58.  
  59. int VerArticulos( int codigo[], int cantidad[] )
  60. {
  61.     int art;
  62.  
  63.      [.....]
  64.  
  65.     for ( int i=1; i<=art; i++ )
  66.     {
  67.         cout << codigo[i] << "\t\t" << cantidad[i];
  68.     }
  69.  
  70.     [.....]
  71.  
  72.     return art;
  73. }
  74.  
  75.     [.....]
  76.  
  77. int main()
  78. {
  79.     menu();
  80.  
  81.     return 0;
  82. }
  83.  

nachete_222

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Re:Pasar Array de una funcion a otra
« Respuesta #1 en: Domingo 1 de Junio de 2014, 13:31 »
0
A simple vista hay unos cuantos detalles que deberías revisar:
Citar
2. #include <conio.h>
esta cabecera es exclusiva del entorno de consola de windows. Si realmente deseas crear código portable no deberías usarla, en el código que pones no veo necesidad para incluirla... no se si tienes pensado usar funciones pertenecientes a ella mas tarde. Algo similar sucede con <stdio.h>, que básicamente es la versión en C de la cabecera para C++ que si tienes incluida después <iostream>, o dicho de otro modo con <iostream> no necesitas <stdio.h>. La ultima vez que he tenido que incluir ambas, fue en un programa que necesitaba utilizar la constante 'EOF', la cual no he visto que la uses por ningún lado.

Citar
40. for ( int i=0; i<=art; i++ )
esto te va a dar un error por desplazamiento en 1, el numero de articulos es igual a la cantidad de ellos que existen en el array, si son cinco, ese for intentaría acceder a 6 artículos (de los indices 0 a 5, ambos incluidos, eso supone un total de 6)

Citar
65. for ( int i=1; i<=art; i++ )
Ten cuidado con esto, recuerda que los ordenadores no cuentan como nosotros, ellos empiezan en cero.

resumiendo, el primer for intenta acceder a un elemento mas de los que existen, el segundo intenta acceder desde el segundo de la lista hasta uno mas de los que existen.

Citar
[.....]
esto significa que aquí falta código??, intenta publicar código completo, intenta también poner comentarios en el código para que sea mas fácil seguir la lógica del programa.

un saludo,
Nacho

oliveros.maestre

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re:Pasar Array de una funcion a otra
« Respuesta #2 en: Domingo 1 de Junio de 2014, 22:54 »
0
que tal, aqui le dejo el codigo completo, no lo puse porque eran cosas que no interferian con lo que necesito, bueno eso creo...

Citar
lo que el programa pretende es: llenar dos vectores codigo y cantidad de determinados articulos, Ud. le dara la opcion a clientes y proveedores de ver cuantos articulos existen, ademas de ello si un cliente compra una determinada cantidad de articulos debera descontarlos y actualizar el vector a la nueva cantidad, asi mismo si un proveedor trajere otra determinada cantidad de articulos Ud. debera sumar al respctivo articulo la cantidad correcta y actualizar el vector, el cualquier momento se puede solicitar ver la cantidad de articulos existentes con sus respectivos codigos...

Código: C++
  1. #include <iostream>
  2. #include <cstdlib>
  3.  
  4. using namespace std;
  5.  
  6. int AnhiadirArticulos();
  7. int Transacciones( int );
  8. int VerArticulos( const int art, int codigo[], int cantidad[] );
  9.  
  10. /* permite al usuario seleccionar una opcion del programa */
  11. int menu()  
  12. {
  13.     int opcion, art, codigo[0], cantidad[0];
  14.     system("cls");
  15.     cout << endl << endl;
  16.     cout << "MARQUE << 1 >> PARA VER NUESTROS ARTICULOS" << endl;
  17.     cout << "MARQUE << 2 >> PARA HACER   TRANSACCIONES" <<  endl;
  18.     cout << "MARQUE << 3 >> PARA  SALIR   DEL  PROGRAMA" << endl;
  19.     cout << "MARQUE UNA OPCION PARA CONTINUAR        ";
  20.     cin >> opcion;
  21.  
  22.     system("cls");
  23.  
  24.     switch ( opcion )
  25.     {
  26.     case 1:
  27.         /* me debe mostrar la lista de articulos registrados en el vector */
  28.         VerArticulos( art, codigo, &cantidad[0] );
  29.         break;
  30.     case 2:
  31.         /* aqui estoy llamando la funcion que sumara o restara del vector segun sea el caso */
  32.         Transacciones( art );  
  33.         break;
  34.     case 3:
  35.         return 0;
  36.         break;
  37.     default:
  38.         cout << "OPCION INVALIDA, INTENTE DE NUEVO";
  39.         menu();
  40.     }
  41.  
  42.     return 0;
  43. }
  44.  
  45. int AnhiadirArticulos()  
  46. /* esta funcion  es la primera que se ejecuta, pues de no hacerlo asi arrojara un error porque si el usuario selecciona verarticulos()
  47. este estara vacio al inicio del porgrama, su funcion es llenar llenar un vector con una cantidad 'x' de articulos para luego poder proceder con la otra parte del programa*/
  48. {
  49.     int art, tran, op, cod;
  50.    
  51.     /* esto la verdad me recomendaron hacerlo pero aun no me queda claro cual es la funcion */
  52.     art = tran = op = cod = 0;
  53.  
  54.     system("cls");
  55.  
  56.     cout << endl << endl;
  57.     cout<<"CON CUANTOS ARTICULOS INICIA EL ALMACEN:  ";
  58.     cin>>art;
  59.  
  60.     int codigo[art];
  61.     int cantidad[art];
  62.  
  63.     /* aqui ya corregi el problema que la verdad no me habia percatado de el.
  64.         este ciclo lo llena los vector para luego poder mostrarlo si el usario lo requiere */
  65.     for ( int i=0; i<art; i++ )  
  66.     {
  67.         system("cls");
  68.  
  69.         cout << endl << endl;
  70.         cout << "INGRESE EL ARTICULO " << i+1 << endl;
  71.         cout << "CODIGO    ";
  72.         cin >> codigo[i];
  73.         cout << "CANTIDAD  ";
  74.         cin >> cantidad[i];
  75.     }
  76.  
  77.     /* aqui estoy pasando a la funcion verArticulos() el contenido que acabo de llenar,
  78.         cuando ejecuto el programa, desde aqui, me muestra la lista de articulos y codigos
  79.         sin problema alguno, el problema esta cuando llamo a esta misma funcion desde el menu */
  80.     VerArticulos( art, codigo, &cantidad[0] );
  81.  
  82.     return 0;
  83. }
  84.  
  85. /* esta es la funcion que me muestra los articulos, pero como les dijo, si la invoco desde el menu me arroja
  86. varios errores en el programa, me empieza a generar "numeros aleatorios" y finaliza con ceros "0" y luego de eso se detiene el programa*/
  87.  
  88. int VerArticulos( int art, int codigo[], int cantidad[] )
  89. {
  90.     system("cls");
  91.  
  92.     cout << endl << endl;
  93.     cout << "CODIGO\t\tCANTIDAD" << endl << endl;
  94.  
  95.     for ( int i=0; i<art; i++ )
  96.     {
  97.         cout << codigo[i] << "\t\t" << cantidad[i] << endl;
  98.     }
  99.  
  100.     cout << endl << endl;
  101.     cout << "PRESIONE UNA TECLA PARA IR AL MENU";
  102.     cin.get();
  103.     cin.get();
  104.  
  105.     menu();
  106.  
  107.     return 0;
  108. }
  109.  
  110. int Transacciones( int art )
  111. {
  112.     int tran, op, cod;
  113.     int cantrecibida, cantvendida;
  114.     int codigo[0], cantidad[0];
  115.  
  116.     cout << endl;
  117.     cout<<"TRANSSACCIONES POR DIA  ";
  118.     cin>>tran;
  119.  
  120.     for( int l=0; l<tran; l++)
  121.     {
  122.         system("cls");
  123.  
  124.         cout<<" MARQUE << 1 >> SI ES PROVEERDOR"<<endl;
  125.         cout<<" MARQUE << 2 >> SI ES UN CLIENTE"<<endl;
  126.         cout<<" MARQUE UNA OPCION PARA        "<<endl;
  127.         cin>>op;
  128.  
  129.         if( op == 1 )
  130.         {
  131.             cout<<"INGRESE CODIGO DEL ARTICULO    "<<endl;
  132.             cin>>cod;
  133.  
  134.             for ( int j=0; j<art; j++ )
  135.             {
  136.                 /* en esta parte el programa tambien me arroja un error, explico, si ingreso en el CIN anterior un 1
  137.                    (codigo previamente ingresado en la funcion anhiadirArticulos() ) este for se lanza para el ELSE,
  138.                    diciendo que el codigo ingresado no es correcto, porque? si el codigo ingresado realmente si es correcto?*/
  139.                 if ( cod == codigo[j] )
  140.                 {
  141.                     cout << "CUANTOS ARTICULOS INGRESARAN    ";
  142.                     cin >> cantrecibida;
  143.                     cantidad[j] = cantidad[j] + cantrecibida;
  144.                     cout << "MUCHAS GRACIAS, TRANSACCION EXITOSA";
  145.                     cout << "EXISTEN " << cantidad[j] << " UNIDADES DEL ARTICULO" << endl << endl;
  146.                 }
  147.                 else
  148.                 {
  149.                     cout << "EL CODIGO INGRESADO NO ES CORRECTO" << endl;
  150.                     cout << "PRESIONE UNA TECLA PARA IR AL MENU ";
  151.                     cin.get();
  152.                     cin.get();
  153.                     system("cls");
  154.                     menu();
  155.                 }
  156.  
  157.             }
  158.         }
  159.         else if ( op == 2 )
  160.         {
  161.             cout<<"INGRESE CODIGO DEL ARTICULO "<<endl;
  162.             cin>>cod;
  163.  
  164.             for ( int j=0; j<art; j++ )
  165.             {
  166.                    /* en esta parte el programa tambien me arroja un error, el mismo de hace un momento*/
  167.                 if ( cod == codigo[j] )
  168.                 {
  169.                     cout << "ARTICULOS VENDIDOS     ";
  170.                     cin >> cantvendida;
  171.                     cantidad[j] = cantidad[j] - cantvendida;
  172.                     cout << "MUCHAS GRACIAS, TRANSACCION EXITOSA";
  173.                     cout << "EXISTEN " << cantidad[j] << " UNIDADES DEL ARTICULO" << endl << endl;
  174.                 }
  175.                 else
  176.                 {
  177.                     cout << "EL CODIGO INGRESADO NO ES CORRECTO" << endl;
  178.                     cout << "PRESIONE UNA TECLA PARA IR AL MENU ";
  179.                     cin.get();
  180.                     cin.get();
  181.                     system("cls");
  182.                     menu();
  183.                 }
  184.             }
  185.         }
  186.         else
  187.         {
  188.             cout << "DIGITO UN DATO INVALIDO, POR FAVOR" << endl;
  189.             cout << "PRESIONE UNA TECLA PARA CONTINUAR ";
  190.             cin.get();
  191.             cin.get();
  192.             int main();
  193.         }
  194.     }
  195.  
  196.     return art;
  197. }
  198.  
  199. int main()
  200. {
  201.     AnhiadirArticulos();
  202.     menu();
  203.  
  204.     return 0;
  205. }
  206.  

aca entonces les dejo el error que me lanza el compilador

Código: [Seleccionar]
||=== Build: Debug in 13 (compiler: GNU GCC Compiler) ===|
E:\C++\13\main.cpp||In function 'int menu()':|
E:\C++\13\main.cpp|26|warning: 'art' may be used uninitialized in this function [-Wmaybe-uninitialized]|
||=== Build finished: 0 error(s), 1 warning(s) (0 minute(s), 0 second(s)) ===|

nachete_222

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Re:Pasar Array de una funcion a otra
« Respuesta #3 en: Lunes 2 de Junio de 2014, 21:51 »
0
Citar
13.    int opcion, art, codigo[0], cantidad[0];
Fijate en esto, estas reservando espacio para dos vectores que van a contener "enteros", y cuanto espacio reservas?   >> \[0], osea, nada. Eso esta en la función "menu()", de manera que si llamas a la funcion "VerArticulos()" desde la función "menu()", estas lanzando dicha función sobre unos vectores que no existen.

Citar
60.    int codigo[art];
61.    int cantidad[art];
Aquí estamos en la función "AnhiadirArticulos()". Aquí si que estás reservando espacio para los vectores, por eso al terminar de añadir los articulos se pueden ver, gracias a la llamada que haces a la función (    VerArticulos( art, codigo, &cantidad[0] ); ). Habeis oído alguna vez el dicho de "Lo que pasa en Las Vegas se queda en Las Vegas" ? con las funciones pasa otro tanto de lo mismo. si construyes un vector dentro de una función y dicho vector no esta en el ambito global del programa o no lo devuelve la función, al terminar la función se termina también la visibilidad del vector. "Lo que pasa en las funciones se queda en las funciones".

Necesitas una estrategia para hacer el vector visible a todas las funciones.

Citar
50.    /* esto la verdad me recomendaron hacerlo pero aun no me queda claro cual es la funcion */
51.    art = tran = op = cod = 0;
52.
53.    system("cls");
Esto es una asignación multiple que no tiene mucho misterio, basicamente estas inicializando todas esas variables a cero, al mismo tiempo, el operador '=' se evalua de derecha a izquierda, lo cual quiere decir que estas inicializando  'cod = 0' despues 'op' al valor que contenga 'cod', esto es cero, despues 'tran' al valor que contenga 'op' y así sucesivamente, esto se hace para asegurarnos que dichas variables no contengan un valor residual que estubiese en el espacio de memoria que estamos reservando para ellas.
system("cls");  simplemente limpia la pantalla de la consola, de esta manera en vez de ir llenando la consola con opciones unas debajo de otras, se limpia en cada función para que aparezca todo mas limpio, y mas claro.

Un saludo,
Nacho
« última modificación: Lunes 2 de Junio de 2014, 21:53 por nachete_222 »