2017-06-15 2 views
-2

ich diesen Fehler auf dem folgenden Code erhalten
error C1061: compiler limit : blocks nested too deeply
Ich habe keine Vorlagen, habe ich 1 Makro, 3 verschachtelte Namespaces und einfache flache Klasse, wie Sie unten sehen können .
Diese Klasse enthält 225 Datenelemente mit einer Get() -Funktion für jede.
Wenn Sie versuchen, diese Klasse allein zu kompilieren, funktioniert es gut.
Der Fehler tritt auf, wenn ich dieses Objekt als Datenelement einer anderen Klasse in einer exportierten DLL verwenden.Blocks zu tief verschachtelt - durch virtuelle Funktion verursacht

Ich bevorzuge es, dynamische Zuordnung nicht zu verwenden, da Zeit von größter Wichtigkeit ist.
Ich muss alle meine Datenelemente verwenden (was mit weniger getan werden kann, aber das Debuggen wäre schwieriger), aber ich verstehe nicht, wie diese Deklaration vieler Arrays diese verschachtelten Blöcke beeinflussen kann.

Dinge, die ich habe versucht:
Ohne die 'virtuelle' in der Get() Funktionen, kompiliert es in Ordnung.
Eigentlich ist eine Get() - Funktion mit 'virtuellen' mit 126 Datenelementen genug, um dieses Problem zu verursachen.
Ohne das Makro 'NATIVEDLL_API' in der Klassendefinition, kompiliert es fein.
Wenn alle Arrays Zeiger sind, kompiliert es fein.
MAX_SIZE Makrowert scheint hier kein Problem zu sein.

Calculator.h

#ifdef CALCULATORDLL_EXPORTS 
#define NATIVEDLL_API __declspec(dllexport) 
#else 
#define NATIVEDLL_API __declspec(dllimport) 
#endif 
#define MAX_SIZE 1000 
class DataHelper 
{ 
public: 
    DataHelper(){} 
    virtual double* GetPhase1(){return m_phase1;} // "virtual " cause error C1061 
    virtual double* GetPhase2(){return m_phase2;} // "virtual " cause error C1061 
    virtual double* GetPhase3(){return m_phase3;} // "virtual " cause error C1061 
    ... more like those (225 in total) 
    double m_phase1[MAX_SIZE]; 
    double m_phase2[MAX_SIZE]; 
    double m_phase3[MAX_SIZE]; 
    .... more like those (225 in total) 
}; 


class NATIVEDLL_API Calcaultor   
{ 
    DataHelper m_staticData; 
}; // the error points to this line 
+3

Sie erhalten * was * Fehler? –

+0

Ich fügte den Fehler auch dem Nachrichtentext hinzu. Es ist das gleiche wie in der Kopfzeile. –

+0

Sie sind sicher, dass Sie so viele Mitglieder und Getter brauchen? Warum nicht einfach ein zweidimensionales Array verwenden? –

Antwort

0

225 * 1000 * 8 = 1,7 MB pro Instanz der Klasse. Dies passt wahrscheinlich nicht auf einen normalen Stapel. Wenn Sie den Heap anstelle des Stapels verwenden, sollte es funktionieren, also warum nicht die Klasse ändern:

DataHelper() 
{ 
    m_phase1 = new double[MAX_SIZE]; 
    m_phase2 = new double[MAX_SIZE]; 
    m_phase3 = new double[MAX_SIZE]; 
} 

double *m_phase1; 
double *m_phase2; 
double *m_phase3; 

Vergessen Sie nicht, sie in der destructor zu befreien.

+0

Danke, ich möchte nicht dynamische Zuordnung verwenden, da es mehr Zeit und dauert Ich muss in diesem Teil des Codes effizient sein. Außerdem habe ich versucht, den MAX_SIZE-Makro auf 2 zu reduzieren, und es wirft immer noch diesen Kompilierungsfehler. –

Verwandte Themen