Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di escocat
    Registrato dal
    Feb 2012
    Messaggi
    308

    [C#] Direttive al preprocessore. #define a visibilità globale

    Allora. (ciao a tutti)
    In un progetto Xna abbiamo la possibilità di "attaccare" diversi files *.cs. (bella scoperta). Solo in un caso la GPU fa la schizzinosa con le variabili int, e cioè nella dichiarazione degli indici che occorrono al metodo DrawUserIndexedPrimitives. Ho scoperto che - di per sè - 'int' non vuol dire nulla. Se ci troviamo su un bellissimo modernissimo PC con Windows 7 pagato 10000 euri allora int = System.Int32 (64?). Se invece siamo su un vergognoso scassatissimo vecchio rottame allora int = System.Int16. Ma nel primo PC (quello "buono") è accettato anche il tipo 'int' e basta.
    Io uso tutti e due questi PC, e per far funzionare un progetto l'unica cosa che ho saputo fare nella mia immensa ignoranza è definire un simbolo con direttiva al preprocessore

    #define OLD16

    e scrivere ovunque nel file principale Game1.cs

    codice:
    #if OLD16
            public System.Int16[] indices;
    #else
            public int[] indices;
    #endif
    così se sono nel PC buono faccio

    //#define OLD16

    e me ne esco. Ora però che riesco a fare progetti con 1543 files *.cs, il simbolo OLD16 definito nel file Game1.cs non viene "visto" dagli altri files, con la conseguenza che "mi rompo" a commentare e decommentare la direttiva al preprocessore in ogni file .cs.
    C'è un modo per definire OLD16 solo in un file e farlo vedere a tutti gli altri files?
    Grazie.

  2. #2

    Re: [C#] Direttive al preprocessore. #define a visibilità globale

    Originariamente inviato da escocat
    Allora. (ciao a tutti)
    In un progetto Xna abbiamo la possibilità di "attaccare" diversi files *.cs. (bella scoperta). Solo in un caso la GPU fa la schizzinosa con le variabili int, e cioè nella dichiarazione degli indici che occorrono al metodo DrawUserIndexedPrimitives. Ho scoperto che - di per sè - 'int' non vuol dire nulla. Se ci troviamo su un bellissimo modernissimo PC con Windows 7 pagato 10000 euri allora int = System.Int32 (64?). Se invece siamo su un vergognoso scassatissimo vecchio rottame allora int = System.Int16. Ma nel primo PC (quello "buono") è accettato anche il tipo 'int' e basta.
    Questa è una sciocchezza. In C# int è sempre un intero con segno a 32 bit, ovvero int = System.Int32 per definizione.*

    Il mio consiglio di base è usare semplicemente Int16 (=short) in ogni caso se questo non ti causa particolari problemi. Per il resto, io vedo sostanzialmente due possibilità:
    - continui con il metodo dell'ifdef, ma, invece di usare una #define, imposti il tuo flag nelle proprietà del progetto; l'ovvio svantaggio è che hai due eseguibili separati per le due configurazioni;
    - usi una variabile object per indices, scegliendo il tipo dinamicamente al momento di creare l'array; questo ovviamente ha un leggero costo a runtime.

    ---

    * La cosa che dici più o meno vale per C e C++, dove int (in genere) è il tipo intero "nativo della piattaforma" (ma non è detto - sulle attuali macchine a 64 bit normalmente i compilatori usano ancora int a 32 bit). Nota che questo non ha nulla a che vedere con quanto il PC sia scassato - anche su un Pentium 1 di 20 anni fa l'int è normalmente a 32 bit se ci installi sopra un compilatore C a 32 bit.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it L'avatar di escocat
    Registrato dal
    Feb 2012
    Messaggi
    308
    Decisamente un brutto momento questo per me! Prima la figura di cacca con la storia dei Keys, ora mi sono preso pure una botta si sciocco.... e vabbè per imparare C# questo ed altro.....
    Non ho capito la storia del flag, che flag? All'idea di usare sempre e comunque gli short io ci starei (con questo caldo....) ma non va bene: i vertici possono essere anche 65000 più o meno e uno short non li prende tutti (non vorrei aggravare la mia situazione dicendo altre minchiate....)

  4. #4
    Originariamente inviato da escocat
    Non ho capito la storia del flag, che flag?
    Mi riferivo alla #define OLD16.
    All'idea di usare sempre e comunque gli short io ci starei (con questo caldo....) ma non va bene: i vertici possono essere anche 65000 più o meno e uno short non li prende tutti (non vorrei aggravare la mia situazione dicendo altre minchiate....)
    Be', ma se ti aspetti di avere bisogno di più di 32767 vertici (uno short è signed, dunque il limite superiore è di 32767) allora che senso ha compilare con la #define OLD16?
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it L'avatar di escocat
    Registrato dal
    Feb 2012
    Messaggi
    308
    Perchè spesso sono costretto ad usare lo scassatissimo rottame e lo uso solo per studiare e testare progetti in scala ridotta e meno vertici.
    Ma dunque non c'è speranza di rendere visibile la direttiva #define in tutto l'assembly? Ma chi l'ha fatto questo C#? Uno peggio di me? (sto scherzando....)

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Elimina la #define, vai nelle proprietà del

    Progetto - Build - Conditional compilation symbols

    e aggiungi nel textbox il valore

    OLD16
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Originariamente inviato da escocat
    Perchè spesso sono costretto ad usare lo scassatissimo rottame e lo uso solo per studiare e testare progetti in scala ridotta e meno vertici.
    Ma dunque non c'è speranza di rendere visibile la direttiva #define in tutto l'assembly? Ma chi l'ha fatto questo C#? Uno peggio di me? (sto scherzando....)
    Originariamente inviato da MItaly
    - continui con il metodo dell'ifdef, ma, invece di usare una #define, imposti il tuo flag nelle proprietà del progetto; l'ovvio svantaggio è che hai due eseguibili separati per le due configurazioni;
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Utente di HTML.it L'avatar di escocat
    Registrato dal
    Feb 2012
    Messaggi
    308
    Ah! Oh! Uh! Buono! Che bella cosa. Ora si che ci siamo. Grazie a tutti quanti.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.