Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Una costante... birichina!
Forum - C/C++ - Una costante... birichina! - Pagina 2

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 23:50
Domenica, 03/05/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.
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 0:17
Lunedì, 04/05/2015
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à.
PM Quote
Avatar
Ultimo (Member)
Guru


Messaggi: 877
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 0:31
Lunedì, 04/05/2015
forse non puoi dichiarare una costante in maniera non esplicita?


If ok Then GOTO Avanza else GOTO Inizia

PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 1:27
Lunedì, 04/05/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++

  1. const int kA = 10;
  2. const int kB = 15;
  3. const int kC = kA + kB;
  4.  
  5. // oppure
  6.  
  7. const int kA = 10;
  8. const int kB = 15;
  9. 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.
PM Quote
Avatar
Ultimo (Member)
Guru


Messaggi: 877
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 1:45
Lunedì, 04/05/2015

Codice sorgente - presumibilmente C/C++

  1. const SIZE kDimGrigliaTavola = { 8, 3 };
  2.    // quì sarebbe come scrivere kMaxInTavola= 8*3, ma ha quanto pare non lo è
  3.     const INT kMaxInTavola = kDimGrigliaTavola.cx * kDimGrigliaTavola.cy;





If ok Then GOTO Avanza else GOTO Inizia

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 2:16
Lunedì, 04/05/2015
Se aggiungi static:

Codice sorgente - presumibilmente C++

  1. static const SIZE kDimGrigliaTavola = { 8, 3 };
  2. 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


Il mio blog: https://piero.dev
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 8:39
Lunedì, 04/05/2015
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à.
PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 20:21
Lunedì, 04/05/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#

  1. UINT MettiInTavola( HWND hwnd, DATIFIN *df ) {
  2.     if( df == NULL ) return kErrDatiFinestraNonRilevabili;
  3.  
  4.     INT i, inc; // "i" = "numero carta"; "inc" = "incremento"
  5.  
  6.     for( inc=1, i=1; i<kMaxInTavola*2/3; ++i, ++inc ) {
  7.         // "cit" = "carte in tavola"
  8.         df->cit.Aggiungi( df->mazzo.Preleva(), i );
  9.  
  10.         // mostra il mazzo col numero
  11.         // delle carte ancora da giocare
  12.         df->mazzo.Cancella( df->os );
  13.         df->mazzo.Traccia( df->gfxOs );
  14.         df->mazzo.Invalida( hwnd );
  15.  
  16.         // mostra la carta appena "posata" in tavola
  17.         df->cit.Cancella( df->os, i );
  18.         df->cit.Scopri( TRUE, FALSE, i );
  19.         df->cit.Traccia( df->gfxOs, i );
  20.         df->cit.Invalida( hwnd, i );
  21.  
  22.         UpdateWindow( hwnd );
  23.         Sleep( kVelocita );
  24.  
  25.         // per posizionare le carte al centro dello spazio disponibile
  26.         if( inc == kDimGrigliaTavola.cx-2 ) { inc = 0; i += 2; }
  27.     }
  28.  
  29.     return kErrNessunErrore;
  30. }



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.
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo