Invalid conversion from char* to char

di il
18 risposte

Invalid conversion from char* to char

Mi sto esercitando con le classi in c++ e sto scrivendo un programma con una classe che legge i numeri romani e li converte in decimali. Allego i tre files

Per primo quello con la classe e le dichiarazioni (RomanType.h)

#ifndef ROMANTYPE_H
#define ROMANTYPE_H

const int SIZE = 15;


class RomanType
{
public:
void getrom(const char); // store roman number
int getnum(const char); //convert in decimal form and store it
void print() const;
RomanType();
RomanType(char);

protected:
private:
char rom[SIZE];
int num;
};

#endif // ROMANTYPE_H

Poi quello con le funzioni (RomanType.cpp)
#include "RomanType.h"
#include <cstring>
#include <iostream>

RomanType::RomanType()
{
rom[] = '\0'; //ctor
num = 0;
}

RomanType::RomanType(char str[])
{
strcpy(rom, str);
num = 0;
}

void RomanType::getrom(char str[])
{
strcpy(rom, str);
}

int RomanType::getnum(char str[])
{
for(int i=0, i<SIZE, i++)
{
switch (rom)
{
case 'M':
num =+ 1000;
break;
case 'D':
num =+ 500;
break;
case 'C':
num =+ 100;
break;
case 'L':
num =+ 50;
break;
case 'X':
num =+ 10;
break;
case 'V':
num =+ 5;
break;
case 'I':
num =+ 1;
break;
}

}

void RomanType::print() const
{
cout << num;
cout << rom
}
}


e infine il main

#include <iostream>
#include <cstring>
#include "RomanType.h"

using namespace std;

int main()
{
char str[SIZE];
int dec;
RomanType myrom;

cout << "Enter a number in roman form:";
cin >> str;

myrom.getrom(str);

myrom.print();

return 0;
}
In effetti è proprio nel main, nella riga colorata in rosso che mi segna un errore con la fantomatica invalid conversion from char* to char. Ho controllato cos'è un char* e pare sia un puntatore ma non avendoli ancora studiati non so neanche quale sia la sintassi quindi tutto ciò mi turba.

