LINUX.ORG.RU

Ссылка на функцию не работает

 ,


0

1

Спасите, помогите! Выложил код на github. Интересует файл menu.c.

При компиляции выдаёт такое предупреждение.

menu.c:105:54: warning: statement with no effect [-Wunused-value]
     if ( bb->buttons [ i ]->click ) bb->buttons [ i ]->click;
Но ведь я же передал ссылку на click, или я не правильно что-то делаю?

☆

Последнее исправление: u0atgKIRznY5 (всего исправлений: 1)
Ответ на: комментарий от lberserq

видимо в эту data ты должен свои x и y сериализовать

lberserq ★
()
Ответ на: комментарий от lberserq

Вот спасибо, а я думал что connect делает всю работу по установлению ссылки и данных, а потом нужно только вызвать click и всё, а оказывается нет. Тогда как connect надо сделать, чтобы click только использовать, или так нельзя?

u0atgKIRznY5 ☆
() автор топика
Ответ на: комментарий от u0atgKIRznY5

у тебя c а не c++, если в структуре функция меняющая объект то надо эту структуру передавать этой функции в аргументах, стандартная практика ооп в c. В c по другому никак не сделать, можно разве что макросней сделать вида

 #define button_call(_button, _f,...) _button->_f(_button, __VA_ARGS__)

lberserq ★
()
Ответ на: комментарий от lberserq

Хорошо, понятно. Но как то в gtk g_signal_connect это организовано, не охото копаться в исходниках. Думал что решение не сложное.

u0atgKIRznY5 ☆
() автор топика
Ответ на: комментарий от u0atgKIRznY5

Тогда как connect надо сделать, чтобы click только использовать, или так нельзя?

Для этого придумали c++, в котором есть классы хранящие методы и внутреннее состояние. Хватит уже мучить сишку.

ox55ff ★★★★★
()
Ответ на: комментарий от ox55ff

Я пробывал на c++ писать, у меня не запускалась игра. На си хотя бы запускается. Такие проблемы я только на нетбуке встречал. А так как мне в ряде случаешь удобней на нетбуке писать, то буду писать на си.

u0atgKIRznY5 ☆
() автор топика
Ответ на: комментарий от ox55ff

Если я на си напишу, то такая проблема возникает редко, что не запуститься игра. Если на с++, то вообще никогда не запускается. У меня есть проект на с++, вот ошибка, которая появляется всегда.

casel: malloc.c:2399: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed.
Aborted (core dumped)

u0atgKIRznY5 ☆
() автор топика
Ответ на: комментарий от ox55ff
#0  0xb7fd7cd9 in __kernel_vsyscall ()
#1  0xb79f1112 in raise () from /usr/lib/libc.so.6
#2  0xb79f2892 in abort () from /usr/lib/libc.so.6
#3  0xb7a3a7fc in __malloc_assert () from /usr/lib/libc.so.6
#4  0xb7a3c8dd in sysmalloc () from /usr/lib/libc.so.6
#5  0xb7a3d9c9 in _int_malloc () from /usr/lib/libc.so.6
#6  0xb7a3efc9 in malloc () from /usr/lib/libc.so.6
#7  0xb7d21a98 in operator new (sz=65532) at /build/gcc/src/gcc/libstdc++-v3/libsupc++/new_op.cc:50
#8  0x004011e6 in Game::load_map (this=0x409300, pos=2561552, pic=0x4564f0) at game.cpp:63
#9  0x00401461 in Game::init_menu (this=0x409300) at game.cpp:126
#10 0x0040113b in Game::Game (this=0x409300, width=1024, height=600, cube_width=600, cube_height=600)
    at game.cpp:49
#11 0x00400e6c in main (argc=1, argv=0xbffff964) at main.cpp:7
u0atgKIRznY5 ☆
() автор топика
Ответ на: комментарий от u0atgKIRznY5

В picture.hpp в полях мусор, Дефолтовый конструктор не инициализирует pod типы. ты делаешь new на эти значения. На будущее прогони под valgrind ом если наблюдаешь такие падения

lberserq ★
()

Вот нет бы взять какой-нибудь нормальный язык, а не то что нужно только для того чтобы бесконечно чинить всякое устаревшее и разлагающееся.

ados ★★★★★
()
Ответ на: комментарий от lberserq

Там же перед new идёт заполнение этих переменных из файла. У меня корректные значения.

