проблема структуры, вероятно, связана с кодовыми блоками, но я не уверен - PullRequest
0 голосов
/ 26 мая 2020

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

struct Regista
{
char nome[30];
char cognome[30];
int nascita;
int doIexist;
};

typedef struct Regista regista;

struct Film
{
    char titolo[30];
    char reg[30];
    int anno;
    int doIexist;
};

Я создал array для обоих, и я хотел передать их как аргумент в разные функции, чтобы добавить элементы в этот массив, и теперь у меня есть вопрос: я ошибочно написал это:

int insertfilm(film arrayfilm[]);
int insertreg(regista arrayreg[]);
int main(){

//other stuff

film arrayfilm[SIZE];
regista arrayreg[SIZE];

//other stuff

  switch (mainMenuChoice)
    {
        case 1:
        {
            insertfilm(arrayfilm);
            break;

        }
        case 2:
        {
            insertreg(arrayfilm);
            break;
        }
//other stuff

следует отметить, что i передал массив struct film, в то время как он должен ожидать массив struct regista в insertreg ()

Я ожидал, что он сообщит об ошибке неправильного типа, но вместо этого он замолчал и запустил его без каких-либо проблем.

Мой вопрос: это вызвано моей IDE (codeeblocks) или реализацией C?

1 Ответ

1 голос
/ 26 мая 2020

Компилятор gcc / mingw, который Codeblocks использует по умолчанию, неэффективен, когда доходит до выдачи ошибок компилятора для C нарушений совместимости языковых типов. Если вы запустите его с настройками по умолчанию, вы получите:

предупреждение: передача аргумента 1 'insertreg' из несовместимого типа указателя

Теперь до C языка, вышеуказанного достаточно для соответствия компилятору. C не говорит об ошибках и предупреждениях, только о диагностике c сообщений.

Ваш код недействителен C, так как две структуры совместимы только в том случае, если они имеют одинаковый тег структуры, если все их члены имеют одинаковый тип и одно и то же имя переменной. Вы используете разные теги структуры и разные имена переменных, поэтому они несовместимы.

Формально, поскольку типы несовместимы, ваш код является «нарушением ограничения правила простого присваивания» и компилятором должен дать вам диагностическое сообщение c, что и произошло.

Я настоятельно рекомендую всем новичкам компилировать со строгим соблюдением стандартов и максимальным количеством предупреждений. При g cc это означает -std=c11 -pedantic-errors -Wall -Wextra. Ошибки Pedanti c, в частности, блокируют компиляцию кода в исполняемый файл, даже если есть C языковых нарушений.

В частности, в кодовых блоках: go Настройки -> Компилятор, затем проверьте соответствующие параметры там , например «Включить дополнительные предупреждения компилятора [-Wextra]», чтобы включить -Wextra.

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