System.Data.MetadataException: невозможно загрузить указанный ресурс метаданных

В C99 и более поздних версиях вы можете иметь (одномерный) элемент гибкого массива (FAM) в конце структуры:

§6.7. 2.1 Спецификаторы структуры и объединения

¶18 В качестве особого случая последний элемент структуры с более чем одним именованным элементом может иметь неполный тип массива; это называется гибким элементом массива . В большинстве ситуаций гибкий элемент массива игнорируется. В частности, размер структуры выглядит так, как если бы гибкий элемент массива был исключен, за исключением того, что он мог иметь более длинное дополнение, чем подразумевалось бы упущение. Однако, когда оператор . (или ->) имеет левый операнд, который является (указателем на) структуру с гибким членом массива, а правый операнд - этим членом, он ведет себя так, как если бы этот элемент был заменен на самый длинный массив (с тем же типом элемента), который не сделает структуру больше, чем объект, к которому обращаются; смещение массива должно оставаться равным элементу гибкого элемента массива, даже если это будет отличаться от размера массива замены. Если этот массив не будет содержать никаких элементов, он будет вести себя так, как если бы у него был один элемент, но поведение не определено, если предпринимаются какие-либо попытки доступа к этому элементу или для создания указателя за ним.

Это означает, что вы могли бы написать:

typedef struct image
{
    int width;
    int height;
    struct pixel pixels[];
} image;

, но вам нужно было бы сделать отображение индекса 2D-1D самостоятельно. Вы также должны быть осторожны, как вы выделяете структуру (по необходимости, она будет выделена malloc(), так как в противном случае размер массива будет равен нулю).

Обратите внимание на исправление орфографии для height ; обратите внимание также на добавление имени для typedef (я выбрал image для соответствия тегу структуры, но вы можете выбрать любое другое имя, которое вам нравится). A typedef без имени является «действительным», но не полезным - вы можете опустить typedef и получить тот же результат.

Вы можете использовать:

image *ip = malloc(sizeof(image) + width * height * sizeof(struct pixel));

if (ip != 0)
{
    ip->width = width;
    ip->height = height;
    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
            ip->pixels[i*width + j] = default_pixel_value;
    }
    …use ip…
    free(ip);
}

m не уверен, что есть хороший способ получить 2D-массив как FAM.

23
задан Community 23 May 2017 в 11:33
поделиться