Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 02-02-2008, 16:24   #1
ciuaz!!!
Senior Member
 
Iscritto dal: Sep 2003
Messaggi: 572
[C++] Problema stranissimo, risultati sballati a volte

Codice:
#include <iostream>
#include <fstream>
using namespace std;

void F(int *X, int &q, int &w, int &e) 

{
  ifstream IN("input");
  ofstream OUT ("output");
  if(!IN || ! OUT)
  throw (0);
  
int cont=0;


for (int i=0; (i<80) && (!IN.eof()); i++){
IN>>X[i];
cont++;
}


if (IN.eof()) cont--;
q=cont/20; //numero di torte (ciascuna contiene 20 elementi
w=(cont%20)/5; //numero di righe (ogni riga contiene 5 elementi)
e=((cont%20)%5); // numero di elementi rimanenti

IN.close();

}

int main()
{
  try {
      ifstream IN ("input");
      ofstream OUT("output");

  int A[4][4][5];
  int indice1=0,indice2=0,indice3=0;
  int *p= &A[0][0][0];
  int numeroelementi;
  F(**A, indice1, indice2, indice3);
 
  OUT << indice1 << ' ' << indice2 << ' ' << indice3 << ' '; 
 
  numeroelementi= indice1*20 + indice2*5 + indice3; 

for (int i=0; i<numeroelementi; i++)
OUT<<*(p+i)<<' ';

IN.close();
OUT.close();

  } 
  catch(int x) {cout<<"problemi con i file"<<x<<endl;}
}
Sto impazzendo. Questo programmetto per l'università prende da un file input una sequenza di interi con uno spazio che li divide e uno spazio alla fine della sequenza (per esempio 1 2 3 4 5 6 7 8 9 0 ). Poi mette in output 3 indici che fanno capire come è stato riempito l'array a 3 dimensioni, e in seguito stampa gli elementi dell'array che sono stati messi in input.

Il problema è che a volte mi dà in output strani caratteri indecifrabili (questi ′‰‰‱′″‴‵‶‷‸‹‰‱′″‴‵‶‷‸‹‰), faccio girare nuovamente il programma e in output mi dà sempre la stessa sequenza 4 0 0 2089314996 2089305984 [...] (ovviamente sballata e totalmente indipendente da quello che scrivo in input).

Devo quindi cancellare il file input e farne un altro, il programma funziona di nuovo per alcune sequenze (tipo 7 8 54 43 6 6 7 3 ) ma non funziona con 40 elementi, 39 elementi, 80 elementi... mentre con 20 elementi funziona (1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 ).

Non riesco proprio a capire perchè, faccio "a mano" le operazioni e non vedo errori.

Vi prego una mano, prima che spacchi tutto... (è rimasta integra ancora la tastiera e il monitor).
ciuaz!!! è offline   Rispondi citando il messaggio o parte di esso
Old 03-02-2008, 09:11   #2
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
if(!IN || ! OUT)
throw (0);

La gestione degli errori sui file è completamente errata. Sia quella sopra che il blocco try-catch, visto che non vengono generate eccezioni.

Inoltre è sbagliato il passaggio dei parametri alla funzione F...ma non sbagliato soltanto, è proprio orrido

Cosa volevi passare a F ?
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 03-02-2008, 09:30   #3
ciuaz!!!
Senior Member
 
Iscritto dal: Sep 2003
Messaggi: 572
Quote:
Originariamente inviato da cionci Guarda i messaggi
if(!IN || ! OUT)
throw (0);

La gestione degli errori sui file è completamente errata. Sia quella sopra che il blocco try-catch, visto che non vengono generate eccezioni.

Inoltre è sbagliato il passaggio dei parametri alla funzione F...ma non sbagliato soltanto, è proprio orrido

Cosa volevi passare a F ?
è il mio primo mese di C++.

