Pages: [1]   Go Down
Print
Author Topic: fuori scala? ed overloading <<  (Read 1186 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
vijan
Matricola
*
Offline Offline

Posts: 5


« 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 .
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;
}
« Last Edit: 20-03-2018, 11:26:29 by vijan » Logged
Superaxel
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 212


I've gone too far to turn back around


« Reply #1 on: 20-03-2018, 10:11:46 »

hai incollato male il codice.. correggi e proviamo a debuggare..
Logged

I turned around, saw a light shining through the door was wide open
Superaxel
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 212


I've gone too far to turn back around


« Reply #2 on: 20-03-2018, 10:16:16 »

a prima vista vedo variabili non inizializzate e operazioni su puntatori non dereferenziati..  

edit: inoltre sarebbe utile avere l'UML.
« Last Edit: 20-03-2018, 10:18:42 by Superaxel » Logged

I turned around, saw a light shining through the door was wide open
vijan
Matricola
*
Offline Offline

Posts: 5


« Reply #3 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
Logged
Mirkesx
Matricola
*
Offline Offline

Posts: 22


« Reply #4 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).
Logged
fmessina
Moderator
Apprendista Forumista
*****
Offline Offline

Posts: 114


« Reply #5 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.

 
Logged
vijan
Matricola
*
Offline Offline

Posts: 5


« Reply #6 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 cry

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  testate
Logged
Pages: [1]   Go Up
Print
Jump to: