2011-09-15 42 views
5

Tôi chưa viết mã C++ trong một thời gian dài; Tuy nhiên bây giờ tôi phải làm việc trên một công cụ texas F28335 DSP và tôi đang cố gắng để di chuyển từ C đến C + +. Tôi có đoạn mã sau đó là cố gắng để khởi tạo một dịch vụ thường xuyên ngắt với một phương pháp tĩnh của một lớp:C++ chuyển con trỏ tới phương thức tĩnh

//type definition for the interrupt service routine 
typedef interrupt void (*PINT)(void); 
//EPWMManager.h 
class EPWMManager 
{ 
public: 
    EPWMManager();  
    static interrupt void Epwm1InterruptHandler(void); 
}; 
//EPWMManager.cpp 
interrupt void EPWMManager::Epwm1InterruptHandler(void) 
{ 
//some code to be called on interruption 
} 
//main.cpp 
int main(void) 
{ 
    PINT p; 
    p = &(EPWMManager::Epwm1InterruptHandler); 
    return 0; 
} 

Khi biên soạn tôi nhận được như sau:

error: a value of type "void (*)()" cannot be assigned to an entity of type "PINT"

Tôi đoán tôi là thiếu một số diễn viên.

+1

Từ khóa 'gián đoạn 'không phải là một phần của C++. Nó phải là một phần mở rộng cụ thể cho việc triển khai của bạn. Điều gì sẽ xảy ra nếu bạn xóa nó khỏi các định nghĩa của cả hai 'PINT' và' Epwm1InterruptHandler'? Bạn vẫn gặp lỗi? –

+0

Chất lượng trải nghiệm của tôi về trình biên dịch TI dành cho bộ vi xử lý DSP không ấn tượng ngay cả đối với C (ví dụ: chúng tôi đã phát hành nhiều lần trong các lỗi của trình tạo mã trên các trường hợp xử lý trang). Bạn có chắc rằng việc chuyển sang ngôn ngữ phức tạp hơn như C++ là một ý tưởng hay không? – 6502

+0

nếu tôi có 'ngắt' ra các lỗi là ra ... Tuy nhiên tôi không chắc chắn về những tác động nó có. Tôi đã nghĩ rằng việc chuyển sang C++ sẽ là một ý tưởng tốt để có mọi thứ có cấu trúc hơn (các lớp, đối tượng, các mẫu thiết kế, vv) vì mã C của chúng ta bắt đầu trông rất lộn xộn. – TropE

Trả lời

2

Tôi nghĩ rằng vấn đề cơ bản là ký hiệu và tiền tố RHS của nhiệm vụ của bạn với p. Ngoài ra, "PINT" là "con trỏ đến số nguyên" trong các hệ điều hành khác. Vì vậy, hãy tránh bất kỳ xung đột tên tiềm năng nào. Nhưng tôi nghĩ điều này sẽ phù hợp với bạn:

// you may have to move "interrupt" keyword to the left of the "void" declaration. Or just remove it. 
typedef void (interrupt *FN_INTERRUPT_HANDLER)(void); 

interrupt void EPWMManager::Epwm1InterruptHandler(void) 
{ 
//some code to be called on interruption 
} 

int main(void) 
{ 
    FN_INTERRUPT_HANDLER p; 
    p = EPWMManager::Epwm1InterruptHandler; // no ampersand 

    // and if for whatever reason you wanted to invoke your function, you could just do this: 

    p(); // this will invoke your function. 

    return 0; 
} 
+0

Bạn nói đúng. Mã được cung cấp chỉ hoạt động tốt. Sau khi xem xét kỹ hơn mã của tôi, tôi đã quan sát thấy typedef được khai báo là C bên ngoài, làm cho nó không tương thích với mã C++. Tôi đã xóa nó và nó hoạt động ngay bây giờ. Cảm ơn. – TropE

0

Tôi nghĩ rằng bạn có một vài sai lầm cú pháp không liên quan ở đây: như tôi hiểu Epwm1InterruptHandler của bạn có nghĩa vụ phải trả về một con trỏ đến một chức năng của loại ngắt, thì trước tiên loại bỏ khoảng trống từ dòng

static interrupt void Epwm1InterruptHandler(void); 

static interrupt void Epwm1InterruptHandler(void); 

sau đó hãy chắc p kiểu ngắt, và sau đó đặt dấu ngoặc như thế này:

interrupt p; 
p = &(EPWMManager::Epwm1InterruptHandler()); 
+0

Hàm đó * IS * trình xử lý ngắt, không phải cái gì đó trả về một con trỏ tới một trình xử lý ngắt. – 6502

0

Bạn không bỏ lỡ một; sau khi void ngắt typedef (* PINT) (void)? Mã của bạn biên dịch cho tôi.

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