PDA

View Full Version : [C++] Help programma Crasha -Esame venerdì


lefantome
13-01-2009, 18:54
file porto.h
Codice:

#include<fstream>
#include<cstdlib>
#include<iostream>

using namespace std;


struct section {
int boat;
int ord;
int max;
int* matricola;
section* pun;
};


class porto {
public:
section* p0;
porto() { p0->pun == 0; p0->ord =0;}
bool adds(int max, int pos);
bool addb( int m);
void stampa();

};


file porto.cpp
Codice:

#include"porto.h"






bool porto::adds(int max, int pos) {
section* p;
section* q;
section* r;

for (p=p0;p !=0;p= p->pun)
{
q=p->pun;
if (p->ord<pos && q->ord>=pos)
{
r = new section;
r->max = max;
r->boat=0;
r->matricola= new int[max];
for (int i=0;i<max;i++)
{ r->matricola[i]=0;}
r->ord = pos;
r->pun = q;
p->pun = r;
return true;
}

cout<<"error"<<endl;
return false;
}
if (p0->pun == 0)
{ p0->boat= 0;
p0->max = max;
p0->matricola= new int[max];
return true;}

}



bool porto::addb(int m) {
section* p = p0;
for (;p->pun !=0;p=p->pun)
{
if (p->boat < p->max) {
for (int i=0;i<p->max;i++)
{ if (p->matricola[i] ==0)
{ p->matricola[i]== m;
p->boat++;
return true;}
}
}
if (p0->ord ==0){return false;}
}}



void porto::stampa() {
section* p;
for (p=p0;p !=0;p= p->pun)
{
cout<<p->ord<<": ";
for (int i=0;i<p->max;i++)
{
cout<<p->matricola[i]<<", ";}
cout<<endl;}
return;}

file main.cpp
Codice:

#include"porto.h"

int main()

{porto a;
a.adds(2,0);
a.adds(3,1);
a.adds(3,0);
a.adds(2,2);
a.addb(12);
a.addb(22);
a.addb(15);
a.stampa();

system("pause");
return 0;





}


Dove può essere l'errore?credo con qualche puntatore ma mi crasha con devcpp. help ho l'esame venerdi! :doh: :banned:

DanieleC88
13-01-2009, 19:20
E p0 chi lo alloca, e quando? :)
Mi sono fermato a quest'errore e non ho visto il resto, quindi potrebbe esserci altro che non va. Prova. ;)

lefantome
14-01-2009, 11:43
E p0 chi lo alloca, e quando? :)
Mi sono fermato a quest'errore e non ho visto il resto, quindi potrebbe esserci altro che non va. Prova. ;)


ho aggiornato così:
class porto {
public:
section* p0;
porto() { p0 = new section; p0->pun = 0; p0->ord =0;}
bool adds(int max, int pos);
bool addb( int m);
void stampa();

};

ma crasha lo stesso.

mr_hyde
14-01-2009, 16:28
Regola numero 1: metti sempre controlli!
Meglio un controllo superfluo (in molti casi e' l'ottimizzazione del compilatore che li salta se veramente non servono) che rischiare un crash per non averlo messo!

Regola numero 2: quello che allochi nei costruttori in genere lo devi deallocare nei distruttori

Regola numero 3: non dare per scontato che le allocazioni vadano bene.

Regola numero 4: quando DICHIARI un puntatore inizializzalo sempre con qualcosa magari con 0 (0 in C++ e' il valore di NULL)

Regola numero 5: prima di usare un puntatore CONTROLLA CHE NON SIA NULL/0 (questa regola va a braccetto con la 4: avere un puntatore NON NULL comunque NON significa avere un puntatore valido)

In genere e' furbo fare una cosa del tipo

myType* p(0);
try
{
p = new myType(parametri);
p->ciccio();
}
catch (const std::bad_alloc& ba)
{
std::cerr << "Ho fallito l'allocazione - " << ba.what() << std::endl;
}
catch (...)
{
std::cerr << "Problemi non ben identificati nel blocco try " << std::endl;
}

[...]

// devo chiamare la funzione pluto() di p, ma NON sono sicuro che p sia valido
if (p) p->pluto();



Rivedi il codice visto quello che ti ho detto.

Ciao,
Mr Hyde

lefantome
14-01-2009, 19:29
grazie il codice l'avevo già rivisto ma mi sono dimenticato di aggiornare li.

cmq non so usare il debug perchè ancora nn ce l'hanno spiegato

dopo aggiorno