2012-07-25 37 views
5

Tôi đang sử dụng Visual C++ để biên dịch plug-in cho Cinema 4D.Tại sao một phần mã của tôi không được thực thi?

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

Sản lượng dự kiến ​​như sau:

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

(. Hoặc tương tự với "không" thay vì) Nhưng tôi nhận được

--> 
yes 
<-- 


Tại sao hai bản in thiếu đây?


Đây là tuyên bố của GeDebugOut.

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

Lớp String có thể ghép nối được. Nó quá tải toán tử +.

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' được khai báo như thế nào? – jxh

+0

@ user315052 Xem chỉnh sửa của tôi, bắt đầu. –

+1

Là 'String' một typedef cho' std :: string'? – jxh

Trả lời

5

Bạn cần phải sử dụng GeDebugOut như bạn sử dụng printf:

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

nơi whatever là một c-string, tức là kiểu của nó là char*.

Từ một tình trạng quá tải của GeDebugOut chấp nhận String loại cũng có, sau đó tôi nghĩ rằng bạn cần phải sử dụng unicode như:

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

nghi ngờ của tôi là nếu unicode được kích hoạt, sau đó CHAR về cơ bản là wchar_t, không char. Và bởi vì điều này, chuỗi nối không hoạt động, vì chuỗi ký tự không ngầm được chuyển đổi thành loại String, được chuyển tới quá trình tải xuống +.

+0

Ồ, tốt để biết. Nhưng ứng dụng bị treo ngay bây giờ, tôi đoán bởi vì nó mong đợi 'char *' và tôi vượt qua String. Nhưng lớp 'String' có thể ghép nối được, vậy tại sao nó không hoạt động theo cách này? –

+0

Cũng vui lòng xem chỉnh sửa của tôi bao gồm khai báo 'GeDebugOut' –

+0

@NiklasR:' whatever' phải là chuỗi c. – Nawaz

1

Bạn không thể nối chuỗi vào chuỗi ký tự.

"Is there a subroot" là chuỗi chữ và trình biên dịch sẽ thấy việc sử dụng nó làm con trỏ cho chữ đó.

Một cách tốt hơn là nên làm:

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

Như bạn nói, có hai phiên bản của GeDebugOut trình biên dịch có thể lựa chọn:

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

khi nó gặp:

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

"Is there a subroot" là một chuỗi chữ, được dịch để nhập const char*. Tôi nghi ngờ String có toán tử chuyển đổi đối với một số loại số. Vì vậy, trình biên dịch đang chọn quá tải đầu tiên.Đây là kết quả trong hành vi mà bạn không mong đợi, bởi vì hoạt động + cho const char* là số học con trỏ, không nối chuỗi, vì vậy bạn đang gọi GeDebugOut trên tổng số con trỏ của chuỗi ký tự của bạn và bất kỳ đầu ra nào const char* chuyển đổi str.

Có một số cách để bạn có thể sửa lỗi này. Như đã đề cập khác, bạn có thể thay đổi nó thành cú pháp giống như printf. Hoặc bạn có thể ép buộc sử dụng số tiền này là String quá mức như sau:

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

Đã sửa đổi lưu ý sau khi sửa chữa trình biên dịch sẽ không cho phép số học giữa các biến con trỏ, mặc dù dường như ít có khả năng 'Chuỗi' sẽ được chuyển đổi thành kiểu số, vì vậy sự nghi ngờ của tôi dường như không hợp lệ. – JohnMcG

Các vấn đề liên quan