El error es claro, conciso y autoexplicativo:
cannot convert `int*' to `Comercio*' for argument `1' to `void pedirdatos(Comercio*)`
Tal vez no lo entiendes por estar en inglés, te lo traduzco:
no se puede convertir `int*' a `Comercio*' para el argumento `1' de `void pedirdatos(Comercio*)
El punto donde estás llamndo a pedirdatos
es en esta línea:
pedirdatos(v,n);
El argumento 1 es v
, que vemos que está definido en esta línea:
int *v;
Así que v
es de tipo int *
, ¿qué espera pedirdatos
como primer argumento?, veamos su declaración:
void pedirdatos(Comercio *v);
El primer argumento de pedirdatos
es de tipo Comercio *
. Y ahí está el error: No se puede convertir un dato de tipo puntero a entero (int *
) a un dato de tipo puntero a Comercio.
Pero ese es el menor de tus problemas, tu código es incorrecto por muchos otros motivos:
- Las cabeceras
<stdio.h>
, <stdlib.h>
, <string.h>
y <ctype.h>
son de c no de c++. Estas cabeceras disponen de una versión adaptada a C++ que tiene el prefijo c
y carece de extensión. Si realmente necesitas usar las cabeceras de C (que nunca será el caso) debes usar los equivalentes de C++ <cstdio>
, <cstdlib>
, <cstring>
y <cctype>
. Lee este hilo para saber por qué.
- Además de que incluyes dos veces
<stdio.h>
, no estás utilizando ninguna de su utilidaes, así que no necesitarías incluirla ni siquiera una sola vez. Tampoco usas nada de <stdlib.h>
ni <ctype.h>
así que su inclusión es también innecesaria.
- Incluyes la cabecera de cadenas de C
<string.h>
y la de C++ <string>
pero sólo usas la segunda así que la primera inclusión es innecesaria.
- No hay obligación de usar la cláusula
using namespace std;
pues es sólo es una ayuda a la escritura de código; si decides usar esta cláusula no lo hagas en el ámbito global, úsala en el ámbito más pequeño posible. Lee este hilo para saber por qué.
Evita abusar de std::endl
(pues puede causar problemas de rendimiento) y favorece el uso del salto de línea explícito (\n
). Lee este hilo para saber por qué.
- Declaras y defines
pedirdatos
con un solo argumento, pero la usas con dos.
- Usas memoria dinámica y no la borras. Cambia a un contenedor de datos.
- Deja a tu código respirar, añade unos espacios y saltos de línea. En los 90 teníamos pantallas de 80 caracteres de ancho y 25 líneas de alto, por entonces tenía sentido apretujar el código para que cupiera en la pantalla. Hoy día tenemos pantallas enormes y separar las cosas hace que el código sea más legible.
- Los nombres de tus variables o tipos no son autoexplicativos; los nombres deberían permitir saber de un vistazo su cometido, haciendo que el código sea menos propenso a errores y haciendo que sea más fácil de leer y entender, cosa que cualquier persona que trabaje contigo (incluso tu yo futuro) agradecerá mucho.
Teniendo en cuenta lo anterior, tu código podría parecerse a:
#include <iostream>
#include <vector>
struct Comercio{
int codigo = 0, cactual = 0, cminima = 0;
float precio = 0f;
std::string descripcion = "";
};
void pedirdatos(std::vector<Comercio> &comercios) {
using namespace std;
for (auto &comercio : comercios) {
cout << "Ingrese codigo:\n";
cin >> comercio.codigo;
cout << "Ingrese descripcion: \n";
cin >> comercio.descripcion;
cout << "Cantidad actual: \n";
cin >> comercio.cactual;
cout << "Cantidad minima: \n";
cin >> comercio.cminima;
cout << "Precio: \n";
cin >> comercio.precio;
}
}
int main() {
using namespace std;
int cantidad;
cout << "Ingrese cantidad de articulos: \n";
cin >> cantidad;
vector<Comercio> comercios(cantidad);
pedirdatos(comercios);
return 0;
}