GTK+에서 이것를 사용하는 방법은?

aninly의 이미지

Doubly Linked Lists에서

gint g_list_length(GList *list);

GList *g_list_nth(GList *list, gint n);

GList *g_list_find(GList *list, gpointer data);

간단한 예제나 사용하는 방법 좀 알려주세요.

gtk.org에서 찾아봐도 모르겠어요.

iolo의 이미지

딱히 사용법이라고 할만한것도 없습니다.
이름 그대로지요.

char* data1 = "aaa";
char* data2 = "bbb";
char* data3 = "ccc";


GList* list = NULL;
list = g_list_append(list, data1); /*리턴값을 list로 다시 받는 것이 중요! */
list = g_list_append(list, data2);
list = g_list_append(list, data3);

라고하면 3개의 엔트리가 더블링크로 저장되어 있겠죠?
여기서 위의 함수들을 테스트 삼아 돌려보면:

GList* node;
g_print("%d\n", g_list_length(list)); /* 3 */
node = g_list_nth(list, 1);
g_print("%s\n", (char*)(node->data)); /* bbb */
node = g_list_find(list, data3);
g_print("%s\n", (char*)(node->data)); /* ccc */

단 gpointer data에는 아무데이터나 들어가도 상관없습니다.
주로 동적으로(g_new/malloc등으로) 할당한 구조체의 포인터가 많이 쓰이지만, 포인터와 사실상 같은 (32비트)정수형을 직접 저장할수도 있습니다.
(이때 GPOINTER_TO_INT, GINT_TO_POINTER등의 매크롤 쓰면 편합니다)

주의할 점은:
1. 동적으로 할당한 포인터라면 사용자 쪽에서 data를 해제해주어야 합니다.
2. 리스트를 변형 시키는 (g_list_append/remove등등)함수들의 리턴값은 변형된 후의 리스트이므로 위의 예처럼 다시 할당해주셔야합니다. (관행적으로 많이 쓰이는 방법이라고 알고 있습니다)

그리고 정수형을 저장한경우가 아니라면(대부분의 경우죠) g_list_find는 별로 효용성이 없을껍니다. 내용을 비교하는게 아니라 포인터값 직접비교니까요.
(위의 예에선 data1,2,3변수가 아직 유효할꺼라는 가정하에 저렇게 한것 뿐입니다) 대부분의 경우에는 g_list_find_custom을 많이 사용하시게 될껍니다.
위의 경우로 예를 들어보면

node = g_list_find_custom(list, "bbb", (GCompareFunc)strcmp);

즉, ==연산자대신 사용자가 정의한 비교함수를 사용하게 하는 것이죠.

실제로 쓰시다 보면, iteration함수인 g_list_foreach()도 많이 사용하시게될겁니다.

----
the smile has left your eyes...

iolo의 이미지

아 한가지 헷갈리는 부분을 빼먹었네요.
최소에 GList를 생성하기 위해서 g_list_new같은 걸 하지 않습니다.
물론 g_list_alloc도 안하죠.

GList은 클래스(또는 GObject)가 아니고 그냥 구조체입니다.
빈 리스트를 만드는 것은 GList* list = NULL; 로 충분합니다.

그럼 이만=3=3=33

----
the smile has left your eyes...

litdream의 이미지

질문하신분께서는 GTK 공부를 최근에 열심히 하시는듯 보입니다만,
GUI 에 너무 마음이 앞서 보이시는듯 합니다.
지금 질문경우는 Linked List 를 한번이라도 만들어 보았다면 익숙할텐데요.

다른 기초도 같이 공부를 하셔야, 지금 하시는 공부가 더욱 보람찰듯 합니다.

삽질의 대마왕...

익명 사용자의 이미지

C언어도 제대로 모르는 상태라서 힘들군요.
리눅스도 처음이고, GTK도 처음이라서요.
열심히 공부해서 잘 사용하고 싶네요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.