GTK+에서 List에 관한 2가지 질문.

aninly의 이미지

아래에는 리눅스 GTK+ 프로그래밍 21일 완성이라는 책을
중심으로 공부를 하면서 약간씩 변형을 주면서 만들고 있습니다.
리스트를 2개 생성해서, 첫번째 리스트에서 선택하면 두번째 리스트로 옮겨가고, 2두번째 리스트에 옮겨간것을 실행하면 옮겨진 순서대로 실행할려고 합니다.
어느정도 작업이 끝나서 컴파일하고 build를 해서
Execute in Host를 실행하면 작동이 되고요.

원하는건 다 실행되는데, 리스트 박스에 있는것을 삭제 버튼을
누르면 삭제가 되면서 Top widget 뒤에 있는 윈도에

    unable to find singal handler for object(GtkListItem : 0x81492d8) with fun((nil)) and
    data(0x807cef8)

이라는 메세지와

    file gtkcontainer.c : line2383(gtk_container_propagate_expose) : assertion 'GTK_WIDGET(child) 'faild'
.

라는 메세지가 나타납니다.

왜 이런 메세지가 나오는지 알수가 없어서요.

line2383은 어딘가요? 제가 만든 프로그램은 500줄도 안되는데......

좀 알려주시면 감사하겠습니다.

#include <stdio.h>
#include <gtk/gtk.h>
gint counter = 0;
gchar *label_text = NULL;
GtkWidget *list, *list2 = NULL; //list=vbox에 list2=vbox2에 들어갈 리스트박스

void button_remove_clicked(GtkButton *button, GtkWidget *list2)
{
    GList *list_items2 = NULL;
    GtkWidget *list_item2 = NULL;
    
    /* Get the list item that corresponds to the clicked remove
       button. */
    list_item2 =

        gtk_object_get_data(GTK_OBJECT(button), "list_item2");
    
    /* Create the GList of list items that will be removed, in
       this case it will only contain one. */
    list_items2 = g_list_prepend(list_items2, list_item2);
    
    /* Remove the list item. */
    gtk_list_remove_items(GTK_LIST(list2), list_items2);
}

GtkWidget *create_row2(GtkWidget *list2)
{
    GtkStyle *newstyle = NULL;
    GtkWidget *list_item2 = NULL;
    GtkWidget *hbox = NULL;
    GtkWidget *button = NULL;
    GtkWidget *label = NULL;
    gchar buffer[255];
    
    /* Create a new GtkListItem */
    list_item2 = gtk_list_item_new();
	
    /* Create the contents of the list item. */
    hbox = gtk_hbox_new(FALSE, 0);
    gtk_container_add(GTK_CONTAINER(list_item2), hbox);
    
    button = gtk_button_new_with_label(" Remove ");
    gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, TRUE, 0);
    gtk_signal_connect(GTK_OBJECT(button), "clicked",
        (GtkSignalFunc)button_remove_clicked, list2);
    gtk_object_set_data(GTK_OBJECT(button), "list_item2",
        list_item2);
    
    /* Make the selected button background color the same as
       the normal button background color. */
    gtk_widget_ensure_style(button);
    newstyle = gtk_style_copy(button->style);
    newstyle->bg[GTK_STATE_SELECTED] =
        newstyle->bg[GTK_STATE_NORMAL];
    gtk_widget_set_style(button, newstyle);
    
    /* Make the selected button label foreground color the same
       as the normal button label foreground color. */
    gtk_widget_ensure_style(GTK_BIN(button)->child);
    newstyle = gtk_style_copy(button->style);
    newstyle->fg[GTK_STATE_SELECTED] =
        newstyle->fg[GTK_STATE_NORMAL];
    gtk_widget_set_style(GTK_BIN(button)->child, newstyle);
    
    sprintf(buffer, " %s ", label_text);
    
    label = gtk_label_new(buffer);
	
    gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
    
    gtk_object_set_data(GTK_OBJECT(list_item2), "label", label);
    
    gtk_widget_show_all(list_item2);
    
    return list_item2;
}

GList* contruct_list_items2(GtkWidget *list2)
{
    GList *list_items2 = NULL;
    
       
      list_items2 = g_list_prepend(list_items2, create_row2(list2));
    
    
    list_items2 = g_list_reverse(list_items2);
    
    return list_items2;
}




