2012-05-10 25 views
9

Poniższy kod kompiluje się i działa dobrze w C (co najmniej zgodnie z "gcc -std = gnu99"), ale nie kompiluje się pod C++, podając "wiersz 5: błąd: nie można przekonwertować" podwójne "na" podwójne kompleks "przy inicjalizacji". Czy ktoś wie dlaczego?C Złożone liczby w C++?

#include "/usr/include/complex.h" 
#include <stdio.h> 

int main(int argc, char * argv[]) { 
    double complex a = 3; // ERROR ON THIS LINE 
    printf("%lf\n", creal(a)); 
    return 0; 
} 

Zdaję sobie sprawę, że istnieje inny sposób prowadzenia złożonych liczb w C++, ale muszę używać liczb zespolonych C w C++, bo to jest jak kod Legacy dano mi robi rzeczy. Dzięki, jeśli możesz pomóc!

+4

Ale naprawdę, _why_ nie chcesz używać [ 'std :: kompleks <>'] (http: // en.cppreference.com/w/cpp/numeric/complex)? – ildjarn

+2

FTR, '-std = gnu99' nie jest tak naprawdę flagą, której szukasz ** C **. To jest "C z czymś, co myślenie GNU byłoby dobrym pomysłem, ale czy to jest, czy nie, jest do interpretacji". '-std = c99' jest pożądane, jeśli chcesz ** C **. –

+0

ildjarn: Niestety, biblioteka, z którą pracuję używa numerów zespolonych C99 w C++. Mądrze nie wydaje się rozpoczynanie projektu w ten sposób, ale jest to kod, nad którym muszę pracować. Martinho: to prawda. Powinienem był zrobić test z -std = c99 – iloveponies

Odpowiedz

10

pomocą kluczowe C ośrodku: _Complex. C++ używa złożonej klasy (szablonu). Nie jestem pewien, gdzie znajduje się kreacja, a ja odkomentuję to.

#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; 
} 

Działa to w gcc (skompilowałem z g ++). Dostałem ostrzeżenie o przestarzałych nagłówkach .h.

Here to link do ścieżki wiadomości e-mail wykazujący niestandardową zgodność z C++ i C z liczbami zespolonymi. C++ 11 wymaga zgodności układów kompleksów C++ z C _Kompleksami.

Aktualnie badam creal itp. W C++. Nie znajduję niczego w standardzie. Ponieważ wydaje się, że staramy się zapewnić kompatybilność źródeł pomiędzy C++ i C, wówczas creal, cpow itp. Mogą stanowić miłe uzupełnienie TR2 w propozycjach biblioteki.

+0

DZIĘKUJEMY !!!!! Z tego, co powiedziałeś, udało mi się uzyskać rozwiązanie. Stack Overflow nie pozwala mi jeszcze opublikować rozwiązania, ale to, że musisz dodać część urojoną do zadania. – 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

Kompilator C++ może wybrać słowo kluczowe _Complex jako rozszerzenie (i kilka), ale nie jest to przenośne. Jeśli chcesz mieć przenośne rozwiązanie w C++, musisz użyć szablonów c :: std :: complex, niestety.

Dobrą wiadomością jest to, że C++ std :: liczba zespolona gwarantuje zgodność z liczbami zespolonymi C (w tym sensie, że wskaźnik do jednego można zawsze przekonwertować na wskaźnik do drugiego, a właściwa rzecz się wydarzy), co oznacza, że ​​jeśli chcesz współdziałać z biblioteką C, która oczekuje złożonych wartości C, nie będziesz miał żadnych problemów.

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

Gdzie jest ta gwarancja ("C++ std :: liczby zespolone mają gwarantowaną zgodność z numerami zespolonymi C99")? Odpowiedź poniżej (http://stackoverflow.com/a/10540288/2189128) przytacza niekanoniczne źródło (Wikipedia), które mówi coś przeciwnego. – Jeff

+2

@Jeff: Link do Wikipedii nie jest w rzeczywistości sprzeczny z moim twierdzeniem; są to różne typy, ale gwarantują takie same wymagania dotyczące układu pamięci i wyrównania. Dodałem odpowiednie odniesienia do mojej odpowiedzi. –

Powiązane problemy