PDA

View Full Version : [c++] turbo c++genera eccezione su lettura file


nuovoUtente86
01-11-2007, 21:11
Sia il modalità vcl che shell
una semplice istruzione del tipo

ifstrem(file) genera un' eccezione che non riesco ad eliminare.Il problema non riguarda nè il codice ne il file in quanto su dev funziona.
Purtroppo devo fare la grafica con turbo.Potrebbe essere un' incompatibilità con Vista?

variabilepippo
01-11-2007, 21:26
Non ho modo di effetture prove con Turbo C++, però ipotizzo che la causa del malfunzionamento sia da imputare al fatto che stai cercando di effettuare delle operazioni da "console" su un'applicazione GUI senza aver creato la console. Ma senza vedere TUTTO il codice, come al solito, è impossibile risolvere alcunché...

nuovoUtente86
01-11-2007, 21:37
Non ho modo di effetture prove con Turbo C++, però ipotizzo che la causa del malfunzionamento sia da imputare al fatto che stai cercando di effettuare delle operazioni da "console" su un'applicazione GUI senza aver creato la console. Ma senza vedere TUTTO il codice, come al solito, è impossibile risolvere alcunché...

no il codice è stato modificato.
Mi sono espresso male.Sulla stessa operazione effettuata sia in una console application che in una vcl da lo stesso errore.

ti posto il metodo:
void conta(int *contatore,const char* file) {
for(int i=0; i<256; i++)
contatore[i]=0;
ifstream file(file);
...........
...........}

lo stesso metodo utilizzato in dev non da problemi,in turbo si.

variabilepippo
01-11-2007, 21:49
Non è la prima volta che ti suggerisco di postare TUTTO il codice per risolvere il problema. Come un battito d'ali di farfalla in Madagascar può causare un monsone in India, una virgola fuori posto in un sorgente può generare casini impensabili.

Magari il problema risiede nel modo in cui richiami il metodo o in qualche riga lontana dal codice incriminato. Purtroppo i compilatori C++ possono generare comportamenti diversi a parità di codice, senza considerare che anche le impostazioni di progetto possono influire notevolmente.

nuovoUtente86
01-11-2007, 22:17
#include <vcl.h>
#pragma hdrstop

#include "Unit8.h"
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <string>

using namespace std;
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm8 *Form8;

class carattere {
public:
int occorrenza;
unsigned char value;
const carattere *carattere0;
const carattere *carattere1;

carattere(unsigned char c=0, int i=-1) {
value=c;
occorrenza=i;
carattere0=0;
carattere1=0;
}

carattere(const carattere *c0, const carattere *c1) {
value=0;
occorrenza=c0->occorrenza + c1->occorenza;
carattere0=c0;
carattere1=c1;
}

bool operator>(const carattere &a) const {
return occorenza > a.occorenza;
}

void stampa(string codice="") const {

if (carattere0) {
carattere0->stampa(codice + "0");
carattere1->stampa(codice + "1");

} else {
TListItem* item = Form8->ListView1->Items->Add();

item->Caption = value;
item->SubItems->Add(codice);
item->SubItems->Add(occorrenza);
}
}

};

void contaOccorenze(int *counter,const char* filename) {
for(int i=0; i<256; i++)
counter[i]=0;
ifstream file(filename);
if(!file) {
}
for( ; ; ) {
char c;
file.get(c);
if (file)
counter[c]++;
else
break;
}
};


astcall TForm8::TForm8(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm8::Button1Click(TObject *Sender)
{
int counter[256];


contaOccorrenze(counter,Edit1->Text.c_str());
priority_queue<carattere, vector<carattere>, greater<carattere> > q;

// for (int i=0; i<256; i++)
if (counter[i])
q.push(carattere(i, counter[i]));

while (q.size()>1) {
carattere *carattere0 = new carattere(q.top());
q.pop();
carattere *carattere1 = new carattere(q.top());
q.pop();
q.push(carattere(carattere0, carattere1));
}


q.top().stampa();
}