void list_select_child(GtkList *list, GtkWidget *item,
         gpointer user_data)
{
    GtkWidget *label = NULL;
    GList *list_items = NULL;
    GtkWidget *statusbar = NULL;
    gchar buffer[255];
    
    label = gtk_object_get_data(GTK_OBJECT(item), "label");
    gtk_label_get(GTK_LABEL(label), &label_text);
    
    statusbar = gtk_object_get_data(GTK_OBJECT(list),
        "statusbar");
    gtk_statusbar_pop(GTK_STATUSBAR(statusbar), 1);
    sprintf(buffer, " \"%s\" selected", label_text);
    gtk_statusbar_push(GTK_STATUSBAR(statusbar), 1, buffer);
	
/******************************************************************************/	
	list_items = g_list_prepend(list_items, create_row2(list));
    
    /* Insert the new row at the focus position or at the
       top. */
    gtk_list_insert_items(GTK_LIST(list2), list_items, -1);
   /**/
}

void list_unselect_child(GtkList *list, GtkWidget *item,
         gpointer user_data)
{
    GtkWidget *label = NULL;
    gchar *label_text = NULL;
    GtkWidget *statusbar = NULL;
    gchar buffer[255];
    
    label = gtk_object_get_data(GTK_OBJECT(item), "label");
    gtk_label_get(GTK_LABEL(label), &label_text);
    
    statusbar = gtk_object_get_data(GTK_OBJECT(list),
        "statusbar");
    gtk_statusbar_pop(GTK_STATUSBAR(statusbar), 1);
    sprintf(buffer, " \"%s\" unselected", label_text);
    gtk_statusbar_push(GTK_STATUSBAR(statusbar), 1, buffer);
}


GtkWidget *create_row(GtkWidget *list)
{
    GtkStyle *newstyle = NULL;
    GtkWidget *list_item = NULL;
    GtkWidget *hbox = NULL;
    GtkWidget *button = NULL;
    GtkWidget *label = NULL;
    gchar buffer[255];
       
    /* Create a new GtkListItem */
    list_item = gtk_list_item_new();
    
    /* Create the contents of the list item. */
    hbox = gtk_hbox_new(FALSE, 0);
    gtk_container_add(GTK_CONTAINER(list_item), hbox);
       
    if(counter==0) sprintf(buffer, "Histo_Binary");
    if(counter==1) sprintf(buffer, "Histo_Equal");
    if(counter==2) sprintf(buffer, "Histo_Stretch");
    if(counter==3) sprintf(buffer, "LogarithmOP");

    counter++;
    
    label = gtk_label_new(buffer);
	
    gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
    
    gtk_object_set_data(GTK_OBJECT(list_item), "label", label);
    
    gtk_widget_show_all(list_item);
    
    return list_item;
}

GList* contruct_list_items(GtkWidget *list)
{
    GList *list_items = NULL;
    
    /* Construct 100 list items and put them in a GList. */
    while(counter < 4)
    {
        list_items = g_list_prepend(list_items, create_row(list));
    }
    
    list_items = g_list_reverse(list_items);
    
    return list_items;
}

void button_remove_selection_clicked(GtkButton *button,
         GtkWidget *list)
{
    GList *selected_items = NULL;
    GList *items_to_remove = NULL;
    
    /* Get the selected list items. */
    selected_items = GTK_LIST(list)->selection;
    
    /* Copy the obtained GList to another one since the
       selection GList is changed when removing items. */
    while(selected_items)
    {
        items_to_remove = g_list_prepend(items_to_remove,
            selected_items->data);
        selected_items = g_list_next(selected_items);
    }
    
    if(items_to_remove)
    {
        items_to_remove = g_list_reverse(items_to_remove);
    
        /* If there were items in the selection,remove them. */
        gtk_list_remove_items(GTK_LIST(list), items_to_remove);
    }
}

void button_add_clicked(GtkButton *button, GtkWidget *list)
{
    GtkWidget *focus_widget = NULL;
    gint focus = 0;
    GList *list_items = NULL;
    
    /* Get the currently focused list item. */
    focus_widget = GTK_LIST(list)->last_focus_child;
    if(focus_widget)
    {
        /* If there is a current focus, get the numeric
           position in the list. */
        focus = gtk_list_child_position(GTK_LIST(list),
            focus_widget);
    }
    
    /* Create the GList of items that will be inserted in the
       list. In this case, it's just one. */
    list_items = g_list_prepend(list_items, create_row(list));
    
    /* Insert the new row at the focus position or at the
       top. */
    gtk_list_insert_items(GTK_LIST(list), list_items, focus);
}

