Инициализировать матричный (двойной указатель) член структуры - PullRequest
0 голосов
/ 21 ноября 2018

Я с трудом справляюсь с указателями, может кто-нибудь мне немного помочь?

Я пытаюсь инициализировать двойной (двойной) указатель внутри массива структуры, но я как-то делаюэто неправильно .. Пример:

struct MyStruct
{
    double **matrix;
};

double **CalculateMatrix(...)
{
    double **matrix = (double**)malloc(ROWS * sizeof(double*));
    for (int i = 0; i < ROWS; i++)
        matrix[i] = (double*)malloc(COLS * sizeof(double));
    // + assign some values
    return matrix;
}

void Initialize(struct MyStruct *structs, int size)
{
    for (int i = 0; i < size; i++)
        // Here structs[i].matrix holds the correct matrix values
        structs[i].matrix = CalculateMatrix(...);
}

int main()
{
    struct MyStruct *structs = (struct MyStruct*)malloc(SIZE * sizeof(struct MyStruct));
    Initialize(structs, SIZE);
    // but once the function returns, matrix values are completely different
}

Извините, если он продублирован, я не смог ничего найти

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Расширение gsamaras ' ответ :

«Вам не нужны глобальные переменные здесь» - это правда.Тем не менее, наличие констант ROWS и COLS может также иметь значение.Это зависит от варианта использования! Подход

gsamaras позволяет вам определять индивидуальные размеры для каждой матрицы.Если вы хотите обеспечить одинаковый размер для всех созданных матриц, то менее подвержены ошибкам не параметры, а константы вместо них.

0 голосов
/ 21 ноября 2018

Здесь вам не нужны глобальные переменные.Таким образом, вы можете объявить, определить и инициализировать размер вашего массива структуры, а также размеры ваших матриц в основном методе.

Более того, имена ваших методов вводят в заблуждение, я изменил их на что-то, чтосообщает автору, какова цель каждой функции.Или, точнее, ваши методы выполняют более одной задачи.Полезно разделять задачи для повторного использования.

Вот минимальный пример, с которого можно начать:

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

struct MyStruct
{
    double **matrix;
};

double **allocate_matrix(int rows, int cols)
{
    double **matrix = malloc(rows * sizeof(double*));
    for (int i = 0; i < rows; i++)
        matrix[i] = malloc(cols * sizeof(double));
    return matrix;
}

void allocate_matrices(struct MyStruct *structs, int size, int rows, int cols)
{
    for (int i = 0; i < size; i++)
        structs[i].matrix = allocate_matrix(rows, cols);
}

void fill_matrices(struct MyStruct *structs, int size, int rows, int cols)
{
    for (int i = 0; i < size; i++)
        for(int j = 0; j < rows; j++)
            for(int z = 0; z < cols; z++)
                structs[i].matrix[j][z] = -1.2;
}

void print_matrices(struct MyStruct *structs, int size, int rows, int cols)
{
    for (int i = 0; i < size; i++)
        for(int j = 0; j < rows; j++)
            for(int z = 0; z < cols; z++)
                printf("%f\n", structs[i].matrix[j][z]);
}

void free_matrices(struct MyStruct *structs, int size, int rows) {
    for (int i = 0; i < size; i++) {
        for(int j = 0; j < rows; j++) {
            free(structs[i].matrix[j]);
        }
        free(structs[i].matrix);
    }
}


int main()
{
    int rows = 3, cols = 4, size = 2;
    struct MyStruct *structs = malloc(size * sizeof(struct MyStruct));
    structs[0].matrix = NULL;
    structs[1].matrix = NULL;
    if(structs[0].matrix == NULL)
        printf("null\n");
    allocate_matrices(structs, size, rows, cols);
    if(structs[0].matrix == NULL)
        printf("null\n");
    fill_matrices(structs, size, rows, cols);
    print_matrices(structs, size, rows, cols);
    free_matrices(structs, size, rows);
    free(structs);
}

Вывод:

null
-1.200000
-1.200000
-1.200000
-1.200000
-1.200000
-1.200000
-1.200000
-1.200000
-1.200000
-1.200000
-1.200000
-1.200000
-1.200000
-1.200000
-1.200000
-1.200000
-1.200000
-1.200000
-1.200000
-1.200000
-1.200000
-1.200000
-1.200000
-1.200000

Вдохновленный моим 2D динамический массив (C) .

...