1

¿A qué se debe este error?

#include <iostream>
#include <stdio.h>
#include <string>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <iostream>
#include <string.h>

using namespace std;

struct Comercio{
    int codigo,cactual,cminima;
    float precio;
    string descripcion;
};
int i,n;
void pedirdatos(Comercio *v);
int *v;

int main(){

    cout<<"Ingrese cantidad de articulos: "<<endl;
    cin>>n;
    v= new Comercio[n];

    pedirdatos(v,n);

    return 0;   
}

void pedirdatos(Comercio *v){
    for(int i=0;i<n;i++){

        cout << "Ingrese codigo:" <<endl;

        cin >>v[i].codigo;
        cout<< "Ingrese descripcion: "<<endl;
        fflush(stdin);
        cin>>v[i].descripcion;
        cout<< "Cantidad actual: "<<endl;
        cin>> v[i].cactual;
        cout<< "Cantidad minima: "<<endl;
        cin>> v[i].cminima;
        cout<< "Precio:  "<<endl;
        cin>>v[i].precio;
    }
}
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82

2 Answers2

4

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 no de . 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;
}
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
1

Estas asignando un tipo de valor diferente al que has declarado en la variable v.

La haz declarado como int*.

Int *v

Pero aquí le agregas un valor de tipo Comercio.

v= new Comercio[n];

Puedes solucionarlo si declaras la variable de esta manera:

Comercio* v;