2012-07-25 24 views
5

Estoy usando Visual C++ para compilar mi complemento para Cinema 4D.¿Por qué parte de mi código no se ejecuta?

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

El resultado esperado es el siguiente:

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

(. O el mismo con el "no" en su lugar) pero me da

--> 
yes 
<-- 


¿Por qué son dos impresiones faltantes ¿aquí?


Esta es la declaración de GeDebugOut.

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

La clase String es concatenateable. Sobrecarga el operador +.

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

¿Cómo se declara 'GeDebugOut'? – jxh

+0

@ user315052 Ver mi edición, pls. –

+1

¿Es 'String' un typedef para' std :: string'? – jxh

Respuesta

5

Es necesario utilizar GeDebugOut como se utiliza printf:

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

donde whatever es un c-secuencia, es decir su tipo es char*.

Desde una sobrecarga de GeDebugOut acepta String tipo también, entonces creo que es necesario utilizar Unicode como:

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

porque mi sospecha es que si Unicode está habilitado, entonces CHAR es básicamente wchar_t, no char. Y debido a esto, la concatenación de cadenas no funciona, ya que el literal de cadena no se convierte implícitamente en el tipo String, para pasarse a la sobrecarga +.

+0

Oh, es bueno saberlo. Pero la aplicación se cuelga ahora, supongo que porque espera 'char *' y yo pasamos String. Pero la clase 'String' es concatenable, entonces ¿por qué no debería funcionar de esta manera? –

+0

También vea mi edición que incluye la declaración de 'GeDebugOut' –

+0

@NiklasR:' whatever' debe ser una cadena de caracteres. – Nawaz

1

No se puede agregar una cadena a un literal de cadena.

"Is there a subroot" es una cadena literal y el compilador verá el uso de ella como un puntero a ese literal.

Una mejor manera sería hacer:

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

Como usted ha mencionado, hay dos versiones de GeDebugOut el compilador puede elegir:

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

cuando encuentra:

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

"Is there a subroot" es una cadena literal, que se traduce en tipo const char*. Sospecho que String tiene un operador de conversión de algún tipo numérico. Entonces el compilador elige la primera sobrecarga.

Esto se traduce en un comportamiento no está esperando, porque la operación de +const char* es la aritmética de punteros, no de concatenación de cadenas, por lo que está llamando GeDebugOut en la suma de puntero de la cadena literal, y cualquiera que sea la salida de ese const char* conversión de str es.

Hay varias formas de corregir esto. Como se mencionó anteriormente, puede cambiarlo a printf -like sintaxis. O puede obligarlo a usar la superposición String como sigue:

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

Editado para observar después de que se corrigió que el compilador no permitirá la aritmética entre las variables de puntero, aunque parece menos probable que 'String' sea convertible a un tipo numérico, por lo que mi sospecha parece menos válida. – JohnMcG

Cuestiones relacionadas