2012-07-25 12 views
5

Utilizzo Visual C++ per compilare il plug-in per Cinema 4D.Perché parte del mio codice non è stata eseguita?

GeDebugOut("-->"); 
    subroot = NULL; 
    head = NULL; 
    tail = NULL; 
    success = PolygonizeHierarchy(source, hh, head, tail, &subroot, malloc); 
    if (!success) { 
     /* .. */ 
    } 
    String str("not set."); 
    if (subroot) { 
     GeDebugOut("yes"); 
     str = "yes!"; 
     GeDebugOut("Subroot name: " + subroot->GetName()); 
    } 
    else { 
     GeDebugOut("no"); 
     str = "no!"; 
    } 
    GeDebugOut("Is there a subroot? " + str); 
    GeDebugOut("<--"); 

Il risultato atteso è la seguente:

--> 
yes 
Subroot name: Cube 
Is there a subroot? yes 
<-- 

(. O lo stesso con "no" invece) ma ho

--> 
yes 
<-- 


Perché sono due stampe mancanti Qui?


Questa è la dichiarazione di GeDebugOut.

void GeDebugOut(const CHAR* s, ...); 
void GeDebugOut(const String& s); 

La classe String è concatenabile. Sovraccarica l'operatore +.

String(void); 
String(const String& cs); 
String(const UWORD* s); 
String(const CHAR* cstr, STRINGENCODING type = STRINGENCODING_XBIT); 
String(LONG count, UWORD fillch); 
friend const String operator +(const String& Str1, const String& Str2); 
const String& operator +=(const String& Str); 
+0

Come viene dichiarato 'GeDebugOut'? – jxh

+0

@ user315052 Vedi la mia modifica, pls. –

+1

'String' è un typedef per' std :: string'? – jxh

risposta

5

È necessario utilizzare GeDebugOut come si utilizza printf:

GeDebugOut("Some message = %s ", whatever); 

dove whatever è una c-string, cioè il suo tipo è char*.

Da un sovraccarico di GeDebugOut accetta String tipo anche, allora penso che è necessario utilizzare unicode come:

GeDebugOut(L"Is there a subroot? " + str); 
     //^note this! 

perché mio sospetto è che se unicode è abilitato, quindi CHAR è fondamentalmente wchar_t, non char. E a causa di ciò, la concatenazione di stringhe non funziona, poiché la stringa letterale non viene convertita implicitamente nel tipo String, da passare al sovraccarico +.

+0

Oh, buono a sapersi. Ma l'applicazione si blocca ora, immagino perché si aspetta 'char *' e io passo String. Ma la classe 'String' è concatenabile, quindi perché non dovrebbe funzionare in questo modo? –

+0

Vedere anche la mia modifica che include la dichiarazione di 'GeDebugOut' –

+0

@NiklasR:' whatever' dovrebbe essere una c-string. – Nawaz

1

Non è possibile aggiungere una stringa a un valore letterale stringa.

"Is there a subroot" è una stringa letterale e il compilatore ne vedrà l'utilizzo come puntatore a tale valore letterale.

Un modo migliore sarebbe quello di fare:

GeDebugOut("Is there a subroot? %s ", str); 
1

Come lei ha ricordato, ci sono due versioni del GeDebugOut il compilatore può scegliere tra:

void GeDebugOut(const CHAR* s, ...); 
void GeDebugOut(const String& s); 

quando incontra:

GeDebugOut("Is there a subroot? " + str); 

"Is there a subroot" è una stringa letterale, che si traduce digitare const char*. Sospetto che lo String abbia un operatore di conversione in un tipo numerico. Quindi il compilatore sta scegliendo il primo sovraccarico.

Questo si traduce in un comportamento che non ti aspetti, perché l'operazione + per const char* è l'aritmetica dei puntatori, non concatenazione di stringhe, quindi si sta chiamando GeDebugOut sulla somma puntatore del vostro stringa letterale, e qualunque sia l'output di tale const char* conversione di str è.

Ci sono diversi modi per correggerlo. Come già detto, puoi modificarlo in sintassi printf -like. Oppure puoi forzare l'uso della sovrapposizione String in questo modo:

GeDebugOut(String("Is there a subroot?") + str); 
+0

Modificato da notare dopo essere stato corretto, il compilatore non consentirà l'aritmetica tra le variabili del puntatore, anche se sembra meno probabile che 'String' sia convertibile in un tipo numerico, quindi il mio sospetto sembra meno valido. – JohnMcG

Problemi correlati