AldoBaldo (Member)
Guru
Messaggi: 699
Iscritto: 08/01/2015
|
Ultimo, come hai letto ero propenso a credere all'ipotesi dell'errore coi puntatori proposta da Nessuno (e dunque all'ipotesi di scritture improvvide in zone a casaccio della memoria). Direi che quell'ipotesi è però da scartare dopo le verifiche che ho riportato nel mio ultimo commento, (s)ragionando "ad alta voce". Non sono certo un esperto, per cui se ci sono falle nei miei ragionamenti accetto di buon grado che me le si faccia notare. Dal basso della mia inesperienza, a me sembrano ragionamenti validi.
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti. |
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/2010
|
Per tagliare la testa al toro... puoi inviare il sorgente da compilare e lo controllo?
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
Ultimo (Member)
Guru
Messaggi: 877
Iscritto: 22/05/2010
|
forse non puoi dichiarare una costante in maniera non esplicita?
If ok Then GOTO Avanza else GOTO Inizia
|
|
AldoBaldo (Member)
Guru
Messaggi: 699
Iscritto: 08/01/2015
|
Nessuno, per ora no: è in una fase troppo "preliminare" per cui è parecchio incasinato e ci farei una pessima figura (diciamo che è codice tagliatelle scotte). Più avanti senz'altro, tanto con l'accorgimento di dichiarare const INT kMaxInTavola = 8*3; funziona tutto a dovere.
Ultimo, cosa intendi con "dichiarare una costante in maniera non esplicita"? Inizializzarla facendo riferimento ad altre costanti? L'ho sempre fatto senza problemi. Del resto queste due forme sono equivalenti (credo):
Codice sorgente - presumibilmente C++ |
const int kA = 10; const int kB = 15; const int kC = kA + kB; // oppure const int kA = 10; const int kB = 15; const int kC = 10 + 15;
|
Anche "10" e "15", dopotutto, sono costanti, no?
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti. |
|
Ultimo (Member)
Guru
Messaggi: 877
Iscritto: 22/05/2010
|
Codice sorgente - presumibilmente C/C++ |
const SIZE kDimGrigliaTavola = { 8, 3 };
// quì sarebbe come scrivere kMaxInTavola= 8*3, ma ha quanto pare non lo è
const INT kMaxInTavola = kDimGrigliaTavola.cx * kDimGrigliaTavola.cy;
|
If ok Then GOTO Avanza else GOTO Inizia
|
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
Se aggiungi static:
Codice sorgente - presumibilmente C++ |
static const SIZE kDimGrigliaTavola = { 8, 3 }; static const INT kMaxInTavola = kDimGrigliaTavola.cx * kDimGrigliaTavola.cy;
|
Che succede? Non dovrebbe esserci nessuna differenza, ma prova.
Ultima modifica effettuata da pierotofy il 04/05/2015 alle 2:18
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/2010
|
Almeno potresti farci vedere la funzione NuovaPartita magari il problema è in quella funzione.
Sono convinto sempre che ci sia un problema nel codice che sporca la memoria e pensare ad un modo diverso di gestire la costante ti distrae dal vero errore che ti porti dietro nel codice.
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
AldoBaldo (Member)
Guru
Messaggi: 699
Iscritto: 08/01/2015
|
@Pierotofy
Ho provato. Grazie per il suggerimento, ma non cambia nulla.
@nessuno
NuovaPartita() è in effetti una funzione che chiama altre funzioni. Più che NuovaPartita() in se, ecco MettiInTavola():
Codice sorgente - presumibilmente C# |
UINT MettiInTavola( HWND hwnd, DATIFIN *df ) { if( df == NULL ) return kErrDatiFinestraNonRilevabili; INT i, inc; // "i" = "numero carta"; "inc" = "incremento" for( inc=1, i=1; i<kMaxInTavola*2/3; ++i, ++inc ) { // "cit" = "carte in tavola" df->cit.Aggiungi( df->mazzo.Preleva(), i ); // mostra il mazzo col numero // delle carte ancora da giocare df->mazzo.Cancella( df->os ); df->mazzo.Traccia( df->gfxOs ); df->mazzo.Invalida( hwnd ); // mostra la carta appena "posata" in tavola df->cit.Cancella( df->os, i ); df->cit.Scopri( TRUE, FALSE, i ); df->cit.Traccia( df->gfxOs, i ); df->cit.Invalida( hwnd, i ); UpdateWindow( hwnd ); Sleep( kVelocita ); // per posizionare le carte al centro dello spazio disponibile if( inc == kDimGrigliaTavola.cx-2 ) { inc = 0; i += 2; } } return kErrNessunErrore; }
|
Estrapolata dal contesto non credo che dica un gran che, anche perché fa riferimento a strutture e classi che non sono visibili nel frammento. In nessuna delle strutture e delle classi in questione si usa kMaxInTavola, né kDimGrigliaTavola.
Ah, per la cronaca... "os" sta per "offscreen" ed è un oggetto di una classe "fai-da-te" per gestire la grafica in modo più nitido; "gfxOs" è un oggetto di tipo Graphics di GDI+ usato per disegnare nell'offscreen. Invece "cit" fa riferimento a un oggetto di classe "RASSEGNA" che è una specie di array "specializzato" nel gestire in modo particolare oggetti di classe CARTA; "mazzo" riguarda un oggetto di classe "MAZZO" che si occupa di gestire il mazzo delle carte ancora da giocare.
Certo è che non avendo sotto mano l'implementazione delle classi non è che tutto questo sia molto chiaro.
Ultima modifica effettuata da AldoBaldo il 04/05/2015 alle 20:29
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti. |
|