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 ★★★★★
()
Ответ на: комментарий от 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 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.