Ошибки компиляции C2059, C2061, C2146 и спорадическая ошибка IntelliSense - PullRequest
1 голос
/ 08 января 2012

У меня возникли проблемы с компиляцией моей программы, и я думаю, что большая часть проблемы сейчас заключается в том, что я смотрю на нее слишком долго ...

Обзор этой одной части программы: у вас есть комплексное число в прямоугольной форме (представленное структурой «Комплекс»), которое вы хотите преобразовать в комплексное число в полярной форме (представлена ​​структурой «pComplex»)

При попытке собрать я получаю эти ошибки, каждые три раза:

"error C2059: syntax error: ')'"  
"error C2059: syntax error: ';'"  
"error C2061: syntax error: identifier 'c1'"  
"error C2146: syntax error: missing ')' before identifier 'c1'"  

Кроме того, я получаю IntelliSense: identifier "Complex" is undefined, но только до тех пор, пока не нажму на нужную строку, затем она исчезнет.

Все ошибки указывают на одну и ту же строку в одном и том же заголовочном файле (pcomplex.h):

pComplex NF_convert_c2_pcdouble(Complex c1);

соответствующие части pcomplex.h:

#ifndef PCOMPLEX_H
#define PCOMPLEX_H
#include "complex.h"
#include <math.h>
//
// ... 
//
typedef struct nf_complex_polar{
    double r;
    double angle;
} pComplex;
//
// ... 
//
pComplex NF_convert_c2_pcdouble(Complex c1);
//
// ... 
//
#endif

соответствующие части complex.h:

#ifndef COMPLEX_H
#define COMPLEX_H
#include "pcomplex.h"
#include <math.h>
//
// ... 
//
typedef struct nf_complex{
    double real;
    double imag;
} Complex;
//
// ... 
//
Complex NF_convert_pc2_cdouble(pComplex pc1);
//
// ... 
//
#endif

Что-то еще, что я заметил, при наведении курсора на имя функции в pcomplex.c,

pComplex NF_convert_c2_pcdouble(Complex c1)
{
    //This function converts a rectangular form complex number c1
    //    and returns it as a polar form complex number pc1
    pComplex pc1;
    double x, y, r, a;
    x = c1.real;
    y = c1.imag;
    r = sqrt( x*x + y*y );
    a = atan2(y,x);
    pc1.r = r;
    pc1.angle = a;
    return pc1;
}

У меня есть небольшое всплывающее окно, содержащее это, и я не знаю, что означает вторая строка:

pComplex NF_convert_c2_pcdouble(Complex c1)

pComplex NF_convert_c2_pcdouble(<error-type> c1)

Достаточно ли этой информации и кода для того, чтобы просить помощи в выяснении этого? Два заголовочных файла содержат около 100 строк каждый, а соответствующие исходные файлы - около 1000 строк ... поэтому я постарался сохранить его релевантным.

Ответы [ 2 ]

2 голосов
/ 08 января 2012

Вы определяете два типа, Complex и pComplex, и объявляете две функции, каждая из которых зависит от обоих определений типов.

Однако, если вы организуете свои директивы #include, компилятор долженсм. оба определения типов, прежде чем он сможет обработать объявления функций.

Но у вас есть один заголовок, который определяет один из типов и затем объявляет одну из функций, и другой заголовок, который определяет другойтип, сопровождаемый другой функцией.Нет порядка, в котором вы можете скомпилировать заголовки, которые сделают определения типов видимыми там, где они должны быть.

(Обратите внимание, что typedef s реализованы довольно странно в грамматике C, в результате чегоссылка на typedef, которая еще не была определена, обычно проявляется как синтаксическая ошибка, а не как более простая ошибка «необъявленный идентификатор».)

Одним из решений было бы разделение определений типов иопределения функций в четыре отдельных файла заголовков с директивами #include для выражения зависимостей.

Более простое решение - объединить два файла заголовков в один, с typedef s, сопровождаемыми объявлениями функций.

Как говорит Бэйзил, иметь два заголовка вместе можно редко, если вообще хорошо.Защитники включения предотвращают бесконечную рекурсию, но также предотвращают видимость некоторых объявлений для кода, который от них зависит.

1 голос
/ 08 января 2012

Вы пишете код на C или C ++?Если кодирование на C ++, определение ваших class -es должно быть более подходящим.

Включение друг в друга pcomplex.h и complex.h - плохой дизайн.График включения должен иметь вид DAG .

. Я предлагаю объединить два заголовка в один заголовок с типами CartesianComplex и PolarComplex.

(я полагаюваш учитель не хочет, чтобы вы использовали стандартные заголовки, определяющие комплексные числа)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...