2012-05-10 41 views
9

Mã sau đây biên dịch và chạy tốt trong C (ít nhất theo 'gcc -std = gnu99'), nhưng không biên dịch được dưới C++, cho "dòng 5: lỗi: không thể chuyển đổi 'đôi' thành 'double phức tạp 'khi khởi tạo ". Có ai biết tại sao không?C Số phức trong C++?

Tôi nhận ra có một cách khác để thực hiện các số phức trong C++, nhưng tôi phải sử dụng số C phức tạp trong C++, vì đó là cách mã di sản mà tôi đã đưa ra. Cảm ơn nếu bạn có thể giúp!

+4

Nhưng thực sự, _why_ bạn không muốn sử dụng [ 'std :: phức tạp <>'] (http: // en.cppreference.com/w/cpp/numeric/complex)? – ildjarn

+2

FTR, '-std = gnu99' không thực sự là cờ bạn muốn cho ** C **. Đó là "C với những thứ GNU nghĩ là một ý kiến ​​hay, nhưng liệu nó có hay không là để giải thích". '-std = c99' là mong muốn nếu bạn muốn ** C **. –

+0

ildjarn: Thật không may, thư viện tôi đang làm việc với việc sử dụng các số phức C99 trong C++. Nó không có vẻ khôn ngoan để bắt đầu một dự án theo cách này, nhưng đây là mã tôi phải làm việc với. Martinho: Đúng vậy. Tôi nên làm bài kiểm tra với -std = c99 – iloveponies

Trả lời

10

Sử dụng từ khóa C cho phức tạp: _Complex. C++ sử dụng phức tạp như một lớp (mẫu). Tôi không chắc chắn nơi mà creal là hoặc tôi sẽ bỏ ghi chú đó.

#include <complex.h> 
#include <cstdio> 

int main(int argc, char * argv[]) { 
    double _Complex a = 3.0 + 0.0I; // DECLARATION WORKS NOW - NOTE ASSIGNMENT MUST HAVE IMAG PART 
    //printf("%lf\n", creal(a)); 
    return 0; 
} 

Điều này hoạt động trong gcc (tôi đã biên soạn bằng g ++). Tôi nhận được cảnh báo về các tiêu đề .h không được chấp nhận.

Here là liên kết đến đường dẫn email hiển thị khả năng tương thích không chuẩn với C++ và C với số phức. C++ 11 yêu cầu khả năng tương thích bố cục của các phức hợp C++ với C _Complexes.

Tôi hiện đang điều tra về creal, v.v. trong C++. Tôi không tìm thấy gì trong tiêu chuẩn. Vì dường như có một số nỗ lực để cung cấp một số khả năng tương thích nguồn giữa C++ và C thì creal, cpow, v.v. có thể bổ sung tốt cho TR2 các đề xuất thư viện.

+0

THANK YOU !!!!! Từ những gì bạn nói, tôi đã có thể nhận được giải pháp. Stack Overflow không cho phép tôi đăng giải pháp, nhưng đó là bạn phải thêm phần ảo vào bài tập. – iloveponies

9

Compatibility of C and C++

Several additions of C99 are not supported in C++ or conflict with C++ features, such as variadic macros, compound literals, designated initializers, variable-length arrays, and native complex-number types. The long long int datatype and restrict qualifier defined in C99 are not included in the current C++ standard, but some compilers such as the GNU Compiler Collection[4] provide them as an extension. The long long datatype along with variadic templates, with which some functionality of variadic macros can be achieved, are present in the new C++ standard, C++11. On the other hand, C99 has reduced some other incompatibilities by incorporating C++ features such as // comments and mixed declarations and code.

15

Trình biên dịch C++ có thể chọn hỗ trợ từ khóa _Complex làm phần mở rộng (và một số ít thực hiện), nhưng điều đó không thể di chuyển được. Nếu bạn muốn có một giải pháp C++ di động, bạn không cần sử dụng C++ std :: templates phức tạp, thật không may.

Tin tốt là C++ std :: số phức được đảm bảo tương thích với số C phức tạp (theo nghĩa là con trỏ đến con trỏ luôn có thể được chuyển đổi sang con trỏ khác và điều đúng sẽ xảy ra), có nghĩa là nếu bạn cần phải tương thích với một thư viện C mà dự kiến ​​giá trị phức tạp C, bạn sẽ không gặp bất kỳ rắc rối nào.

C11:

Each complex type has the same representation and alignment requirements as an array type containing exactly two elements of the corresponding real type; the first element is equal to the real part, and the second element to the imaginary part, of the complex number.

C++ 11:

If z is an lvalue expression of type cv std::complex<T> then:

— the expression reinterpret_cast<cv T(&)[2]>(z) shall be well-formed,

reinterpret_cast<cv T(&)[2]>(z)[0] shall designate the real part of z , and

reinterpret_cast<cv T(&)[2]>(z)[1] shall designate the imaginary part of z .

+0

Bảo đảm ở đâu ("C++ std :: số phức được đảm bảo tương thích với các số phức C99")? Câu trả lời dưới đây (http://stackoverflow.com/a/10540288/2189128) trích dẫn một nguồn phi chính tắc (Wikipedia) nói ngược lại. – Jeff

+2

@ Jeff: Liên kết wikipedia không thực sự mâu thuẫn với yêu cầu của tôi; chúng là các kiểu khác nhau, nhưng được đảm bảo có cùng một yêu cầu bố trí bộ nhớ và căn chỉnh. Tôi đã thêm các tham chiếu thích hợp vào câu trả lời của tôi. –