2012-07-25 10 views
5

Cinema 4D için eklentimi derlemek için Visual C++ kullanıyorum.Neden kodumun bir kısmı yürütülmedi?

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

beklenen çıktısı şudur:

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

(. Ya da "hayır" yerine aynı) Ama neden eksik iki baskılar


--> 
yes 
<-- 
olsun İşte?


BuGeDebugOut ilanıdır.

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

String sınıfı birleştirilebilir. + operatörünü aşırı yükler.

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

GeDebugOut' nasıl bildirilir? – jxh

+0

@ user315052 Düzenleme bölümüne bakın, pls. –

+1

'String'' std :: string' için bir yazım hatası mı? – jxh

cevap

5

Sen printf kullanmak gibi GeDebugOut kullanmak gerekir:

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

, yani onun tip char* olduğunu.

GeDebugOut bir aşırı yük de String türünü kabul yana

, o zaman olarak unicode kullanmaya ihtiyacım var:

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

benim şüphe unicode etkinse, daha sonra CHAR temelde wchar_t, olmadığıdır çünkü char. Ve bu nedenle, dize birleştirme işlemi, + aşırı yüklenmesine geçirilmek üzere örtük olarak String türüne dönüştürülmediğinden, dize birleştirme çalışmaz.

+0

Oh, bilmek güzel. Ama şimdi uygulama çöküyor, çünkü 'char * 'beklediğini ve String'i geçtiğimi tahmin ediyorum. Ama 'String' sınıfı birleştirilebilir, bu yüzden neden bu şekilde çalışmamalı? –

+0

Ayrıca bkz. 'GeDebugOut' –

+0

@NiklasR:' c-string olması gereken her şeyin beyanı. – Nawaz

1

Dize değişmezine bir dize ekleyemezsiniz.

"Is there a subroot", bir dize değişmezidir ve derleyici, bu kelimenin tam anlamıyla bir gösterici olarak kullanımını görecektir. Eğer belirtildiği gibi derleyici seçebilirsiniz GeDebugOut iki versiyonu vardır,

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

: o karşılaştığında

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

:

daha iyi bir yolu yapmak olacaktır

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

"Is there a subroot", türüne çeviren bir dize değişmezidir const char*. String'un bazı sayısal türlerde bir dönüşüm operatörüne sahip olduğundan şüpheleniyorum. Yani derleyici ilk aşırı yükü seçiyor.

const char* için + operasyon işaretçi aritmetiği, dize birleştirme Bunun nedeni, beklemediğiniz ediyoruz davranışa yol açan, bu nedenle bu çıktısını Değişmez dize işaretçisi toplamına GeDebugOut çağıran ve her ne konum strconst char* dönüşümdür.

Bunu düzeltmenin birkaç yolu vardır. Bir başka belirtildiği gibi, printf benzeri sözdizimini değiştirebilirsiniz. Ya da, String'u kullanmak için aşağıdaki gibi üstesinden gelebilirsiniz:

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

Derleyicinin imleç değişkenleri arasında aritmetik olmasına izin vermeyecek şekilde düzeltildikten sonra, "String" in sayısal bir türe dönüştürülebilmesi daha az olası görünmesine karşın, düzeltildi. – JohnMcG