Проблема сборки PAPyRUS под OpenBSD 6.2
-
Спасибо.
-
Нет еще. На Bochs пытался поставить - не вышло, тормоза такие, будто я не pentium в параметрах указал и 512 метров оперативы, а 386-й и 64 МБ. Но надо будет попробовать, скорее всего, на релаьном железе.
-
Я вот чего не могу понять - в плюсах разрешено подобное преобразование:
char* bla=(void*)func("ddd");
то есть, void * в char*, или в int и обратно? Просто у него так много где. Целый класс styleItem с функцией get_attr.void * StyleItem::get_attr(StyleAttrType t) { switch( t ) { case STYLE_NAME: return (void *)_name; break; case STYLE_ALIGNMENT: return (void *)_alignment; break; case STYLE_FLINE_MARGIN: return (void *)_fline; break; case STYLE_BOTTOM_MARGIN: return (void *)get_bmargin(); break; case STYLE_TOP_MARGIN: return (void *)get_tmargin(); break; case STYLE_LEFT_MARGIN: return (void *)get_lmargin(); break; case STYLE_RIGHT_MARGIN: return (void *)get_rmargin(); break; case STYLE_TAG: return (void *)_tag; break; case STYLE_NEXT_STYLE: return (void *)((_nstyle==NULL) ? "Normal" : _nstyle); return (char *)_nstyle; break; case STYLE_FONT: return (void *)_font; break; default: fprintf(stderr, "StyleItem::get_attr: StyleAttrType %d not allowed\n", (int)t); } return NULL; }
-
Вобщем, с помощью gdb, я понял (в двадцатый раз! мда уж), что проблема здесь:
styleItem.c:case STYLE_BOTTOM_MARGIN: set_bmargin((unsigned int)value); break;
И здесь:
margin.h:inline void set_bmargin(unsigned short m) { bmargin = UNZOOM(m); }
gdb мне выдал следующее:Program received signal SIGSEGV, Segmentation fault. 0x17b7ba85 in StyleItem::set_attr (this=0x85ca4b00, t=STYLE_BOTTOM_MARGIN, value=0x0) at margin.h:53 53 inline void set_bmargin(unsigned short m) { bmargin = UNZOOM(m); } (gdb) q The program is running. Exit anyway? (y or n) y
И продолжил выдавать даже когда я заменил первый код на:case STYLE_BOTTOM_MARGIN: set_bmargin((*(unsigned short*)value)); break;
reinterpret_cast и static_cast тоже использовал в самых извращенных работах, нулевой результат.
UNZOOM(m) это define:
globals.h [48 строка]:#define ZOOM(size) ((int)((size)*zoom)) #define UNZOOM(size) ((int)((size)/zoom))
Словом, странно все это. -
inline void set_bmargin(unsigned short m)
А что за переменная m? У меня у самого вчера взрыв мозга был(функция возвращала не True, а адрес ячейки памяти, но виноваты были скобки)))
case STYLE_BOTTOM_MARGIN:
set_bmargin((*(unsigned short*)value));
break;
А это ничего не должно возвращать?
Т.к. t=STYLE_BOTTOM_MARGIN
Я вчера с подобным работал. -
Да вроде, функция set_attr(..) и не должно ничего возвращать:
void StyleItem::set_attr(StyleAttrType t, void *value) { printf("....set_attr: start\n"); switch( t ) { case STYLE_NAME: if( _name != NULL ) delete _name; _name = strdup((char *)value); break; case STYLE_ALIGNMENT: _alignment = reinterpret_cast<StyleAlignType &>(value); break; case STYLE_FLINE_MARGIN: _fline = (*(unsigned int*)value); break; case STYLE_BOTTOM_MARGIN: set_bmargin((*(unsigned short*)value)); break; case STYLE_TOP_MARGIN: set_tmargin((unsigned int)value); break; case STYLE_LEFT_MARGIN: set_lmargin((unsigned int)value); break; case STYLE_RIGHT_MARGIN: set_rmargin((unsigned int)value); break; case STYLE_TAG: printf("....set_attr[tag]: started\n"); printf("....set_attr[tag]: started!\n"); _tag = *static_cast<int*>(value); printf("....set_attr: _tag=%d\n",_tag); break; case STYLE_NEXT_STYLE: if( _nstyle != NULL ) delete _nstyle; _nstyle = strdup((char *)value); break; case STYLE_FONT: _font = (FontItem *)value; break; default: fprintf(stderr, "StyleItem::set_attr: StyleAttrType %d not allowed\n", (int)t); }; }
Что такое m мне известно - она же декларирована в самой функции set_bmargin(..);:inline void set_bmargin(unsigned short m) { bmargin = UNZOOM(m); }
Там вообще данные передаются, похоже, так:void*->unsigned short->?
там идет приравнивание в оригинале unsigned short и int?
UNZOOM же равен (int)((size)/zoom)
Но, даже если я делаю преобразование, причем неважно как, то все равно PAPyRUS выпадает с SIGSEGV, Segmentation fault. -
Очередное полотно от отладчика:
Breakpoint 1, StyleManager::add_style (this=0x8091473c, n=0x83929b78 "Normal", b=0x0) at kernel/StyleManager/styleManager.cc:181 181 printf("........add_style: 0.9\n"); (gdb) c Continuing. ........add_style: 0.9 Breakpoint 4, StyleManager::add_style (this=0x8091473c, n=0x83929b78 "Normal", b=0x0) at kernel/StyleManager/styleManager.cc:182 182 s->set_attr(STYLE_TOP_MARGIN, (void *)j); (gdb) c Continuing. ....set_attr: start Breakpoint 5, StyleManager::add_style (this=0x8091473c, n=0x83929b78 "Normal", b=0x0) at kernel/StyleManager/styleManager.cc:183 183 s->set_attr(STYLE_BOTTOM_MARGIN, (void *)j); (gdb) c Continuing. ....set_attr: start 0x0 0 Breakpoint 6, StyleManager::add_style (this=0x8091473c, n=0x83929b78 "Normal", b=0x0) at kernel/StyleManager/styleManager.cc:184 184 s->set_attr(STYLE_LEFT_MARGIN, (void *)j); (gdb) c Continuing. ....set_attr: start Breakpoint 7, StyleManager::add_style (this=0x8091473c, n=0x83929b78 "Normal", b=0x0) at kernel/StyleManager/styleManager.cc:185 185 s->set_attr(STYLE_RIGHT_MARGIN, (void *)j); (gdb) c Continuing. ....set_attr: start Breakpoint 8, StyleManager::add_style (this=0x8091473c, n=0x83929b78 "Normal", b=0x0) at kernel/StyleManager/styleManager.cc:186 186 printf("........add_style: 0.10\n"); (gdb) c Continuing. Breakpoint 1, StyleManager::add_style (this=0x8091473c, n=0x83929b78 "Normal", b=0x0) at kernel/StyleManager/styleManager.cc:181 181 printf("........add_style: 0.9\n"); (gdb) c Continuing. ........add_style: 0.9 Breakpoint 4, StyleManager::add_style (this=0x8091473c, n=0x83929b78 "Normal", b=0x0) at kernel/StyleManager/styleManager.cc:182 182 s->set_attr(STYLE_TOP_MARGIN, (void *)j); (gdb) c Continuing. ....set_attr: start Breakpoint 5, StyleManager::add_style (this=0x8091473c, n=0x83929b78 "Normal", b=0x0) at kernel/StyleManager/styleManager.cc:183 183 s->set_attr(STYLE_BOTTOM_MARGIN, (void *)j); (gdb) c Continuing. ....set_attr: start 0x0 0 Breakpoint 6, StyleManager::add_style (this=0x8091473c, n=0x83929b78 "Normal", b=0x0) at kernel/StyleManager/styleManager.cc:184 184 s->set_attr(STYLE_LEFT_MARGIN, (void *)j); (gdb) c Continuing. ....set_attr: start Breakpoint 7, StyleManager::add_style (this=0x8091473c, n=0x83929b78 "Normal", b=0x0) at kernel/StyleManager/styleManager.cc:185 185 s->set_attr(STYLE_RIGHT_MARGIN, (void *)j); (gdb) c Continuing. ....set_attr: start Breakpoint 8, StyleManager::add_style (this=0x8091473c, n=0x83929b78 "Normal", b=0x0) at kernel/StyleManager/styleManager.cc:186 186 printf("........add_style: 0.10\n"); (gdb) c Continuing. ........add_style: 0.10 Breakpoint 9, StyleManager::add_style (this=0x8091473c, n=0x83929b78 "Normal", b=0x0) at kernel/StyleManager/styleManager.cc:187 187 s->set_attr(STYLE_ALIGNMENT, (void *)STYLE_ALIGN_LEFT); (gdb) c Continuing. ....set_attr: start Breakpoint 10, StyleManager::add_style (this=0x8091473c, n=0x83929b78 "Normal", b=0x0) at kernel/StyleManager/styleManager.cc:188 188 s->set_attr(STYLE_FLINE_MARGIN, (void *)j); (gdb) c Continuing. ....set_attr: start Program received signal SIGSEGV, Segmentation fault. 0x17b8fc13 in StyleItem::set_attr (this=0x7af7b1c0, t=STYLE_FLINE_MARGIN, value=0x0) at kernel/StyleManager/styleItem.cc:197 197 _fline = (*(unsigned int*)value); (gdb) q