2012-07-25 15 views
5

Używam Visual C++ do kompilowania mojej wtyczki do Cinema 4D.Dlaczego część mojego kodu nie jest wykonywana?

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("<--"); 

oczekiwany wynik jest następujący:

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

(. Lub to samo z "nie" zamiast) Ale mam

--> 
yes 
<-- 


Dlaczego są dwa odciski brakujące tutaj?


Jest to deklaracja GeDebugOut.

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

Klasa String jest konkatenowalna. Przeciąża operatora +.

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

W jaki sposób zadeklarowano "GeDebugOut"? – jxh

+0

@ user315052 Zobacz moją edycję, pls. –

+1

Czy 'String' jest typedef dla' std :: string'? – jxh

Odpowiedz

5

Trzeba użyć GeDebugOut jak użyć printf:

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

gdzie whatever jest c-strunowy, tj jego typ jest char*.

Ponieważ przeciążenie GeDebugOut akceptuje String typ również, to myślę, że trzeba użyć unicode jako:

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

ponieważ moje podejrzenie jest to, że jeśli Unicode jest włączony, a następnie CHAR jest w zasadzie wchar_t, nie char. I z tego powodu, konkatenacja ciągów nie działa, ponieważ literał łańcuchowy nie jest domyślnie przekształcany w typ String, który należy przekazać do przeciążenia +.

+0

Och, dobrze wiedzieć. Ale teraz aplikacja się zawiesza, chyba dlatego, że oczekuje 'char *' i przekazuję String. Ale klasa "String" jest konkatenowalna, więc dlaczego nie powinna działać w ten sposób? –

+0

Proszę zobaczyć także moją edycję, która zawiera deklarację 'GeDebugOut' –

+0

@NiklasR:" cokolwiek "powinno być ciągiem znaków. – Nawaz

1

Nie można dołączyć ciągu do literału ciągu znaków.

"Is there a subroot" jest literałem łańcuchowym, a kompilator zobaczy użycie tego jako wskaźnika do tego literału.

Lepszym sposobem byłoby zrobić:

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

Jak wspomniano, istnieją dwie wersje GeDebugOut kompilator może wybierać spośród:

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

gdy napotka:

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

"Is there a subroot" to literał łańcuchowy, który oznacza rodzaj const char*. Podejrzewam, że String ma operatora konwersji na jakiś typ liczbowy. Tak więc kompilator wybiera pierwsze przeciążenie.

To powoduje zachowanie nie zwariować, bo operacja dla const char*+ jest wskaźnik arytmetyka, a nie ciąg konkatenacji, więc dzwonisz GeDebugOut na sumę wskaźnika swojego łańcucha dosłownym, a co wyjście że const char* konwersja str jest.

Istnieje kilka sposobów na poprawienie tego. Jak już wspomniano, można go zmienić na składnię podobną do printf. Lub możesz zmusić go do użycia nakładki String:

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

Edytowane w celu odnotowania po skorygowaniu, że kompilator nie pozwoli na arytmetyczną zmianę między zmiennymi wskaźnikowymi, choć wydaje się mniej prawdopodobne, że 'String' będzie konwertowalny na typ liczbowy, więc moje podejrzenie wydaje się mniej poprawne. – JohnMcG