Создать переменное количество объектов структуры внутри структуры (C) - PullRequest
1 голос
/ 06 апреля 2020

Я не писал C более десяти лет, но вот я ...

Я хочу иметь возможность создавать и получать доступ к следующим элементам структуры данных:

FilterCoefficients[0].TargetSampleNum = 0;
FilterCoefficients[0].SourceWeights[0].Weight = 0.812;
FilterCoefficients[0].SourceWeights[0].SourceSampleNum = 0;
FilterCoefficients[0].SourceWeights[1].Weight = 0.153;
FilterCoefficients[0].SourceWeights[1].SourceSampleNum = 1;
FilterCoefficients[1].TargetSampleNum = 1;
FilterCoefficients[1].SourceWeights[0].Weight = 0.352;
FilterCoefficients[1].SourceWeights[0].SourceSampleNum = 0;
FilterCoefficients[1].SourceWeights[1].Weight = 0.721;
FilterCoefficients[1].SourceWeights[1].SourceSampleNum = 1;
[...]

Индексы должны быть распределены динамически (количество необходимого пространства изменяется во время выполнения). Я пытаюсь создать указанную структуру данных следующим образом:

typedef struct SampleWeight_t
{
    unsigned long SourceSampleNum;
    double Weight;
} SampleWeight;

typedef struct FilterCoefficients_t
{
    unsigned long TargetSampleNum;
    SampleWeight* SourceWeights;
} FilterCoefficients;

Однако у меня возникают трудности при создании структуры. Я получаю исключения Break Point, когда mallo c - освобождает или освобождает конструкцию.

FilterCoefficients* FilterCoefficients;
SampleWeight* SampleWeight;

FilterCoefficients = malloc(sizeof(FilterCoefficients) * target_width);
if (FilterCoefficients == NULL) {
        //errhandler
}

for (int i = 0; i < target_width; i++) {
    FilterCoefficients[i].SourceWeights = malloc(sizeof(SampleWeight) * (int)ceil(scalingFactorWidth * window_width));  // **exception usually here**
    if (FilterCoefficients[i].SourceWeights == NULL) {
        //errhandler
    }

    FilterCoefficients[i].TargetSampleNum = i;

    for (int j = i - filter_width; j < i + filter_width; j++) {
        FilterCoefficients[i].SourceWeights[j + filter_width].Weight = bilinear_filter(0.5 + scalingFactorWidth2 * (j - 0.5));

        if (j > 0) {
            FilterCoefficients[i].SourceWeights[j + filter_width].SourceSampleNum = j;
        }
        else {
            FilterCoefficients[i].SourceWeights[j + filter_width].SourceSampleNum = 0;
        }
    }

}


for (int i = 0; i < target_width; i++) {
    free(FilterCoefficients[i].SourceWeights); // **exception usually here**
}

free(FilterCoefficients);

Любая помощь, которая укажет мне на решение, приветствуется.

1 Ответ

0 голосов
/ 06 апреля 2020

Это компилирует и выполняет. Мне пришлось упростить.

#include <stdio.h>
#include <stdlib.h>

typedef struct SampleWeight_t
{
    unsigned long SourceSampleNum;
    double Weight;
} SampleWeight;

typedef struct FilterCoefficients_t
{
    unsigned long TargetSampleNum;
    SampleWeight* SourceWeights;
} FilterCoefficients;

int main ( void) {
    FilterCoefficients* FilterCoeff;
    int window_width = 35;
    int target_width = 55;

    FilterCoeff = malloc(sizeof(FilterCoefficients) * target_width);
    if (FilterCoeff == NULL) {
            //errhandler
    }

    for (int i = 0; i < target_width; i++) {
        FilterCoeff[i].SourceWeights = malloc(sizeof(SampleWeight) * window_width);
        if (FilterCoeff[i].SourceWeights == NULL) {
            //errhandler
        }

        FilterCoeff[i].TargetSampleNum = i;

        for (int j = 0; j < window_width; j++) {
            FilterCoeff[i].SourceWeights[j].Weight = i * j;

        if (j > 0) {
            FilterCoeff[i].SourceWeights[j].SourceSampleNum = j;
        }
        else {
            FilterCoeff[i].SourceWeights[j].SourceSampleNum = 0;
        }
    }

}

for (int i = 0; i < target_width; i++) {
    free(FilterCoeff[i].SourceWeights); // **exception usually here**
}

free(FilterCoeff);

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...