|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 | ||
|
Member
Iscritto dal: Dec 2007
Messaggi: 121
|
[C++] Malloc() & Spazio di allocazione
Ho un problema con malloc():
sto lavorando ad un progetto di grafica tridimensionale e devo caricare un modello 3D. uso questa struttura: Quote:
Il problema è che dopo un totale di spazio allocato con malloc() ho un crash alla prima chiamata della medesima funzione... Non capisco quale sia il problema... Perchè non posso creare molti puntatori? Eppure lo spazio utilizzato dal modello di prova è realmente esiguo (poco meno di 320 bytes) Posto di seguito la funzione per il caricamento del modello: Quote:
|
||
|
|
|
|
|
#2 |
|
Junior Member
Iscritto dal: May 2007
Messaggi: 29
|
Vediamo se ci azzecco!
All'inizio del programma, a mio parere, dopo avere definito le "class" e le "struct" devono essere dichiarate le variabili "complesse" che poi utilizzerai in cobFILE
cobMESH *this->MeshList; cobMATERIAL *this->MaterialList; ...... eccetera sinceramente nel tuo listato non le ho viste inizializzate! correggimi se sbaglio ! Spero di esserti stato di aiuto! |
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Dec 2007
Messaggi: 121
|
quelle le inizializza il costruttore richiamando memset()
il punto è che dopo che il modello è stato caricato io avvio glut e richiamando glutCreateWindow() il programma crasha e il debugger mi riporta al sorgente di malloc mi succede sempre, è la terza volta che ricomincio da zero tutto il progetto pensando di aver tralasciato qualcosa.. eppure il problema è sempre di malloc() ho esaminato altri sorgenti per caricare modelli 3D ma non trovo grandi differenze, anzi il mio modello mi risulta anche meno esteso di altri che allocano decine di puntatori. Mi è venuto il dubbio che sia un problema di heap ma alloco meno di 320 bytes! Ho chiesto anke in altri forum ma nessuno riesce a rispondermi |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Prima di tutto: perché usi malloc invece di new ?
|
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Dec 2007
Messaggi: 121
|
ti giuro: se mi avessi risposto 2 mesi fa ti sarei uscito dal lettore floppy per ringraziarti
ho risolto in questo modo proprio qlk secondo fa asd grazie 1000 ma...gia che ci siamo...sapete perchè malloc() ha un limite di allocazione? |
|
|
|
|
|
#6 |
|
Junior Member
Iscritto dal: May 2007
Messaggi: 29
|
Ritento!
Sinceramente non capisco come possa il costruttore inizializzare una variabile complessa e non dichiarata con memset. Atteso che questo avvenga (memset non lo uso mai!) , guarda che quelle variabili, se il programma è scrittto in C++, il programma le utilizza solo ed esclusivamente in ambito funzione cobFILE(), mentre non ti da accesso ad esse da altre funzioni e va in crash, ecco perchè ti consiglio di dichiararle come variabili globali all'inizio del programma! Se questo lo hai già fatto allora non so come aiutarti davvero ! Ciao !
|
|
|
|
|
|
#7 | |
|
Member
Iscritto dal: Dec 2007
Messaggi: 121
|
Quote:
ma era memset() che le inizializzava a zero. |
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
![]() In teoria il problema potrebbe esserci ancora o magari è rimasto nascosto, anche perché non sono a conoscenza di limiti di malloc rispetto a new. Magari avranno una diversa politica di allocazione e questo rende il problema, almeno pero ora, non visibile. Ultima modifica di cionci : 09-12-2007 alle 10:58. |
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quello che noto è che ci sono mooooolti problemi strutturali nel codice. Stai programmando in C++ "alla C". C++ è un linguaggio ad oggetti.
Ad esempio l'information hiding impone di non rendere pubbliche le variabili membro. In ogni caso quella classe fa troppe cose...fa sia da repository che da loader. Prima di tutto farei una buona riorganizzazione del codice e poi dopo penserei a ricercare quel bug. |
|
|
|
|
|
#10 |
|
Junior Member
Iscritto dal: May 2007
Messaggi: 29
|
Danger !
Egregio moderatore, scusa se sono stato un poco bricconcello nell'esprimermi, eppure qualcosa ne capisco anche io di C++ ! questo è il mio sito, con i miei programmi, dagli un occhiata ! forse di C++ ne capisco abbastanza anche io!
http://www.winturtle.netsons.org/ |
|
|
|
|
|
#11 |
|
Member
Iscritto dal: Dec 2007
Messaggi: 121
|
beh in effetti direi che è improbabile che un programmatore usi le globali in c++ scrivendo un motore grafico visto e considerato che il numero di modelli è indefinito e poi ogni livello contiene milioni di vertici e decine di oggetti di tipo differente (oggetti mobili, materiali, luci, statici, listati di animazioni, matrici, ecc...) sarebbe un po proibitivo.
|
|
|
|
|
|
#12 |
|
Member
Iscritto dal: Dec 2007
Messaggi: 121
|
ah forse ho capito cosa intendi.. se intendi strutture globali e funzioni che operano sulle strutture anzicchè classi che contengono funzioni e strutture puo anche essere utilizzabile come metodo però quando lavori con collisioni, suoni, animazioni e compagnia bella c'è da uscire pazzi O.O
EDIT: scusate il doppio post |
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Al massimo posso capire che possa essere una variabile globale l'istanza della classe che rappresenta l'engine grafico (ma personalmente nemmeno quello lo metterei globali) in un'applicazione 3D, ma già i repository di mesh e materiali devono essere contenuti all'interno dell'engine stesso e non essere globali. |
|
|
|
|
|
|
#14 |
|
Junior Member
Iscritto dal: May 2007
Messaggi: 29
|
Tutto fa brodo! La tua è una buona idea!
Mi scuso, se sono stato poco chiaro prima, per variabile globale io intendo qualsiasi variabile inizializzata all'inizio del programma (es. unsigned char x; ), che può essere tranquillamente utilizzata da qualsiasi funzione! Purtroppo il C++ permette ad esempio di dichiarare la varilabile x sia all'inizio del programma, sia in una qualsiasi funzione o procedura che tu crei (es. cobFILE)! Risultato: bisogna stare attenti poi a verificare quale abbia precedenza tra le due nella singola funzione o nella Main()! E' un casino! ed allora preferisco sempre dichiararle all'inizio e non ri-utilizzarle assolutamente nelle funzioni! Le variabili globali di cui tu parli sono più incasinate e sta a te vedere se utilizzarle o meno!
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
IceCoder: la classe cobFILE ha troppe responsabilità. Fa sia da loader che da repository.
Quindi una organizzazione minima alternativa potrebbe essere questa. Codice:
class cobFileLoader
{
//per ora possiamo fare un method object
CobFileLoader();
//metodi privati per suddividere le varie operazioni
static int loadHeader(ifstream &file, cobHeader &header);
static int loadMeshes(ifstream &file, cobMeshes &meshes);
static int loadMaterials(ifstream &file, cobMaterials &materials);
public:
static int Load(string fileName, cobHeader &header, cobMaterials &materials, cobMeshes &meshes);
};
class cobObject
{
cobHeader header;
cobMaterials materials;
cobMeshes meshes;
AbsolutePosition position;
cobObject(); //costruttore di default privato
public:
cobObject(const cobObject &object); //costruttore di copia per copiare gli oggetti
//factory method: dovrà essere chiamato da chi vuole costruire l'oggetto
static cobObject LoadFromCobFile(const string &fileName);
//ora non so cosa vuoi fare con questi dati, ma ad esempio:
void moveBy(float dx, float dy, float dz);
void moveTo(AbsolutePosition p);
codHeader & getHeader();
cobMaterials & getMaterials();
cobMeshes & getMeshes();
AbsolutePosition & getAbsolutePosition();
}
//per completezza implemento il factory method
static cobObject cobObject::LoadFromCobFile(const string &fileName)
{
cobObject obj;
if(!cobFileLoader::Load(fileName, obj.header, obj.materials, obj.meshes))
{
return NULL;
}
//qui fa uso del costruttore di copia, ma si potrebbe anche evitare per migliorare le prestazioni,
//ma come si dice: early optimization is the root of all evil ;)
return obj;
}
cobMaterials materials; cobMeshes meshes; L'header può essere anche la struttura dati che hai messo sopra, in quanto è una struttura statica. cobMaterials e cobMeshes per me devono essere collection. Ad esempio vector delle strutture sopra (nel modo più semplice); Ultima modifica di cionci : 09-12-2007 alle 11:44. |
|
|
|
|
|
#16 | |
|
Member
Iscritto dal: Dec 2007
Messaggi: 121
|
Quote:
|
|
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
|
|
|
|
|
|
|
#18 |
|
Member
Iscritto dal: Dec 2007
Messaggi: 121
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:40.





















