Инициализация C89, почему MSVC выдает ошибку, а Mingw - нет? - PullRequest
0 голосов
/ 27 октября 2018

Предисловие: Я должен использовать C89, и я знаю, что у него нет назначенных инициализаторов, как у C99. Однако, если массив обернут внутри структуры, я понимаю, что он может неоднократно изменяться в том же формате, что и инициализатор. И похоже на работу в MINGW C89.

  typedef struct fscratch{
        float contents[SIZEFDT];
    };

    int main()
    {

        fscratch fs;

        fs = (fscratch){400.0, 440.0, 480.0, 500.0, 530.0, 560.0 };     // <--MSVC error here
        memcpy(pt1->flow, fs.contents, sizeof(pt1->flow));
        fs = (fscratch){161.0, 157.0, 153.0, 150.0, 146.0, 142.0};
        memcpy(pt1->psi_disch, fs.contents, sizeof(pt1->psi_disch));

    }

Mingw C89 отлично работает без ошибок, MSVC выдает ошибки:

ошибка C2059: синтаксическая ошибка: '{' ошибка C2143: синтаксическая ошибка: отсутствует ';' перед '{' ошибка C2143: синтаксическая ошибка: отсутствует ';' до '}'

Остальная часть программы на 1000 строк работает нормально с некоторыми изменениями. что происходит с этой линией?

1 Ответ

0 голосов
/ 27 октября 2018

Вы должны ссылаться на компилятор GCC, а не на MinGW.MinGW - это среда разработки и набор библиотек для Windows, которая часто используется вместе с компилятором GCC для создания программ Windows.

Также Visual Studio был выпущен в середине 1990-х годов.Вы должны ссылаться на C98?

И Visual Studio, и gcc должны разрешать следующее:

fscratch fs = {161.0, 157.0, 153.0, 150.0, 146.0, 142.0};

В более старых версиях Visual Studio вы можете только инициализировать массив при объявлении, но не позднее:

fscratch fs = { 123.0 }; //<- initialized once, okay in both gcc & VC++
fs = {161.0, 157.0, 153.0, 150.0, 146.0, 142.0};//<- compiler error in older VC++

Кроме того, вы можете скопировать память, это должно быть более совместимым между компиляторами:

#include <string.h>
...
const float data1[] = {161.0, 157.0, 153.0, 150.0, 146.0, 142.0};
memcpy(fs.contents, data1, sizeof(data1));
...