Форум русскоязычного сообщества Ubuntu


Автор Тема: Трабла с gcc  (Прочитано 1188 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн aerin

  • Автор темы
  • Новичок
  • *
  • Сообщений: 2
    • Просмотр профиля
Трабла с gcc
« : 11 Декабрь 2008, 15:10:25 »
Доброе время суток!

Имеем: Ubuntu 8.10 (2.6.27-9-generic) + gcc/g++(4.3.2) + Anjuta(2.24.1).
Создаем в Anjuta новый generic Xlib project. Получаем main.c:
#ifdef HAVE_CONFIG_H
#  include <config.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <X11/Xlib.h>

int main (int argc, char *argv[])
{
Display              *dpy;
Visual               *visual;
int                   depth;
XSetWindowAttributes  attributes;
Window                win;
XFontStruct         *fontinfo;
XColor               color, dummy;
XGCValues            gr_values;
GC                   gc;
XKeyEvent event;

dpy = XOpenDisplay(NULL);
visual = DefaultVisual(dpy, 0);
depth  = DefaultDepth(dpy, 0);
attributes.background_pixel = XWhitePixel(dpy, 0);
/* create the application window */
win = XCreateWindow(dpy, XRootWindow(dpy, 0),
50, 50, 400, 400, 5, depth,
InputOutput, visual, CWBackPixel,
&attributes);
XSelectInput(dpy, win, ExposureMask | KeyPressMask |
ButtonPressMask | StructureNotifyMask);

fontinfo = XLoadQueryFont(dpy, "6x10");
XAllocNamedColor(dpy, DefaultColormap(dpy, 0),
"green", &color, &dummy);
gr_values.font = fontinfo->fid;
gr_values.foreground = color.pixel;
gc = XCreateGC(dpy, win, GCFont+GCForeground, &gr_values);
XMapWindow(dpy, win);

/* run till key press */
while(1){
XNextEvent(dpy, (XEvent *)&event);
switch(event.type) {
case Expose:
XDrawLine(dpy, win, gc, 0, 0, 100, 100);
XDrawRectangle(dpy, win, gc, 140, 140, 50, 50);
XDrawString(dpy, win, gc, 100, 100, "hello X world", 13);
break;
case ButtonPress:
case KeyPress:
XUnloadFont(dpy, fontinfo->fid);
XFreeGC(dpy, gc);
XCloseDisplay(dpy);
exit(0);
break;
case ConfigureNotify:
/* reconfigure size of window here */
break;
default:
break;
}
}
return(0);
}

Компиляем, все работает.
Теперь переносим объявление XSetWindowAttributes attributes; в конец объявлений, т.е. помещаем его сразу после XKeyEvent event:
   XKeyEvent event;
   XSetWindowAttributes  attributes;

Компиляем, запускаем, получаем Segmentation fault. Дальнейшими копаниями я выяснил, что падает на XNextEvent(dpy, (XEvent *)&event); и зависит от очередности обявления event и attributes. Это баг или я туплю?







Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Трабла с gcc
« Ответ #1 : 12 Декабрь 2008, 06:23:09 »
Почему все сразу пытаются найти баги в библиотеках котрые старше их самих раза в два, и были оттестированы миллионами на сотнях платформ?
Да. Ты тупишь. При чем нереально.
У тебя маска событий какая стоит? правильно ты дохрена всяких событий за хотел отлавливать.
Указатель ты на какой объект передаешь? (и поверь приведение типов не выделит больше памяти под объект события)
Кто тебя надоумил написать такую хренотень? Я не верю что так в книжке было.
XKeyEvent event; заменить на XEvent event;
XNextEvent(dpy, (XEvent *)&event); заменить на XNextEvent(dpy, &event);
В следующий раз внимательнее с приведением типов. особенно указателей. на 99% этим ты маскируешь ошибку.

гы... причем трабла совсем не в gcc а в мозгах...
« Последнее редактирование: 12 Декабрь 2008, 06:26:04 от Yurror »

Оффлайн aerin

  • Автор темы
  • Новичок
  • *
  • Сообщений: 2
    • Просмотр профиля
Re: Трабла с gcc
« Ответ #2 : 12 Декабрь 2008, 18:27:30 »
Yurror
Действительно, все решилось заменой XKeyEvent на XEvent. А код не из книжки, а как я и написал в самом начале, сгенерен Anjuta.

ЗЫ. Непонятно откуда такой снобизм? Да, я начал разбираться с программированием под Linux менее двух недель назад. Добрался до x-ов. Сгенерил шаблон приложения, начал упорядочивать код в своем стиле(с++) попутно разбираясь, что делает каждая функция. И уперся в то, что работоспособность программы зависит от порядка объявления структур - в том виде, в котором я привел ее в первом посте, она работает, несмотря на использование XKeyEvent.
ЗЫЫ. Кстати, очень режет глаз передача неинициализированных структур в функции, и это я не только про данный пример говорю. Я так понял, что это общепринятая практика. Также непонятно, почему практически во всех примерах, отсутствует проверка возвращаемого значения. Тут, кстати, тоже dpy = XOpenDisplay(NULL), нет проверки, хотя я встречал и такой вариант:
   d = XOpenDisplay(NULL);
   if (d == NULL) {
     fprintf(stderr, "Cannot open display\n");
     exit(1);
   }
ЗЫЫЫ.
Цитировать
Почему все сразу пытаются найти баги в библиотеках библиотеках котрые старше их самих раза в два, и были оттестированы миллионами на сотнях платформ
Если верить вики, то X originated at MIT in 1984. The current protocol version, X11, appeared in September 1987. Поверьте, мне далеко не 12 лет ;)



Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Трабла с gcc
« Ответ #3 : 13 Декабрь 2008, 07:55:16 »
ну хорошо, уговорил. пусть будет 13, с половиной.
Я говорил о том что все кто не смогли самостоятельно осилить библиотеку или как установить компилятор начинают обвинять эту самую библиотеку, компилятор, разработчиков дистрибутива, и Торвальдса лично, но этим дятлам даже не пришло в голову что ошибка их собственная.

P.S. и нехрен мазаться что там тебе Anjuta что-то сгенерила. мне вон переводчик ПРОМТ тоже много чего генерит но я ему не верю.
P.P.S. а багу пость им на багтрек. пусть праявт свои исходники.

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Трабла с gcc
« Ответ #4 : 13 Декабрь 2008, 08:03:05 »
Вот пишет грамотный человек. На С++ под Xlib. Со всеми любимыми тобою проверками.
http://linuxgazette.net/issue78/tougher.html
учись по нормальным учебникам а не по исходникам кторые тебе генерят нестабильные поделия.
« Последнее редактирование: 13 Декабрь 2008, 08:06:03 от Yurror »

 

Страница сгенерирована за 0.13 секунд. Запросов: 24.