ox55ff ★★★★★
()
Ответ на: комментарий от ox55ff

Правильный. Если что, можно запустить сценарий в ci, и в лог будут смещения в data, они должны быть такими же. У меня на x86_64 запускается нормально. Но на нетбуке нет.

u0atgKIRznY5 ☆
() автор топика
Ответ на: комментарий от ox55ff

Да, разная. И это на c++. А си нормально тянет, иногда только заскоки.

u0atgKIRznY5 ☆
() автор топика
Ответ на: комментарий от u0atgKIRznY5

Тогда выведи в консоль pic->max_pixels перед pic->pixel = new unsigned int [ pic->max_pixels ]; в void Game::load_map ( long pos, Picture *pic ). Сдаётся мне, что там какая-то фигня.

ox55ff ★★★★★
()
Ответ на: комментарий от ox55ff

У меня есть такой же проект, только на си, его нет на github. Так вот в си вот что.

623999
16383
16383
А в с++
16383
16383
Как видно, один размер new не смог создать.

u0atgKIRznY5 ☆
() автор топика
Ответ на: комментарий от u0atgKIRznY5

Два раза по 16383 хватит в любом случае. У тебя где-то бьётся память. Значит это из-за конфигурации нетбука.

ox55ff ★★★★★
()
Ответ на: комментарий от u0atgKIRznY5

под valgrindом запусти на нетбуке, если нетбук под оффтопом то добавь проект в appverif, включи галочку heap в appverif.

lberserq ★
()
Последнее исправление: lberserq (всего исправлений: 2)
Ответ на: комментарий от ox55ff

ну я прогнал, как минимум 1 баг он у него нашел

for ( int i = 0; i <= pic->max_pixels; i++ ) 
хотя массив до pic->max_pixels из-за этого второй load_map скорее всего неверно может что-то прочитать

lberserq ★
()
Последнее исправление: lberserq (всего исправлений: 1)
Ответ на: комментарий от lberserq

Вот блин, я не заметил. Так то да, он залезает в чужую область памяти.

ox55ff ★★★★★
()
Ответ на: комментарий от u0atgKIRznY5

Вы не поняли. К моменту вызова operator new куча уже повреждена каким-то кодом выше. Здесь он валится только потому, что раньше повреждение обнаружить не могу.

anonymous
()
Ответ на: комментарий от lberserq

Придумал как сделать чтобы в connect отправлять данные и получать и событии. Если интересно, выложил на github, репозиторий ещё денёк постоит, потом удалю с github.

А в кратце сделал такую структуру.

struct connection {
 struct button *btn;
 void *data;
 void ( *event ) ( struct button *btn, void *data );
};
struct signals {
 int max_signals;
 struct connection *conn [ 10 ];
}*sig;
Теперь эти структуры будут хранить ссылки на данные, которые я отправляю в connect. А в connect я так сделал.
static void ra_connect ( struct button *btn, const char *event, void (*fn) (struct button *btn, void *data), void *data )
{
  if ( !strncmp ( event, "click\0", 6 ) ) {
    sig->conn [ sig->max_signals ] = calloc ( 1, sizeof ( struct connection ) );
    sig->conn [ sig->max_signals ]->event = fn;
    sig->conn [ sig->max_signals ]->btn = btn;
    sig->conn [ sig->max_signals ]->data = data;
    sig->max_signals++;
  }
}

А всё остальное это то, что вызывает по событию щелчка.

static void event_click ( struct button *btn )
{
  for ( int i = 0; i < sig->max_signals; i++ ) {
    if ( sig->conn [ i ]->btn == btn ) {
      sig->conn [ i ]->event ( sig->conn [ i ]->btn, sig->conn [ i ]->data );
    }
  }
}
static void ra_event_click ( struct bb *bb, int x, int y )
{
  for ( int i = 0; i < 4; i++ ) {
    if ( bb->buttons [ i ]->x <= x && bb->buttons [ i ]->xw >= x )
      if ( bb->buttons [ i ]->y <= y && bb->buttons [ i ]->yh >= y ) {
        event_click ( bb->buttons [ i ] );
      }
  }
}

u0atgKIRznY5 ☆
() автор топика

В предупреждении компилятора английским по белому написана проблема в коде.

andreyu ★★★★★
()
Вы не можете добавлять комментарии в эту тему: топик перемещен в архив.