2014-11-20 2 views
-2

У меня есть 2 указателя, которые указывают на два 20-элементных массива. Мои массивы содержат комплексные числа. Я хочу сделать элемент по элементу для этих сложных чисел, поэтому мне нужно разделить числа на реальные и мнимые части. Я пробовал следующий код, но он дает ошибку.действительная и мнимая часть комплексного номера

#include <complex> 

    complex *a; 
    complex *b; 
    complex array1[20]; 
    complex array2[20]; 
    a = &array1; 
    b = &array2; 
    int i=0; 
    for (i=0;i<=19;i++) 
    { 
    real_part_array1[i] = real(*a[i]); 
    imag_part_array1[i] = imag(*a[i]); 
    real_part_array2[i] = real(*b[i]); 
    imag_part_array2[i] = imag(*b[i]); 
    } 

Первая ошибка, которую я получил, была; Я попытался написать его как

#include <complex.h> 

сообщение об ошибке было «невозможно открыть исходный файл complex.h». Затем я удалил h, и ошибка исчезла. Вторая ошибка у меня есть для real() и imag(). Сообщение об ошибке «Идентификатор real undefined».

Для деления я должен разделить их на реальные и мнимые части, но я не знаю, как решить эту проблему. Надеюсь, вы, ребята, можете мне помочь.

+4

Вы можете просто прочитать документацию : http://en.cppreference.com/w/cpp/numeric/complex. Кроме того, что с указателями? Для чего они нужны? –

+0

это пример кода, поэтому я определил их как 20. Обычно это кусок огромной программы, и в указателе есть 44100 значений. Каждая другая функция использует их как указатель, поэтому мне не разрешено изменять его только на массив, я должен использовать его в качестве указателя. Прежде чем я задал свой вопрос, я прочитал документацию и попробовал решения, но не работал. Я хочу знать, есть ли возможность написать заголовочный файл со всеми этими функциями? – puCCa

+1

Имеет ли документация для '' 'что она определяет глобальную функцию' real'? Если да, то где это так? Если нет, то почему, по-вашему, ваш код должен работать? – hvd

ответ

2
  1. complex не тип, это типовой шаблон. Вам нужно указать тип реальных и мнимых компонентов в качестве параметра шаблона, например. complex<double>.

  2. Тип шаблона complex и функции real и imag находятся в std пространстве имен.

    Что касается complex<...>, вы можете написать std::complex<...> или положить using std::complex; below your includes. (You could also write используя патезрас;. ', Но это может быть опасно, чтобы привыкнуть к нему)

    Что касается real и imag, они могут использовать ADL ( rgument d ependent l ookup: когда их аргумент находится в пространстве имен std, имя функции автоматически просматривается также в std), поэтому вам не нужно указывать пространство имен для этих функций.

  3. В строке a = &array1; (и другой аналогичной) вы указываете на весь массив array1, который является указателем на массив. Вероятно, вам нужно либо &array[1], либо просто array1, так как массивы могут быть неявно преобразованы в указатель на их первый элемент.

  4. В *a[i] доступ к I-й элемент в массиве a указывает на (a сама по себе не является указателем, а оператор индекс массива работает на указатели, как если бы они были массивами). Затем вы разыскиваете этот сложный тип, который является недопустимым. Просто снимите *.

Вы можете увидеть окончательный код here.

-1

Вы, вероятно, хотите, чтобы использовать его как:

#include <complex> 


int main() 
{ 
    std::complex<float> *a; 
    std::complex<float> *b; 
    std::complex<float> array1[20]; 
    std::complex<float> array2[20]; 
    int real_part_array1[20]; 
    int real_part_array2[20]; 
    int imag_part_array1[20]; 
    int imag_part_array2[20]; 
    a = array1; 
    b = array2; 
    int i=0; 
    for (i=0;i<=19;i++) 
    { 
    real_part_array1[i] = std::real(a[i]); 
    imag_part_array1[i] = std::imag(a[i]); 
    real_part_array2[i] = std::real(b[i]); 
    imag_part_array2[i] = std::imag(b[i]); 
    } 
    return 0; 
} 

комплекс не является типом, но шаблон типа. Следовательно, вы можете использовать что-то вроде комплекса < int> или complex < double>.

Также реальные и imag находятся в пространстве имен std, следовательно std :: real и std :: imag.

Теперь, когда вы говорите = & array1, array1 уже указатель, вы присваиваете указатель на указатель на LHS, который является указателем, это ошибка типа

+0

'std :: complex ' не имеет смысла в стандартном C++. Чтобы процитировать стандарт: «Эффект создания шаблона« complex »для любого типа, кроме' float', 'double' или' long double', не указан. " – hvd

+0

Да, извините, мой плохой. Полностью пропустил это. Обновлен ответ. – jester

Смежные вопросы