Forum Informatica Unict

LAUREA TRIENNALE (D.M. 270/04) => Programmazione 1, 9 CFU => Topic started by: vijan on 20-03-2018, 01:43:09



Title: fuori scala? ed overloading <<
Post by: vijan on 20-03-2018, 01:43:09
buona sera, dopo svariate ore di debugging mi arrendo, e chiedo aiuto.
Il codice sottostante durante l'esecuzione esplode, c'è stato un momento in cui funzionava perfettamente, poi ha deciso di morire .poverinoi .
Durante il mio debugging mi sono accorto delle seguenti cose:
  • modificando "srand(111222333);" in "srand(111222332);"
il codice funziona senza problemi, da qua la mia idea che qualcosa vada fuori scala.
  • apparentemente il problema è nei costruttori
inoltre l'overloading dell'operatore << effettuato così va bene?
Spero che qualcuno possa aiutarmi, e se avete consigli sono ben accetti

Code:
#include <string>
#include <typeinfo>
#include <iostream>
#include <sstream>
#include <cmath>
#include <stdlib.h>

using namespace std;

class A{
private:
float x;
string st;
protected:
short getFirstVowel(){
for (int i=0;i < this->st.length();i++){
if((tolower(st[i])==st[i])&&(st[i]=='a'||st[i]=='e'||st[i]=='i'||st[i]=='o'||st[i]=='u')){
//cout << "CONTROLLO" <<st[i];
return i;
}
}
return -1;
}

public:
A(int *vec,short n){
//cout << "CONTROLLO__A\n";
for( int i=0;i<n;i++){
this->x += vec[i];
//cout << "CONTROLLO__Afine1\n"<<i<<"|" << n<<endl;
st+= ((char)vec[i]);
//cout << "CONTROLLO__Afine\n"<<i<<endl;
}
x/= n;

}
virtual int f()=0;
virtual ostream &put(ostream &os)const {
return os << "Class " << typeid(*this).name()<<": x=" << this ->x <<", st=" << this->st;
}
};
ostream &operator<<(ostream &os,const A &obj) {
return obj.put(os);
}
class B:public A{
private:
float *values;
short len;
public:
B(int *vec,short n):A(vec,n){
//cout << "CONTROLLO__B\n";
float *v=new float(n);
for (int i=0;i<n;i++){
v[i]=log(vec[i]);
}
len=n;
values=v;
}
int f(){
float min=values[0];
for(int i=1;i<len;i++){
min= ( min<values[i] ?  min:values[i]);
}
return (round(min));
}

};

class C:public A{
private:
int i;
public:
C(int *vec,short n):A(vec,n){
//cout << "CONTROLLO__C\n";
i= (int)(vec[rand()% n]%50);
}
bool moreThan(int y){
return this->i<y ? this->i:y;
}
int f(){
return ((this->i) + (this->getFirstVowel()));
}
ostream &put(ostream &os)const {
return A::put(os) << "{ i="<< this ->i<<"}";
}
//C(int *vec,short n):A(vec,n){}
};



int main(){
  srand(111222333);
  int const DIM=30;
  A *vett[DIM];
  short l, select;
  int *vec;
 

  for(int i=0; i<DIM; i++){
    l = rand()%8 + 5;
    select = rand()%2;
    vec = new int[l];

    for(int c=0; c<l; c++)
      vec[c] = 97 + rand()%25;   
   
    if(select)
      vett[i] = new B(vec, l);
     
     else     
      vett[i] = new C(vec, l);
         

    }

   
cout << "Punto I (visualizzare gli oggetti):" <<endl;
int *min=new int(INT_MAX);
int *max=new int(INT_MIN);
float *avg=new float(0);
for (int i=0;i<DIM;i++){
//cout << "CONTROLLO";
cout << i << ")" << *vett[i] <<endl;
cout << "\tf()="<< vett[i]->f() <<endl;
*min= *min<vett[i]->f() ? *min: vett[i]->f();
*max= *max>vett[i]->f() ? *max: vett[i]->f();
*avg+= (vett[i]->f());
}
*avg/= DIM;
cout << "\n\n Punto II (minimo, media e massimo dei valori di f()):" <<endl;
cout << "min: " << *min <<", max:" <<*max <<", avg:"<< *avg<<endl;
//delete min, max,avg;
cout << "\n\nPunto III (indici degli oggetti per cui moreThan(10) e' true):" <<endl;
for (int i=0;i<DIM;i++){
if(typeid(*vett[i])==typeid(C) && ((C*)vett[i])->moreThan(10))
cout <<i << " "; 
}
   
   
 return 0;
}


