2017-02-11 2 views
0

У меня есть структура, которая имеет 2 параметра, и я создаю 1D-указательный массив типа структуры и выделяю для него память. Это отправляется в функцию со значениями для добавления к ней. Код ниже.Как создать 2D-массив структуры с использованием динамического распределения?

typedef struct { 
    char name[LENGTH]; 
    double use; 
} Task; 



Task *ctask; 
    task = malloc(8 * sizeof(*task)); 

insert (Task task[], name, use){ 
    //does something 
    task[i].name = name; 
    task[i].use = use; 
} 

, что я хочу знать, как создать 2D-массив указателя типа структуры (размером 8 * 25). И отправьте его в функцию insert().

Это ниже правильно:

Task **ctask; 
    task = malloc(8 * sizeof(*task)); 

for(int i=0;i<25;i++){ 
    task[i] = malloc(25 * sizeof(*task)); 
} 

Когда им посылает его в функцию вставки это необходимо изменить, или я могу просто отправить в:

insert(task[i], name, use); 

признателен за любую обратную связь благодаря

ответ

0

В C вы можете использовать массив (длина 8) указателей на массивы (длина 25) или массив (длина 8 * 25) для представления введите 2D-массив. Пожалуйста, см. The C Programming Language by K&R.

Для первого способа,

Task **taskArray = (Task **) malloc(8 * sizeof(Task *)); 
int n; 
for (n = 0; n < 8; n++) { 
    taskArray[n] = (Task *) malloc(25 * sizeof(Task)); 
} 
// access the row i, column j Task struct in the array 
// taskArray[i][j] 
// you will need its address/pointer to pass to insert function 
// &taskArray[i][j] or taskArray[i] + j 

Для второго способа,

taskArray = (Task *) malloc(8 * 25 * sizeof(Task)); 
// access the row i, column j Task struct in the array 
// taskArray[i * 8 + j] 

О вызове Insert функции

Insert (Task task[], char *name1, double use) { 
    int i = getindex(name1); 
    task[i].name = name1; 
} 

От вашего кода, то task будет имя/head указатель массива struct, вы получаете доступ к i-й структуре ct с использованием task[i].

Для массива 1D вы просто пропустите имя или указатель на него.

Для 2D-массива с использованием первого метода taskArray представляет собой массив из 8 (по глубине) массивов 1D из 25 структур (по ширине). Вы можете позвонить Insert для каждого из этих 1D-массивов, просто передавая их указатель на голову, taskArray[i] для i-го.

Для 2D-массива, использующего второй метод, это аналогичная идея, за исключением того, что вам нужно преобразовать индекс массива 1D, чтобы имитировать как 2D-массив. Головной указатель для каждого из массивов 8 1D составляет taskArray[i * 8] для i-го.

+0

Hi neo, как я могу назвать функцию вставки для этого 2D-массива (для обоих примеров, которые вы указали), просто отправьте i-й ряд. Поскольку строка вставки вызывает другое соединение для вычисления индекса j. Для 1d-массива tge finction выполняется следующим образом. – anisha

+0

Вставка (Задача задачи [], char * имя1, двойное использование) { int i = getindex (name1); Задача [i] .name = name1; } – anisha

+0

Привет, для 1D массив функция вставки, как показано ниже: Вставка (целевая задача [], символ * имя1, двойное использование) { INT I = GetIndex (name1); Задача [i] .name = name1; } При вызове функции, как изменить функцию вставки, чтобы принять 1 массив из 50 элементов. – anisha