18 Risposte

  • Re: Invalid conversion from char* to char

    Dichiarazione e sviluppo della funzione incongruenti. Cos'é secondo te str[]?
  • Re: Invalid conversion from char* to char

    Il prototipo della funzione getrom è il seguente : void getrom(const char); quindi la funzione si aspetta che come parametro tu gli passi una costante letterale, nel main invece passi una stringa ( array di caratteri ).
  • Re: Invalid conversion from char* to char

    Str[] dovrebbe essere la C-stringa che viene dichiarata nella funzione main e poi viene passata alle varie funzioni della classe. Non ho capito il tuo appunto.
  • Re: Invalid conversion from char* to char

    Tu alla funzione passi una stringa non una costante letterale come c'è scritto nel prototipo della funzione.
    str[] è una stringa, di certo, ma nel prototipo si aspetta const char
  • Re: Invalid conversion from char* to char

    Ho cambiato i prototipi, ora RomanType.h appare come
    #ifndef ROMANTYPE_H
    #define ROMANTYPE_H

    const int SIZE = 15;


    class RomanType
    {
    public:
    void getrom(const char[]); // store roman number
    int getnum(const char[]); //convert in decimal form and store it
    void print() const;
    RomanType();
    RomanType(char[]);

    protected:
    private:
    char rom[SIZE];
    int num;
    };

    #endif // ROMANTYPE_H

    però continua a non funzionare
  • Re: Invalid conversion from char* to char

    Nel prototipo devi mettere come parametro char variabile[]
  • Re: Invalid conversion from char* to char

    Quindi (scusami se insisto) quando dichiaro una funzione se ha come parametro qualcosa che non è un array posso sottintendere il nome della variabile mentre nel caso sia un array deve essere messo per forza il nome seguito dai caratteri []?
  • Re: Invalid conversion from char* to char

    Inoltre ho modificato il programma come mi hai suggerito

    RomanType.h

    #ifndef ROMANTYPE_H
    #define ROMANTYPE_H

    const int SIZE = 15;


    class RomanType
    {
    public:
    void getrom(const char str[]); // store roman number
    int getnum(const char str[]); //convert in decimal form and store it
    void print() const;
    RomanType();
    RomanType(char str[]);

    protected:
    private:
    char rom[SIZE];
    int num;
    };

    #endif // ROMANTYPE_H

    però adesso appaiono gli errori (riferiti al main)

    undefined reference to `RomanType::RomanType()'|
    undefined reference to `RomanType::getrom(char const*)'|
  • Re: Invalid conversion from char* to char

    Ma qual è il problema ? Cosa c'è che non va ?
  • Re: Invalid conversion from char* to char

    No no, non hai capito quello che ti voglio dire. Te lo spiego meglio...se io scrivo questa funzione :
    #include <iostream>
    #include <conio.h>
    
    using namespace std;
    
    void say(char word[]);
    
    int main()
    {
    	say("hello");
    	getch();
    	return 0;
    }
    
    void say(char word[])
    {
    	cout << word;
    }
    nel momento in cui la "chiamo" ( vedi nel main ) devo passare il corretto parametro che corrisponde a quello della dichiarazione ( void say(char word[]); ). Tu non hai fatto questo, alla funzione getrom che si aspetta un parametro di tipo const char ( una costante letterale ) tu gli passi un parametro stringa cioè str[] che sarebbe un array di caratteri, ma quella funzione lì se ne aspetta uno solo e per giunta deve essere una costante.
  • Re: Invalid conversion from char* to char

    Però adesso ho modificato i prototipi di funzione. Ora nel prototipo appare
    void getrom(char str[]);

    e in effetti il messaggio di invalid conversion è scomparso; sono però apparsi altri tre messaggi (riferiti sempre allo stesso rigo del main) che mi avvertono di una undefined reference con le funzioni
  • Re: Invalid conversion from char* to char

    Hai modificato il parametro a tutte le occorrenze di getrom ?
    NB: scusa ma dato che stai programmando in C++ perché non usi string anziché le C-string ?
  • Re: Invalid conversion from char* to char

    Sì, ho modificato tutte le occorrenze, nel main invoco la funzione così

    myrom.getrom(str);

    spero sia giusto; anche se il problema è riportato prima nel main a

    RomanType myrom;

    Comunque utilizzo C-stringhe perché poi dovrò leggere i numeri romani lettera per lettera per poi convertirli in decimali. C'è un modo di fare questo anche usando la classe string?
  • Re: Invalid conversion from char* to char

    roov_raven ha scritto:


    Sì, ho modificato tutte le occorrenze, nel main invoco la funzione così

    myrom.getrom(str);
    spero sia giusto; anche se il problema è riportato prima nel main a

    RomanType myrom;
    Scrivi il messaggio che visualizzi e posta il sorgente con le giuste correzioni.

    roov_raven ha scritto:


    Comunque utilizzo C-stringhe perché poi dovrò leggere i numeri romani lettera per lettera per poi convertirli in decimali. C'è un modo di fare questo anche usando la classe string?
    E' la stessa cosa, non cambia niente solo che è più facile lavorare con il tipo string perché esso possiede molti metodi che con le C-stringhe dovresti scrivere da codice. Prova ad eseguire questo programma e a scrivere "abcd" :
    #include "stdafx.h"
    #include <iostream>
    #include <string>
    #include <conio.h>
    
    using namespace std;
    
    int main()
    {
    	string example;
    	cin >> example;
    	for(int i = 0; i < example.length(); i++)
    	{
    		 example[i] += 1;
    	}
    	cout << example;
    	getch();
    	return 0;
    }
    ti verrà fuori bcde
Devi accedere o registrarti per scrivere nel forum
18 risposte