decvar
написал 26 апреля 2004 года в 20:19 (996 просмотров)
Ведет себя
как мужчина; открыл 111 тему в форуме, оставил 1838 комментариев на сайте.
Что-то я походу запутался:
struct foo
{
char qwe;
char asd;
};
…..
…..
static void
bar
{
GList *list = NULL;
/* двухсязанный список
struct list{
gpointer data;
GList *next;
GList *prev;
}; */
struct foo my_struct;
my_struct.qwe=«qwe»;
my_struct.asd=«asd»;
list = g_list_append(list, &my_struct);
….
….
}
/* вообщем я добавил в список новый элемент, а теперь как мне его оттуда прочитать? Например я хочу получить значение поля my_struct.qwe */
Последние комментарии
- OlegL, 17 декабря в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
ecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.
struct GList {
gpointer data;
GList *next;
GList *prev;
};
GList* g_list_append (GList *list,gpointer data);
The return value is the new start of the list, which may have changed, so make sure you store the new value.
ну неужели никто не помнит как работать со связанным списком?
Да я-то помню, как работать со связным списком, но у тебя ж GTK, а какие там реализации одному аллаху известно… Ну, например, как этот g_list_append работает?
Good Luck,
UT
GList* g_list_append (GList *list,gpointer data);
The return value is the new start of the list, which may have changed, so make sure you store the new value.
я же написал…
Тип GList — тоже написал…
Как мне в принципе прочитить из списка элемент?
Да ты-то написал, а куда он добавляет новый элемент, в начало что ли?
В принципе, сам list обычно — указатель на свой первыъ элемент. По ссылке получаешб значение. А итерировав n раз — получаешь ссылку на n-й элемент.
Мне бежать надо, если хочешь, напишу подробнее через час.
Good Luck
UT
Ну что непонятно? Ф-ция возвращает новое начало списка. Структуру ноды ты знаешь. Беги по списку пока не найдёшь свою структуру…
struct prog {
char text;
};
…
…
..
struct prog item;
struct prog back;
item.text=«asd»;
list=g_list_append(list, &item);
back.text=list.data.text;
Если list указатель на начало, то он указывает на то, что я записал…так? Тогда имея back.text я могу записать в него list.data.text? Или не так?
Да. Вот рисунок, чтобы всё было окончательно ясно:
list --+
+—- | ————————--+
| v |
+-> GList <--> GList <--> Glist <-+
| | |
v v v
data data data
где
горизонтальные стрелки = GList*
вертикальные стрелки = gpointer
Рисунок, понятно, корявый, но понять, я думаю, можно.
Да знаю как устроен список связанный, меня другое интересует, почему этот код
struct prog {
char text;
};
…
…
..
struct prog item;
struct prog back;
item.text=«asd»;
list=g_list_append(list, &item);
back.text=list.data.text;
не компилится, с матом
request for member data in something not a structure or union
по теме:
http://developer.gnome.org/doc/API/2.0/glib/glib-Doubly-Linked-Lists.html
list — это не struct GList, а struct GList *. data — не struct prog, а struct prog * (скорее всего) ==> пиши (*(*list).data).text или list->data->text.
а может кто-нить скажет, как мне устроить свой список, с функцией добавоениея в него, а?
ЗЫ
Полистал книжки — что-то лажа какая-то….
Genric лучше чем GList, наврядли сделаешь.
А чего тут делать-то?
Good Luck,
UT
C++ это хорошо, а на C разве нельзя?
А что тут от C++? Только cout, потому что я не знаю форматов (лень). Я специально это классом не делал, хотя было бы проще… Ну да, еще new… malloc который…
Какой ты, однако, привередливый… :-) Ну ладно, здесь еще можно долго ковыряться, вот, примерно, идея.
На PASCALэе писать не буду, даже и не проси! :-)
Good Luck,
UT
Дядя, я так понимаю мы примерно одно и тоже пишем….
Продолжая мытарства с GList:
struct prog{
int store;
};
GList *list=NULL;
struct prog *item = malloc(sizeof(struct prog));
struct prog *back = malloc(sizeof(struct prog));
item->store=1234;
g_print(«item: %d»,item->store);
list=g_list_append(list, item);
back=list->data;
g_print(«back: %d», back->store);
…
….
Это компилится и работает. Если кто наткнется — смотрите…
PS
Моя ошибки была в не выделении памяти для *item….
надо поспать хоть чуть-чуть…. Всем спасибо