Alla funzione gli passo F(**A, indice1, indice2, indice3) con **A il puntatore al primo elemento dell'array A[4][4][5]. Ma fai conto che abbia scritto &A[0][0][0] al posto di **A.
Poi passo indice1 2 3, perchè è sbagliato?
Ho dichiarato nella funzoine int &q, int &w, int &e che sono alias di indice1, indice2, indice3... (edit: più precisamente, nello specifico int &q, ecc.. sono i parametri formali, poi quando la F viene invocata, all'interno della funzione sono creati gli alias di indice1,2,3)

Avrei forse dovuto scrivere così?


int &F (int *X, &q, &w, &e)

?

Per il try / catch sono in alto mare, se ricordi dalla volta scorsa è il prof che ci ha scritto quella parte di programma, io da quella volta copio/incollo il try catch.
Non saprei proprio come gestirlo.

Ultima modifica di ciuaz!!! : 03-02-2008 alle 09:36.
ciuaz!!! è offline   Rispondi citando il messaggio o parte di esso
Old 03-02-2008, 09:49   #4
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Te l'avevo scritto come si gestiscono gli errori nei file l'altra volta.
Se IN.fail() è vero allora hai un'errore Se è falso puoi continuare l'esecuzione.
Comunque ho letto male, in effetti va bene il passaggio, non avevo visto che era un vettore a tre dimensioni.

Quindi il passaggio dei parametri è corretto. Magari è proprio la gestione degli errori sul file che non funziona ?

Prova a mettere:

ifstream IN("input");
if(IN.fail()) throw 0;

al posto di:

ifstream IN("input");
ofstream OUT ("output");
if(!IN || ! OUT)
throw (0);

Togli inoltre

ifstream IN("input");
ofstream OUT ("output");

dal main (nota che il file di out non ti serve).
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 03-02-2008, 09:59   #5
ciuaz!!!
Senior Member
 
Iscritto dal: Sep 2003
Messaggi: 572
Ok grazie mille cionci, ora provo.

Edit: Allora... non va.Ho fatto quello che mi hai consigliato, con l'unica eccezione del main: lì ho tolto solo ifstream IN, perchè a me serve scrivere in un file di output (è la consegna dell'esercizio, e serve, immagino, per la correzione automatica dello stesso).
Tirando le somme credo proprio tu abbia ragione, cioè il problema è la gestione degli errori.

void F(int *X, int &q, int &w, int &e)

{
ifstream IN("input");
if(IN.fail()) throw 0;

e qua non mi sembra ci siano problemi, legge dal file "input", se la lettura fallisce --->throw(0).
PS:magari dico una cazzata ma prima di ifstream ecc... ci va il try?

[CORPO FUNZIONE]

IN.close(); //chiude il file input, anche qua non mi sembra ci siano problemi.

int main()
{
try {
ofstream OUT("output"); // l'output s'ha da scrivere nel file "output".

[CORPO MAIN]
OUT << indice1 << ' ' << indice2 << ' ' << indice3 << ' '; //scrive in output i 3 indici (a volte va a volte no)... che ci sia qualcosa che non va? Ho notato che con 80 interi non funziona, con 20 si, con 90 no ... mah.

OUT.close(); //chiude il file di output

}
catch(int x) {cout<<"problemi con i file"<<x<<endl;} //boh.
}

Ultima modifica di ciuaz!!! : 03-02-2008 alle 10:18.
ciuaz!!! è offline   Rispondi citando il messaggio o parte di esso
Old 03-02-2008, 18:43   #6
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Prova a cambiare nome alle variabili rappresentanti i file: IN e OUT sono gia' definite in alcuni compilatori.
Inoltre non aprire due volte i file: una basta.

Ciao
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 04-02-2008, 10:02   #7
ciuaz!!!
Senior Member
 
Iscritto dal: Sep 2003
Messaggi: 572
Sotto Linux funziona bene, non da' errori di alcun tipo. Mah...
E visto che il mio prof usa Linux il problema e' risolto
Un Grazie per i preziosi consigli a cionci e sottovento.
ciuaz!!! è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
Dopo 23 anni di silenzio, Warcraft 3 spi...
Roblox sfida l'ecosistema gaming: app st...
OpenAI accusata di plagio dai migliori m...
Altro attacco hacker dell'IA: gli agenti...
Stiamo davvero perdendo il controllo del...
Microsoft perde un pilastro: Frank Shaw ...
Diablo V annunciato a sorpresa: il colpo...
Meno di 5 euro per il 5G: l'offerta Kena...
World of Warcraft: Forever è il Classic+...
La Serie A con DAZN e Amazon Prime con l...
Giochi Ubisoft su Steam senza Ubisoft Co...
Miami Beach ha autorizzato la maxi opera...
Apple regala un altro anno di funzioni s...
Alla fine è successo davvero: Vol...
Il meglio di Amazon del weekend in uno s...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 23:01.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v