Un matematico ha scritto:... come mia nonna che vuole da anni il sistema per vincere al lotto e crede che io, in quanto matematico, sia fallito perché non glielo trovo
class Utente
{
public:
Utente()
{
NumeroDiTransazioni[Nut] = {0};
float Reliability_value[Nut] = {0};
Trust_value[Nut] = {0.0};
Reputation = 0.5;
cheat = false;
}
gdb
e valgrind
ed è saltato fuori l'errore valgrind/memcheck
non si sia lamentato di niente...Un matematico ha scritto:... come mia nonna che vuole da anni il sistema per vincere al lotto e crede che io, in quanto matematico, sia fallito perché non glielo trovo
Raptorista ha scritto:@vict: qui si vede che non ho proprio letto il codice, l'ho solo fatto passare ingdb
evalgrind
ed è saltato fuori l'errore
vict85 ha scritto:
- Codice:
class Utente
{
public:
Utente()
{
NumeroDiTransazioni[Nut] = {0};
float Reliability_value[Nut] = {0};
Trust_value[Nut] = {0.0};
Reputation = 0.5;
cheat = false;
}
Questo costruttore è completamente sbagliato. La prima riga accede e riscrive qualcosa al di fuori dell'array NumeroDiTransazioni. La seconda riga definisce un array locale al costruttore e lo inizializza a 0 (ma quell'array è eliminato alla fine del costruttore e non modifica l'array che è membro della classe). La terza riga fa la stessa cosa della prima. La quarta e la quinta hanno senso. Quello non è il modo in cui azzeri un array in un costruttore, ti suggerisco di fare un for per inizializzare a 0 ogni elemento dell'array.
Utente()
{
for (int i=0;i<Nut;i++){
NumeroDiTransazioni[i]=0;
Reliability_value[i]=0;
Trust_value[i]=0.0;}
Reputation=0.5;
cheat=false;
}
vict85 ha scritto:
@Daniele_97: ma qual'è il testo del problema?
#include <array>
#include <iostream>
#include <fstream>
#include <cstdlib>
class Utente
{
public:
constexpr Utente() noexcept : m_reputazione{ 0.5f } {};
constexpr float reputazione() const { return m_reputazione; }
constexpr void aggiorna_repuntazione(float recensione, float reputazione_compratore) noexcept
{
const float factor = (reputazione_compratore < 0.5f)
? reputazione_compratore * reputazione_compratore * reputazione_compratore
: reputazione_compratore * reputazione_compratore;
m_reputazione = m_reputazione * (1 - factor) + factor * recensione;
}
constexpr bool imbroglia() noexcept { return m_reputazione < 0.5f; }
private:
float m_reputazione;
};
int main()
{
constexpr unsigned int NUMERO_UTENTI = 100;
std::array< Utente, NUMERO_UTENTI > utenti;
std::ifstream ifile("transaction1.dat", std::ios::in);
if (!ifile) {
std::cerr << "File transaction1.dat could not be opened" << std::endl;
exit(EXIT_FAILURE);
}
for (;;)
{
int mittente = 0, destinatario = 0;
float voto = 0.0f;
{
float valore_da_ignorare = 0.0f;
ifile >> mittente >> destinatario >> valore_da_ignorare >> voto;
}
if (!ifile)
{
ifile.close();
break;
}
if ( mittente == destinatario
|| mittente < 0 || mittente >= NUMERO_UTENTI
|| destinatario < 0 || destinatario >= NUMERO_UTENTI
|| voto < 0.0f || voto > 1.0f )
{
std::cerr << "Transazione invalida: "
<< mittente << " -> " << destinatario
<< " feed=" << voto << std::endl;
ifile.close();
exit(EXIT_FAILURE);
}
Utente& utente_mittente = utenti[mittente];
Utente& utente_destinatario = utenti[destinatario];
utente_destinatario.aggiorna_repuntazione(voto, utente_mittente.reputazione());
}
for (int i = 0; i != utenti.size( ); ++i)
{
if (utenti[i].imbroglia())
{
std::cout << i << std::endl;
}
}
}
vict85 ha scritto:È possibile che sia legato al fatto che il costruttore, per quanto sbagliato, non accede a nulla al di fuori della classe.
Super Squirrel ha scritto:Non è mica obbligatorio rispondere ad un topic se non si ha molta voglia di farlo!
vict85 ha scritto:Gran parte dei dati che memorizzi e che calcoli non li usi per calcolare la reputazione finale degli utenti. Per capirci, questo codice è equivalente al tuo:
Un matematico ha scritto:... come mia nonna che vuole da anni il sistema per vincere al lotto e crede che io, in quanto matematico, sia fallito perché non glielo trovo
Visitano il forum: Nessuno e 1 ospite