Предисловие: мне нужно использовать 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 выдает ошибки:
error C2059: syntax error: '{' error C2143: syntax error: missing ';' before '{' error C2143: syntax error: missing ';' before '}'
Остальная часть 1000-строчной программы отлично работает с некоторыми настройками. что происходит с этой линией?
Вы должны иметь в виду компилятор GCC, а не MinGW. MinGW - это среда разработки и набор библиотек для Windows, часто используется совместно с компилятором GCC для создания программ Windows.
Также в середине 1990-х была выпущена Visual Studio. Вы, должно быть, имеете в виду 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));
memcpy
можно использовать повторно. float data2[] = {2.0,3.0,4.0}; memcpy(fs.contents, data2, sizeof(data2));...
Я не предлагал сбрасывать data1
, я сказал, что сброс в более старых версиях VC++ вообще невозможен.
Это определенно C89 в GCC (по умолчанию Codeblocks 13.12 mingw). MSVC - это Visual Studio 2008. Я никогда не пробовал такую старую Visual Studio до недавнего времени, но я очень впечатлен тем, насколько она быстрее, чем 2017, 2015, 2013 и даже 2010. Я не вернусь к 2017 году, но, возможно, 2013 г., если на то есть веская причина. Значит, старый GCC может сбросить массив с плавающей запятой в скобках, а MSVC 2008 - нет? Какая первая версия может?
Предложенный вами код работает для одного memcpy const float data1 [] = {400.0, 440.0, 480.0, 500.0, 530.0, 560.0}; memcpy (pt1-> flow, data1, sizeof (data1)); Однако, даже если это не const, я не могу сбросить data1, чтобы использовать его для другого memcpy data1 = {161.0, 157.0, 153.0, 150.0, 146.0, 142.0}; memcpy (pt1-> psi_disch, data1, sizeof (data1)); Эта строка приведет к точно такой же ошибке C2059 при второй попытке.