Arhn - архитектура программирования

недопустимый аргумент типа '-›'

#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/module.h>

int start(void){

    printk("starting module\n");
    printk("pid\ttask_name\tstate\n");

    struct task_struct *task;
    struct list_head *list;

    list_for_each(list,&init_task->children){
        task=list_entry(list,struct task_struct,sibling);
        printk("%5d\t%s\t%li\n",task->pid,task->comm,task->state);
    }
    return 0;
}


void ending(void){
    printk("closing module\n");
}

module_init(start);
module_exit(ending);

Когда я компилирую, появляется ошибка, показанная ниже

error: invalid type argument of ‘->’ (have ‘struct task_struct’)
  list_for_each(list,&init_task->children){
                               ^
include/linux/list.h:408:14: note: in definition of macro ‘list_for_each’
  for (pos = (head)->next; pos != (head); pos = pos->next)

Я думаю, что сообщение об ошибке пытается сказать, что «& init_task» должна иметь «struct task_struct», но этого недостаточно? Насколько мне известно, переменная «init_task» объявлена ​​извне в «linux/sched.h», что означает, что ошибка не должна быть вызвана невозможностью найти или найти «init_task».

Поскольку указатель должен стоять перед '->', использование '&init_task' кажется правильным.

Может ли кто-нибудь указать, что мне здесь не хватает?

--- обновление: решено ---

пересматривая приоритеты операторов '->' и '&', правильно использовать либо '(&init_task)->children', либо 'init_task.children'. Однако даже с этим изменением возникла ошибка:

include/linux/list.h:408:31: error: invalid operands to binary != (have ‘struct list_head *’ and ‘struct list_head’)
  for (pos = (head)->next; pos != (head); pos = pos->next)

Это сообщение об ошибке указывало на то, что я должен указать адрес «дочерних элементов» в «struct task_struct». Таким образом, я изменил проблемную строку как:

list_for_each(list,&(init_task.children)){

что решило проблему, и компиляция прошла гладко.

07.07.2015

Ответы:


1

init_task - это структура, а не указатель. Таким образом, вы должны либо преобразовать его в указатель до разыменования (&init_task)->children, либо получить доступ к children, используя нотацию точки init_task.children. &init_task->children обозначает адрес поля children структуры, на которую указывает init_task, если бы это был указатель.

07.07.2015
  • Обратите внимание, что круглые скобки необходимы с (&init_task)->children, потому что -> и . связаны очень тесно, и более тесно, чем & (как оператор адреса). 07.07.2015
  • Благодарность! Я упустил из виду приоритеты операторов. Как вы упомянули, «-›» учитывается перед «&», поэтому я явно что-то путаю. Основываясь на вашем понимании, мне удалось справиться с последующей ошибкой и скомпилировать ее. Спасибо! 07.07.2015
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..