Mi sono messo da un po a studiare il c++ tramite un(bellissimo) libro consigliatomi da sla.
Non sono ancora ad un livello decente per fare qualcosa ma volevo mettere in pratica ciò che facevo facendo qualche dll per imparare(il mio obiettivo che penso, ora come ora, di poter raggiungere tranquillamente è quello di fare una dll per il metodo della diffusione di homu che a mio parere è forse un po più lento e richiede più risorse ma ha molte più potenzialità per una eventuale IA)
Ho fatto una semplice dll che sfrutta la memoria dinamica, a me funziona perfettamente ma giusto per curiosità l'ho fatta provare a nocche al quale però non andava(diceva mancava una dll di windows), ho quindi provato ad usare vs 2008 e anche con quello, seppur con un'errore diverso, a me andava ed a lui no.
Volevo quidni sapere se era un caso mio che va o un caso suo che non va oppure se cè qualche errore strano che non permette il funzionamento ad una certa gamma di pc.
Quindi ecco il file compresso dove troverete dll e gm81(forse dovevo farli in gmk ma chissà dove ho messo gm8.0) sia per vs2010 che per vs2008. Basterà far partire il gioco in teoria dovrebbe disegnare a schermo "37" sempre che non cambiate il valore nel create.
Se vedete che non va provate a fare qualche aggiornamento e a scaricare i redistributable:
http://www.microsoft.com/downloads/en/d ... laylang=en
http://www.microsoft.com/downloads/it-i ... 50143D5867
Sono per vs2010 per i x86 e 64 bit, credo che coprano pure quelli per vs2008 ma non ne sono sicuro.
Ditemi eventuali problemi e cose cosi.
Per fare la dll ho creato un nuovo progetto applicazione consolle e selezionato che fosse un progetto dll vuoto.
Il codice usato è motlo semplicemente questo:
Codice: Seleziona tutto
#define export extern "C" __declspec( dllexport )
export double crea_variabile(double valore)
{
double* a = new double(valore);
int b= (int) a;
return (double) b;
}
export double leggi_variabile(double puntatore)
{
int a = (int) puntatore;
int* b = (int*) a;
double* punt = (double*) b;
return (double) *punt;
}
export double cancella_variabile(double puntatore)
{
int a = (int) puntatore;
int* b = (int*) a;
double* punt = (double*) b;
delete punt;
return 0;
}
Come vedete non fa altro che creare, leggere e cancellare una variabile di tipo double, più di metà del codice alla fine son solo conversioni di tipo per far si che GM legga l'indirizzo alla variabile come un double, so che se un'utente mageggia a caso i valori potrebbe fare degli errori ma come ho detto è solo una prova.
Altra cosa che mi interesserebbe sapere è la compatibilità con i 64 bit, qualcuno sa cosa devo fare/evitare di fare perchè un programma sia compatibile anche con gli winzoz a 64 bit?
EDIT:altra cosa che non ho detto. Non ho idea di cosa cambi perchè son ancora inesperto ma ho lasciato il set di caratteri unicode. Potrebbe influenzare qualcosa? Ora sto facendo a provare a nocche con il multibyte...
EDIT2: ecco l'archivio con le nuove dll con set caratteri multibyte anche se non credo cambi nulla...
http://www.mediafire.com/?xq2twkfa1bsudab
EDIT3: ecco ho pure ridotto le conversioni di tipo in un'unica riga cosi da evitare l'uso di variabili temporanee(quindi più veloce) ed essere più leggibile:
Spoiler
Codice: Seleziona tutto
#define export extern "C" __declspec( dllexport )
export double crea_variabile(double valore)
{
return (double) (int) new double(valore);
}
export double leggi_variabile(double puntatore)
{
double* punt = (double*) (int*) (int) puntatore;
return (double) *punt;
}
export double cancella_variabile(double puntatore)
{
delete (double*) (int*) (int) puntatore;
return 0;
}