void button_select_all_clicked(GtkButton *button,
         GtkWidget *list)
{
    gtk_list_select_all(GTK_LIST(list));
}

void button_select_none_clicked(GtkButton *button,
         GtkWidget *list)
{
    gtk_list_unselect_all(GTK_LIST(list));
}

/******************************************************************************************
***************************        Main 프로그램        **************************************
*******************************************************************************************/
int main(int argc, char *argv[])
{
    GtkWidget *window = NULL;  //최상위 윈도
    GtkWidget *vbox, *vbox1, *vbox2 = NULL; //최상위 윈도에 들어갈 세로 박스
	/*vbox 안에 vbox1, vbox2가 순서대로 들어갈 예정*/
    GtkWidget *scrolled_window, *scrolled_window2 = NULL; //리스트1, 리스트2에 들어가 scrolled
    GtkWidget *table, *table2 = NULL; // 테이블 박스
    GtkWidget *button_remove_selection = NULL;
    GtkWidget *button_remove_selection2 = NULL;
    GtkWidget *button_add= NULL;
    GtkWidget *button_add2 = NULL;
    GtkWidget *button_select_all = NULL;
    GtkWidget *button_select_all2 = NULL;
    GtkWidget *button_select_none = NULL;
    GtkWidget *button_select_none2 = NULL;
    GtkWidget *statusbar, *statusbar2  = NULL;
    GList *list_items = NULL;
    GList *list_items2 = NULL;
    GtkWidget *separator;
	char *sTest;
    
	/*1.환경을 초기화한다.*/
    gtk_init(&argc, &argv);
    
	/*2a.위젯을 생성한다.*/
	
	/*최상위 위젯 생성 및 크기와 종료설정*/
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window),
        "Image Processing");
    gtk_window_set_policy(GTK_WINDOW(window), TRUE, TRUE,
        FALSE);
    gtk_window_set_default_size(GTK_WINDOW(window), -1, 600);
    gtk_container_set_border_width(GTK_CONTAINER(window), 5);
    gtk_signal_connect(GTK_OBJECT(window), "delete_event",
        (GtkSignalFunc)gtk_exit, NULL);
    
    vbox = gtk_vbox_new(FALSE, 5); //최상위 윈도에 들어갈 세로 박스생성
    separator = gtk_hseparator_new(  ); //가로 분리선 생성
    vbox1 = gtk_vbox_new(FALSE, 5); // 윗단에  들어갈 세로박스 생성
    vbox2 = gtk_vbox_new(FALSE, 5); // 아랫단에 들어갈 세로박스 생성
	
    gtk_container_add(GTK_CONTAINER(window), vbox); //최상위 윈도에 세로 박스 삽입
    gtk_box_pack_start_defaults( GTK_BOX( vbox ), vbox1); // 세로박스 윗단에 박스 삽입
    gtk_box_pack_start_defaults( GTK_BOX( vbox ), separator); //가로 분리선 삽입
    gtk_box_pack_start_defaults( GTK_BOX( vbox ), vbox2); //세로박스 아랫단에 박스 삽입
        
	/*vbox1에 들어갈 scrolled 생성 및 삽입*/
    scrolled_window = gtk_scrolled_window_new(NULL, NULL);
    gtk_scrolled_window_set_policy
        (GTK_SCROLLED_WINDOW(scrolled_window),
         GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
    gtk_box_pack_start(GTK_BOX(vbox1), scrolled_window, TRUE, TRUE, 0);
	
	/*vbox2에 들어갈 scrolled 생성 및 삽입*/
    scrolled_window2 = gtk_scrolled_window_new(NULL, NULL);
    gtk_scrolled_window_set_policy
        (GTK_SCROLLED_WINDOW(scrolled_window2),
         GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
    gtk_box_pack_start(GTK_BOX(vbox2), scrolled_window2, TRUE, TRUE, 0);
        
	/*vbox1 start*/  
    list = gtk_list_new();// 리스트 생성
	
	//리스트에서 여러 개의 항목을 선택할 수 있도록 설정
    gtk_list_set_selection_mode(GTK_LIST(list), GTK_SELECTION_MULTIPLE);
	
	/* 리스트 내용생성 */
       list_items = contruct_list_items(list);
    /* 생성된 내용 리스트에 넣기  */
       gtk_list_append_items(GTK_LIST(list), list_items);
    
	/* 리스트에 scrolled를 더한다. */
    gtk_scrolled_window_add_with_viewport(
		GTK_SCROLLED_WINDOW(scrolled_window), list);
    
	/* Attach the GtkList item focus to the adjustments of the
       GtkScrolledWindow. */
    gtk_container_set_focus_hadjustment(GTK_CONTAINER(list),
        gtk_scrolled_window_get_hadjustment
        (GTK_SCROLLED_WINDOW(scrolled_window)));
    gtk_container_set_focus_vadjustment(GTK_CONTAINER(list),
        gtk_scrolled_window_get_vadjustment
        (GTK_SCROLLED_WINDOW(scrolled_window)));
	
	/*signal handler를 select_child과 unselect_child signals에 연결한다.*/
    gtk_signal_connect(GTK_OBJECT(list), "select_child",
       (GtkSignalFunc)list_select_child, NULL);
	
    gtk_signal_connect(GTK_OBJECT(list), "unselect_child",
        (GtkSignalFunc)list_unselect_child, NULL);
    
    
    
    statusbar = gtk_statusbar_new();
    gtk_box_pack_start(GTK_BOX(vbox1), statusbar,
        FALSE, TRUE, 0);
    gtk_object_set_data(GTK_OBJECT(list), "statusbar",
        statusbar);
   
 //   gtk_signal_connect(GTK_OBJECT(remove), "activate",
//					   button_remove_clicked, NULL);
	/*vbox1 end*/
	
    /*vbox2 start*/
	 list2 = gtk_list_new();// 리스트 생성
	 
	//리스트에서 여러 개의 항목을 선택할 수 있도록 설정
    gtk_list_set_selection_mode(GTK_LIST(list2), GTK_SELECTION_MULTIPLE);
	
	gtk_signal_connect(GTK_OBJECT(list), "select_child",
       (GtkSignalFunc)contruct_list_items2, list2);
	
	/* Get the GList of initial list items. */
//    list_items2 = contruct_list_items(list2);
    /* Put those in the list. */
//    gtk_list_append_items(GTK_LIST(list2), list_items2);
   
	/* Add the list the scrolled window. */
    gtk_scrolled_window_add_with_viewport(
        GTK_SCROLLED_WINDOW(scrolled_window2), list2);
    /* Attach the GtkList item focus to the adjustments of the
       GtkScrolledWindow. */
    gtk_container_set_focus_hadjustment(GTK_CONTAINER(list2),
        gtk_scrolled_window_get_hadjustment
        (GTK_SCROLLED_WINDOW(scrolled_window2)));
    gtk_container_set_focus_vadjustment(GTK_CONTAINER(list2),
        gtk_scrolled_window_get_vadjustment
        (GTK_SCROLLED_WINDOW(scrolled_window2)));
    /* Connect a signal handler to the select_child and
       unselect_child signals. */
//    gtk_signal_connect(GTK_OBJECT(list2), "select_child",
//        (GtkSignalFunc)list_select_child, NULL);
//    gtk_signal_connect(GTK_OBJECT(list2), "unselect_child",
//        (GtkSignalFunc)list_unselect_child, NULL);
    
    table2 = gtk_table_new(2, 2, TRUE);
    gtk_box_pack_start(GTK_BOX(vbox2), table2,
        FALSE, TRUE, 0);

    button_remove_selection =
        gtk_button_new_with_label(" Remove Selection ");
    gtk_signal_connect(GTK_OBJECT(button_remove_selection),
        "clicked",
        (GtkSignalFunc)button_remove_selection_clicked, list2);
    gtk_table_attach(GTK_TABLE(table2), button_remove_selection,
        0, 1, 0, 1,
        GTK_EXPAND | GTK_SHRINK | GTK_FILL,
        GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
    
    button_add = gtk_button_new_with_label(" Add Row ");
    gtk_signal_connect(GTK_OBJECT(button_add), "clicked",
        (GtkSignalFunc)button_add_clicked, list2);
    gtk_table_attach(GTK_TABLE(table2), button_add,
        1, 2, 0, 1,
        GTK_EXPAND | GTK_SHRINK | GTK_FILL,
        GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
    
    button_select_all =
        gtk_button_new_with_label(" Select All ");
    gtk_signal_connect(GTK_OBJECT(button_select_all),
        "clicked",
        (GtkSignalFunc)button_select_all_clicked, list2);
    gtk_table_attach(GTK_TABLE(table2), button_select_all,
        0, 1, 1, 2,
        GTK_EXPAND | GTK_SHRINK | GTK_FILL,
        GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
    
    button_select_none =
        gtk_button_new_with_label(" Select None ");
    gtk_signal_connect(GTK_OBJECT(button_select_none),
        "clicked",
        (GtkSignalFunc)button_select_none_clicked, list2);
    gtk_table_attach(GTK_TABLE(table2), button_select_none,
        1, 2, 1, 2,
        GTK_EXPAND | GTK_SHRINK | GTK_FILL,
        GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
    
    statusbar2 = gtk_statusbar_new();
    gtk_box_pack_start(GTK_BOX(vbox2), statusbar2,
        FALSE, TRUE, 0);
    gtk_object_set_data(GTK_OBJECT(list2), "statusbar2",
        statusbar2);
	/*vbox2 end*/
	
	
	 
	/*5. 위젯을 보이게 한다.*/
    gtk_widget_show_all(window);
    
	/*6. 루프를 처리한다.*/
    gtk_main();
    
    return 0;
}

그리고 리스트 두번째 리스트에 있는 Label을 선택 삭제할때와
삭제 후 첫번째 리스트에서 한개를 선택하면 에러가 아래와 같은
에러문이 나타납니다. 위의 동작을 반복하면 GTK 위젯이 종료되
는데 어떻게 해야 될지 모르겠습니다.


    (killer:8172): Gtk-CRITICAL **: file gtkwidget.c: line 5598 (gtk_widget_is_ancestor): assertion `GTK_IS_WIDGET (widget)' failed

    (killer:8172): GLib-GObject-CRITICAL **: file gobject.c: line 1319 (g_object_ref): assertion `G_IS_OBJECT (obje
    ct)' failed

    (killer:8172): GLib-GObject-WARNING **: instance of invalid non-instantiatable type `<invalid>'

    (killer:8172): GLib-GObject-CRITICAL **: file gsignal.c: line 2637 (g_signal_emit_by_name): assertion `G_TYPE_C
    HECK_INSTANCE (instance)' failed

    (killer:8172): GLib-GObject-CRITICAL **: file gobject.c: line 1337 (g_object_unref): assertion `G_IS_OBJECT (ob
    ject)' failed

    (killer:8172): Gtk-CRITICAL **: file gtkwidget.c: line 5598 (gtk_widget_is_ancestor): assertion `GTK_IS_WIDGET
    (widget)' failed

    (killer:8172): GLib-GObject-CRITICAL **: file gobject.c: line 1319 (g_object_ref): assertion `G_IS_OBJECT (obje
    ct)' failed

    (killer:8172): GLib-GObject-WARNING **: instance of invalid non-instantiatable type `<invalid>'

    (killer:8172): GLib-GObject-CRITICAL **: file gsignal.c: line 2637 (g_signal_emit_by_name): assertion `G_TYPE_C
    HECK_INSTANCE (instance)' failed

    (killer:8172): GLib-GObject-CRITICAL **: file gobject.c: line 1337 (g_object_unref): assertion `G_IS_OBJECT (ob
    ject)' failed

    (killer:8172): Gtk-CRITICAL **: file gtkcontainer.c: line 2383 (gtk_container_propagate_expose): assertion `GTK
    _IS_WIDGET (child)' failed

    Enter any key!
[/][/][/]
iolo의 이미지

안타까운 얘기지만... GtkList는 더이상 사용되지 않습니다.
보고 계신 책은 GTK 1.x를 기준으로 한 (상당히)오래된 책이고...
현재의 GTK 2.x에선 GtkTreeView를 쓰도록 권장하고 있습니다.
물론 임베디드등의 상황에서 gtk 1.x를 쓰시는 경우라면 무방합니다.

그리고, 위의 에러메시지에서 나오는 파일이름(*.c)과 줄번호는 gtk소스의 것입니다. 해당 함수를 호출한 측의 위치를 알아내셔야 할것입니다.
gdb를 사용해서 실행하고 에러가 발생했을때 bt를 해보시면
문제가 된 위치(해당 함수를 호출한 사용자의 코드)를 알 수 있을 겁니다.

(위에 인용하신 코드는 보지도않고 답글 달기가 그런데... 제가 많이 게을러서요 -.-;)

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

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.