Если вы нацеливаетесь на C, тогда пишите C - вы можете скомпилировать с компилятором C ++, но выбирая компиляцию как C, в этот момент избегайте перебора строки.
Ваша проблема возникает из-за того, что измерение массива должно быть константой времени компиляции, известной и фиксированной при компиляции кода. Как указывает WhozCraig const
, убедитесь, что после того, как значение numItems
установлено (во время выполнения), оно не может быть изменено.
Существует 3 решения вашей проблемы:
1) Использовать константу ограничения времени компиляции для размера массива:
static const int MaxSelectedItems = 128;
typedef struct {
re8k_ict_header header;
re8k_ict_physical_quantity quantity;
uchar selectedItems[MaxSelectedItems];
} PQDataRequest;
Индекс массива MaxSelectedItems никогда не должен превышать. i.e, который устанавливает selectedItems, должен проверить, что index < MaxSelectedItems
(обратите внимание, что с другими динамическими решениями, указанными ниже этой проверки, также накладывается так, что это не является недостатком). Если код C, потому что он будет запущен, это маршрут - вы обычно не запускаете mallocing и освобождаете mem во встроенных средах, если нет реальной потребности. Единственный реальный недостаток здесь - использование памяти mroe - обычно это не проблема (даже встроенная), и предпочтительнее потенциальных проблем, возникающих при распределении динамической памяти.
2) Используйте поле указателя:
typedef struct {
re8k_ict_header header;
re8k_ict_physical_quantity quantity;
uchar* selectedItems;
} PQDataRequest;
Здесь для каждого использования структуры вам нужно будет malloc и освободить поле selectedItems
.
int selectedItemsSize = 20;
PQDataRequest myDataRequest;
myDataRequest.selectedItems = malloc(sizeof(uchar)*selectedItemsSize;
// don't foreget to free myDataRequest.selectedItems when done!
Используйте это, если вы действительно ДОЛЖНЫ иметь динамическое распределение, и вы не собираетесь использовать массивы PQDataRequests (см. ниже, если вы это сделаете). Не рекомендуется, если это строго необходимо, потому что у вас есть проблема с распределением и, что более важно, освобождение массива selectedItems для каждого использования структуры.
3) Использовать элемент гибкого массива C99:
typedef struct {
re8k_ict_header header;
re8k_ict_physical_quantity quantity;
uchar selectedItems[];
} PQDataRequest;
Рекомендуется, если вы планируете использовать и массивы PQDataRequests. Этот метод позволяет вам хранить malloc (и последнюю свободную) память для массива WHOLE:
int dataRequestArraySize = 5;
int selectedItemsSize = 20;
PQDataRequest* my_array = malloc((sizeof(PQDataRequest) + (selectedItemsSize*sizeof(uchar))) * dataRequestArraySize);
Вместо того, чтобы выделять и освобождать выбранный элемент для каждого PQDataRequest в массиве.
Во всех указанных выше трех случаях вы также будете отслеживать количество выбранных элементов - скорее всего, включив поле int selectItemsCount
int struct. В 1) это позволяет узнать, какие из значений в массиве действительны (& lt; than selectItemsCount) и которые не используются (> selectItemsCount, но & MaxSelectedItems). В 2 & amp; 3 этот счетчик позволяет вам проверить, когда когда-либо читаете или записываете массив, на который вы не ссылаетесь вне размера, выделенного динамически.
Вы не можете вернуть анонимный объект в c #, но вы можете вернуть именованный кортеж так:
private (bool success, string responseText) abc(string a, string b)
{
return (false, "Input-values not valid");
}
Почему бы не использовать словарь?
using System.Collections.Generic;
private Dictionary<bool, string> abc(string a, string b) {
//...
Dictionary<bool, string> returnVal = new new Dictionary<bool, string>()
{
{"success", false},
{"responseText", "Input-Values not valid"},
};
return returnVal;
}
А затем, чтобы получить доступ к возвращаемому значению, вы должны сделать: returnVal["success"]