Что такое допустимый тип данных C # для следующего возвращаемого значения или как я могу получить доступ к внутренним свойствам?

Если вы нацеливаетесь на 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 этот счетчик позволяет вам проверить, когда когда-либо читаете или записываете массив, на который вы не ссылаетесь вне размера, выделенного динамически.

1
задан thestruggleisreal 16 January 2019 в 16:39
поделиться

2 ответа

Вы не можете вернуть анонимный объект в c #, но вы можете вернуть именованный кортеж так:

private (bool success, string responseText) abc(string a, string b)
{
    return (false, "Input-values not valid");
}
0
ответ дан JSteward 16 January 2019 в 16:39
поделиться

Почему бы не использовать словарь?

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"]

0
ответ дан user7733611 16 January 2019 в 16:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: