LINUX.ORG.RU

ncurses(menu) + struct dirent


0

1

Доброго времени суток .. помогите разобраться
Идея такова .. в менюшке ncurses (в item)вывести содержание (имена файлов dp->d_name) каталога(/home/).

компилятор ругается(на предпоследнюю строку ) :
warning: passing argument 1 of ‘new_item’ makes pointer from integer without a cast
/usr/include/menu.h:177: note: expected ‘const char *’ but argument is of type ‘char’
error: too few arguments to function ‘new_item’

ниже приведен огрызок кода :

MENU *idiot_menu;
ITEM **items_idiot;
#define ALLELEMS(a) (sizeof(a)/sizeof(a[0]))
---------------------------------------------------
struct dirent *dp;
DIR *d;
d=opendir(«/home/»);
while ((dp = readdir(d)) != NULL )
{ n=ALLELEMS(dp);
items_idiot=(ITEM **)calloc(n, sizeof(ITEM *));
for (i=0; i<n; ++i)
items_idiot[i]=new_item(dp->d_name[i],NULL); (!!!!!)
idiot_menu=new_menu(items_idiot);
}




Последнее исправление: rowlin (всего исправлений: 2)

Не хватает аргументов. Ваш К.О. Вот интерфейс и описание: ITEM *new_item(const char *name, const char *description);

DESCRIPTION The function new_item allocates a new item and initializes it from the name and description pointers. Please notice that the item stores only the pointers to the name and description. Those pointers must be valid during the lifetime of the item. So you should be very careful with names or descriptions allocated on the stack of some routines. The function free_item de-allocates an item. Please notice that it is the responsibility of the application to release the memory for the name or the description of the item. читай man.

rg-400
()
Ответ на: комментарий от rg-400

упс ..Спасибо - исправил ... Теперь код откомпилялся - и выдал мне тот же warning!! да 1 строчку (т.е. правильно работать не стал).. Тут скорей всего ошибка в опрелделении new_items как массива ; но dp->name представляет из себя тоже массив(имя файла)

то есть dp->name[j][i] -это двумерный массив ,где j -длина ;i строка... ...утром писать буду..

rowlin
() автор топика
Ответ на: комментарий от rowlin

Скорее нужно выделить память под хранение:

name = malloc((strlen(dp->name) + 1) * sizeof(char));
memcpy(name, dp->d_name[i], (strlen(dp->name) + 1) * sizeof(char));
items_idiot[i]=new_item(name, NULL);
dp->name это одномерный массив и обращение dp->name дает лишь символ. Ты что то напутал. Во-первых. readdir на каждой итерации возвращает информацию о каком-то файле. Тебе нужно ее где-то сохранить. Если интересует только имя сохраняй его(как показано выше). Во-вторых, n=ALLELEMS(dp); тебе ничего не даст. Тебе возвращается УКАЗАТЕЛЬ на структуру, так что читай K&R пока не поймешь в чем разница между указателем и массивом. У тебя лишь указатель и содержание *dp постоянно менятеся. Выделять память (items_idiot=(ITEM **)calloc(n, sizeof(ITEM *));) нужно за пределами цикла(только надо узнать сколько файлов) или наращивать массив используюя realloc. idiot_menu=new_menu(items_idiot); тоже за пределы цикла.

Прочитай внимательно man-страницы тех функций, которые используешь.

rg-400
()
Ответ на: комментарий от rg-400

спасибо за совет .. вродь - понял ...но с выделение памяти (coзданием menu)по преднему проблемы ... ушел читать K&R..

rowlin
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.