Title: Re:fuori scala? ed overloading <<
Post by: Superaxel on 20-03-2018, 10:11:46
hai incollato male il codice.. correggi e proviamo a debuggare..


Title: Re:fuori scala? ed overloading <<
Post by: Superaxel on 20-03-2018, 10:16:16
a prima vista vedo variabili non inizializzate e operazioni su puntatori non dereferenziati..  .sisi

edit: inoltre sarebbe utile avere l'UML.


Title: Re:fuori scala? ed overloading <<
Post by: vijan on 20-03-2018, 11:28:45
ho re incollato il codice, ora cerco queste variabili e le operazioni che dici tu, e vedo se cambia cosa

UML: http://www.dmi.unict.it/~messina/didat/16032018/compB.pdf (http://www.dmi.unict.it/~messina/didat/16032018/compB.pdf)


Title: Re:fuori scala? ed overloading <<
Post by: Mirkesx on 20-03-2018, 16:31:19
A me compila e stampa, ma in effetti si comporta in maniera strana, come se avesse un random attivo da qualche parte. I valori dovrebbero essere sempre fissi e invece vedo che variano ad ogni esecuzione.

EDIT
Ho notato due errori:

1) moreThan ha la return che ritorna numeri e non true/false, e infatti nel punto 3 ti stampa tutti gli indici di ogni oggetto di classe C (il compilatore passa true appena vede un valore numerico diverso da 0);
2) Gli oggetti del vettore values delle istanze di classe B non sono corretti. Alcuni numeri sono del tipo "-2.30388e-031" ed è questo problema che secondo me ti porta a far crashare il programma. Infatti le f() di alcuni oggetti di classe B non sono corrette (ovvero tutti quelli afflitti da questo problema).


Title: Re:fuori scala? ed overloading <<
Post by: fmessina on 21-03-2018, 09:15:20
Ciao,

l'istruzione "float *v=new float(n);", presente nel codice che hai mostrato, equivale ad allocare spazio in memoria per una singola variabile di tipo float ed inizializzare tale variabile con il valore rappresentato dal parametro n.

l'istruzione "float *v = new float[n]" consente di allocare spazio per un array di n elementi float (valore iniziale degli elementi dello array non definito).

Non ho esaminato il tuo codice per intero, quindi è possibile che siano presenti altri errori.

 


Title: Re:fuori scala? ed overloading <<
Post by: vijan on 22-03-2018, 13:11:05
A me compila e stampa, ma in effetti si comporta in maniera strana, come se avesse un random attivo da qualche parte. I valori dovrebbero essere sempre fissi e invece vedo che variano ad ogni esecuzione.

EDIT
Ho notato due errori:

1) moreThan ha la return che ritorna numeri e non true/false, e infatti nel punto 3 ti stampa tutti gli indici di ogni oggetto di classe C (il compilatore passa true appena vede un valore numerico diverso da 0);
2) Gli oggetti del vettore values delle istanze di classe B non sono corretti. Alcuni numeri sono del tipo "-2.30388e-031" ed è questo problema che secondo me ti porta a far crashare il programma. Infatti le f() di alcuni oggetti di classe B non sono corrette (ovvero tutti quelli afflitti da questo problema).

Ho sistemato il moreThan,c'era anche la condizione al contrario :"-(

Ciao,

l'istruzione "float *v=new float(n);", presente nel codice che hai mostrato, equivale ad allocare spazio in memoria per una singola variabile di tipo float ed inizializzare tale variabile con il valore rappresentato dal parametro n.

l'istruzione "float *v = new float[n]" consente di allocare spazio per un array di n elementi float (valore iniziale degli elementi dello array non definito).

Non ho esaminato il tuo codice per intero, quindi è possibile che siano presenti altri errori.

 
Ok grazie prof, ora sembra andare, non mi ero accorto di aver usato le parentesi sbagliate  :-)|