Массив языка struct C - PullRequest
       4

Массив языка struct C

0 голосов
/ 01 марта 2019

В моей программе мне нужно создать структуры, в моем случае, у меня есть struct Processor, вот мой пример:

struct Processor{
    int id;
    struct Task **task;
}

В основном я создаю набор процессоров (например, 2 процессора),и я должен добавить в задачи в каждом процессоре, используя эту функцию struct Processor * create_processor(int id, struct Task **task );

Вот функция:

struct Processor * create_processor(int id, struct Task **task){
    struct Processor * pr = (struct Processor *) (malloc(sizeof(struct Processor)));
    pr->id = id;
    //how to initialize Task set??
    return pr;
}

Теперь, как инициализировать набор задач в функции?а как использовать элементы taskset?Я использовал processor[1]->task[1]->id = 5;, но он возвращает ОШИБКУ Segmentation fault (core dumped)

Помогите пожалуйста

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Может быть, это может помочь.Я полагаю, вы выделяете память для задач перед вызовом своей функции.Здесь у вас есть 10 задач, и я создаю один процессор с 3 задачами:

struct Processor{
    int id;
    struct Task **task;
};

struct Task{ int id; int WCET;};

struct Processor * create_processor(int id, struct Task **task){
    struct Processor * pr = (struct Processor *) (malloc(sizeof(struct Processor)));
    pr->id = id;
    pr->task = task;
    return pr;
}


int main() {
    struct Task taskArray[10]; /* memory for 10 tasks */
    struct Task * taskPtrArray[3]; /* pointers to 3 tasks */
    taskPtrArray[0] = &taskArray[2]; /* pointer to task 2 */
    taskPtrArray[1] = &taskArray[6]; /* pointer to task 6 */
    taskPtrArray[2] = &taskArray[9]; /* pointer to task 9 */

    struct Processor * p1 = create_processor(1, taskPtrArray);

    printf("p1->id = %d \n", p1->id);
    p1->task[2]->WCET = 999;
    printf("p1->task[2]->WCET = %d \n", taskArray[9].WCET);
}

Вывод:

p1-> id = 1

p1-> task [2] -> WCET = 999


Как сказал "Какой-то программист".Функция, задающая задачи с помощью:

pr->task = task;
0 голосов
/ 01 марта 2019

Когда вы делаете

struct Processor * pr = (struct Processor *) (malloc(sizeof(struct Processor)));

, вы теперь инициализируете пустую структуру Processor.Поскольку элемент task структуры является указателем (фактически двойным указателем), все, что у вас есть в только что инициализированном Processor, эквивалентно: struct Processor { id: 0, task: 0 }, то есть он просто содержит нулевой указатель для члена task,Вероятно, поэтому вы получаете Segmentation fault, который является типом ошибки, которая возникает, когда ваша программа обращается к неинициализированной памяти.

Вам также придется распределять массив из Task* (указатели задачи) для сколь угодно многихзадачи, которые должен иметь каждый процессор.Например,

pr.task = (struct Task **) malloc(sizeof(struct Task *) * N_TASKS);  // pr.task should probably be called pr.tasks??

, затем вам также нужно инициализировать память для каждой фактической задачи:

for (int idx = 0; idx < N_TASKS; idx++) {
    pr.task[idx] = (struct Task *) malloc(sizeof(struct Task));
}

и т. Д. Для каждой Processor, которую вы хотите инициализировать.

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