FreeBasic
Главная
Вход
Регистрация
Воскресенье, 19.11.2017, 22:46Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Форум » Freebasic » Вопросы по языку FreeBasic » Почему функция не корректно работает в графическом режиме? (Неясные мне, неопытному, баги самопальной библиотеки.)
Почему функция не корректно работает в графическом режиме?
ExEДата: Пятница, 20.05.2016, 18:39 | Сообщение # 1
Сержант
Группа: Пользователи
Сообщений: 21
Репутация: 0
Статус: Offline
Прошу разъяснить мне ситуацию, ибо моих познаний в конкретном ЯП, да и программировании вообще, явно не хватает.
Вот использую я в своих нескольких находящихся в разработке проектах одни и те же функции для работы с мышью, и решил собрать их все (и дополнить теми, которых не хватает) в одну небольшую библиотеку. Проблема возникла с процедурой WaitMouse(), которая должна приостанавливать программу до нажатия кнопки мыши. Проблем с ней не было, до тех пор, пока я не решил ее усовершенствовать, ведь изначально она давала ход программе только при нажатии левой кнопки мыши. Я решил расширить ее возможности, добавив отклик на остальные клавиши.
Вот что было:


А вот что стало:


Собственно баг состоит вот в чем: Процедура приостанавливает программу как в консольном, так и в графическом режиме. Но! Откликается на клавиши мыши только в консольном. Объявление функций очевидно правильное, ибо компилятор ошибок не выдает. Поясните мне, неграмотному, глупому и недостойному рукожопу, что я написал не так?

Добавлено (20.05.2016, 18:39)
---------------------------------------------
Как было:

Sub WaitMouse() Export
Dim but As Byte
Dim res As Integer
Dim buttons As Integer
Dim x As Integer
Dim y As Integer
Do
res = GetMouse(x_1,y_1,,buttons)
If buttons And 1 Then but = 1
Loop Until but = 1
but = 0
End Sub

Как стало:

Sub WaitMouse Alias "WaitMouse" (button As String) Export
Dim but As Byte
Dim res As Integer
Dim buttons As Integer
Dim x As Integer
Dim y As Integer
If button = "L" Or button = "R" Or button = "M" Or button = "A" Then
Do
res = GetMouse(x,y,,buttons)
Select Case button
Case "A"
If buttons And 1 Then but = 1
If buttons And 2 Then but = 1
If buttons And 4 Then but = 1
Case "R"
If buttons And 2 Then but = 1
Case "M"
If buttons And 4 Then but = 1
Case "L"
If buttons And 1 Then but = 1
End Select
Loop Until but = 1
Else
Print "Error, you must use 'R', 'L', 'M', or 'A' as argument in WaitMouse()"
End If
End Sub

Почему то спойлеры сработали как то странно. Может конечно я такой рукожоп.


Сообщение отредактировал ExE - Пятница, 20.05.2016, 18:41
 
haavДата: Пятница, 20.05.2016, 19:27 | Сообщение # 2
Генерал-лейтенант
Группа: Администраторы
Сообщений: 793
Репутация: 34
Статус: Offline
попробуй так:

Код
Screen 1

Sub WaitMouse Alias "WaitMouse" (button As String) Export
    Dim but As Byte
    Dim res As Integer
    Dim buttons As Integer
    Dim x As Integer
    Dim y As Integer
    If button = "L" Or button = "R" Or button = "M" Or button = "A" Then
  Do
   res = GetMouse(x,y,,buttons)
   If res = 0 Then ' если функция отработала нормально
    Select Case button
     Case "A"
      If buttons And 1 Then but = 1
      If buttons And 2 Then but = 1
      If buttons And 4 Then but = 1
     Case "R"
      If buttons And 2 Then but = 1
     Case "M"
      If buttons And 4 Then but = 1
     Case "L"
      If buttons And 1 Then but = 1
    End Select
   EndIf
  Loop Until but = 1
    Else
  Print "Error, you must use 'R', 'L', 'M', or 'A' as argument in WaitMouse()"
    End If
End Sub

WaitMouse("R")
? "OK"
sleep


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
ExEДата: Пятница, 20.05.2016, 20:17 | Сообщение # 3
Сержант
Группа: Пользователи
Сообщений: 21
Репутация: 0
Статус: Offline
Цитата haav ()
попробуй так:
Попробовал, работает! Я вижу, баг разрешился с добавлением условия, что мышь находится внутри окна программы (т.е. выдает ноль, а не -1)? В таком случае, почему не работал мой код? Ведь программа должна постоянно обновлять данные с мыши, разве нет? А на значение -1 и вовсе не обращать внимания, и начинать цикл заново, или я что то не понимаю? Можешь пояснить?
 
haavДата: Пятница, 20.05.2016, 21:25 | Сообщение # 4
Генерал-лейтенант
Группа: Администраторы
Сообщений: 793
Репутация: 34
Статус: Offline
Цитата ExE ()
Попробовал, работает! Я вижу, баг разрешился с добавлением условия, что мышь находится внутри окна программы (т.е. выдает ноль, а не -1)? В таком случае, почему не работал мой код? Ведь программа должна постоянно обновлять данные с мыши, разве нет? А на значение -1 и вовсе не обращать внимания, и начинать цикл заново, или я что то не понимаю? Можешь пояснить?


Я понимаю твою логику: ты думаешь, что если ты передал в функцию параметр buttons, то после некорректного выполнения функции данный параметр не меняется и должен содержать ноль. Ну во первых параметр buttons передается по ссылке, то есть значение переменной buttons может изменяться в функции. А во вторых, GetMouse имеет свою определенную логику работы. Посмотри на ее внутренности:

Код
int fb_GfxGetMouse(int *x, int *y, int *z, int *buttons, int *clip)
{
    int failure = TRUE;
    int temp_z, temp_buttons, temp_clip;

    FB_GRAPHICS_LOCK( );

    if (!z)
  z = &temp_z;
    if (!buttons)
  buttons = &temp_buttons;
    if (!clip)
  clip = &temp_clip;
    if ((__fb_gfx) && (__fb_gfx->driver->get_mouse)) {
  DRIVER_LOCK();
  failure = __fb_gfx->driver->get_mouse(x, y, z, buttons, clip);
  DRIVER_UNLOCK();
    }

    FB_GRAPHICS_UNLOCK( );

    if (failure) {
  *x = *y = *z = *buttons = *clip = -1;
  return fb_ErrorSetNum(FB_RTERROR_ILLEGALFUNCTIONCALL);
    }
    return fb_ErrorSetNum( FB_RTERROR_OK );
}


Обрати внимание на строчки:

    
Код
if (failure) {
  *x = *y = *z = *buttons = *clip = -1;
  return fb_ErrorSetNum(FB_RTERROR_ILLEGALFUNCTIONCALL);
    }


То есть , если ошибка в работе функции (неважно какая: системная или пользовательская) , то в buttons заносится -1 . Поэтому сравнения:

      
Код
If buttons And 1 Then but = 1
      If buttons And 2 Then but = 1
      If buttons And 4 Then but = 1


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


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
ExEДата: Пятница, 20.05.2016, 21:55 | Сообщение # 5
Сержант
Группа: Пользователи
Сообщений: 21
Репутация: 0
Статус: Offline
Цитата haav ()
Я понимаю твою логику: ты думаешь, что если ты передал в функцию параметр buttons, то после некорректного выполнения функции данный параметр не меняется и должен содержать ноль. Ну во первых параметр buttons передается по ссылке, то есть значение переменной buttons может изменяться в функции. А во вторых, GetMouse имеют свою определенную логику работы. Посмотри на ее внутренности:
Честно говоря, во внутренностях я ничего не понимаю.  lol Кроме того что мой мозг не способен с первого раза адекватно воспринять этот код, (я гуманитарий, и столько абстрактных символов для меня СЛОЖНА), так там еще и множество указателей, смысл которых даже из твоего гайда я не очень понял, а затем забил на них, до поры пока не пригодятся.

Я попытался поломать мозг над этим, почему да как, но то ли это на ночь глядя не думается, то ли я такой даун, но я решил просто принять пока на веру, что если функция выдает ошибку, то она выдает ИСТИНА всегда. Завтра попробую еще раз глянуть.

Лан, спасибо, сам бы никогда не догадался.
 
n99_ruДата: Суббота, 18.06.2016, 23:05 | Сообщение # 6
Рядовой
Группа: Пользователи
Сообщений: 4
Репутация: 0
Статус: Offline
Мне не дало создать тему, напишу здесь.

Всем привет,

интересует работа с изображениями, самый простой, по возможности, способ (ВинАпи?)

Пытался "приручить" FbPng -

C:/FreeBasic/bin/win32/ld.exe: cannot find -lfbpng
C:/FreeBasic/bin/win32/ld.exe: cannot find -lz

Пытался использовать Jpeg4FB -

undefined reference to `JPEG2SCREEN@12'

lz.a это часть MinGW, который я даже установить толком не смог..

Также, вопрос по выводу TTF шрифтов, кроме как способ приведенный на http://www.freebasic.net/forum/viewtopic.php?t=23343,
существует ли нормальный способ это сделать? (в примере, ладно что inline asm, оно не понимает русского, и замена Times New Roman на название с добавлением Cyr не помогает).

Спасибо за ответы и ваше время.


Сообщение отредактировал n99_ru - Суббота, 18.06.2016, 23:06
 
haavДата: Воскресенье, 19.06.2016, 07:09 | Сообщение # 7
Генерал-лейтенант
Группа: Администраторы
Сообщений: 793
Репутация: 34
Статус: Offline
Привет n99_ru!

Цитата
Мне не дало создать тему, напишу здесь.


Что значит не дало, другие же создают темы без проблем. Никаких ограничений на данное действие нет.

Цитата n99_ru ()
C:/FreeBasic/bin/win32/ld.exe: cannot find -lfbpng
C:/FreeBasic/bin/win32/ld.exe: cannot find -lz


Компилятор не находит библиотеки:
1) libz.a
2) libfbpng.a и связанные с ней другие библиотеки

Выход: положить в папку с исходным кодом данные библиотеки, либо положить в папку с компилятором в \lib\win32.

Цитата
Также, вопрос по выводу TTF шрифтов, кроме как способ приведенный на http://www.freebasic.net/forum/viewtopic.php?t=23343,
существует ли нормальный способ это сделать?


Самый лучший способ использовать библиотеку xfont

Чтобы не заморачиваться, скачай мою сборку. Распакую в любое место на жестком диске. Там все настроено и ты сможешь легко использовать fbpng, zlib и многие другие библиотеки. Так же сможешь использовать библиотеку xfont для работы со шрифтами. Даже если тебе не понравится сборка, просто посмотри как там все настроено в плане библиотек, проанализируй и сделай примерно так же у себя. Примеры xfont , zlib, fbpng и многие другие лежат в папке examples. Поначалу , пока не разобрался, запускай примеры в редакторе FbEdit , который идет в сборке. Сам редактор связан с компилятором , идущим так же в сборке, так что практически все примеры , интересующие тебя должны запуститься.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
n99_ruДата: Воскресенье, 19.06.2016, 10:39 | Сообщение # 8
Рядовой
Группа: Пользователи
Сообщений: 4
Репутация: 0
Статус: Offline
Большое спасибо!

Темы не дает создавать, потому что менее 3х сообщений написано.

Насчет .a файлов, понятно что их подложить было нужно, вопрос был где этих красавцев найти/скачать. :)

Примеры находил в штатной поставке, но что-то не задавалось. FbPNG/Jpeg качал с http://free-basic.ru/download.html

Еще раз - благодарность smile
 
WQДата: Воскресенье, 19.06.2016, 13:20 | Сообщение # 9
Подполковник
Группа: Пользователи
Сообщений: 139
Репутация: 5
Статус: Offline
Вот что плохо во Freebasic, так работа с изображениями не расписана для новичков, одни библиотеки есть в стандартном архиве, других нет, описания, что нужно использовать, нет. Для win - какие-то библиотеки есть, для linux - нет

Если только нужно загружать jpg, png, bmp, подойдет эта библиотека:
http://www.freebasic.net/forum/viewtopic.php?f=14&t=24105

Не знаю, почему автор ее скомпилировл только как dll, я лично себе переделал как .a файл
Прекрасно работает как под Win и linux, и размер самый маленький
Добавили бы, что ли, в стандартный архив
Еще можно пример посмотреть отсюда http://freebasic.ucoz.com/forum/18-314-1
DevIL вещь хорошая, но размер кода не радует, да и под linux завести не удалось

А так я себе собрал универсальную функцию для Win и linux, загружающую jpg, png, bmp, gif, tiff  с нужной высотой и шириной, и пути с юникодом поддерживает.
Чистый код после упаковки upx - 350кб, и большая часть - для чтения tiff
Будет время - оформлю как нужно и выложу архив.


Сообщение отредактировал WQ - Воскресенье, 19.06.2016, 13:24
 
n99_ruДата: Воскресенье, 19.06.2016, 15:26 | Сообщение # 10
Рядовой
Группа: Пользователи
Сообщений: 4
Репутация: 0
Статус: Offline
Вам тоже спасибо. FBImage оказался легкоюзабельным (легко-собирабельным).

Png, недалеко я так понял ушел от Bmp, и ничто не мешает его грузить вручную, разбирая заголовок.

Вопрос по нормальному выводу TrueType через тот же GDI (верно понимаю?) остается открытым.

Чтобы как белый человек, взять и использовать штатные Courier, Arial, Times из штатной поставки Windows.


Сообщение отредактировал n99_ru - Воскресенье, 19.06.2016, 15:33
 
haavДата: Воскресенье, 19.06.2016, 15:30 | Сообщение # 11
Генерал-лейтенант
Группа: Администраторы
Сообщений: 793
Репутация: 34
Статус: Offline
Цитата n99_ru ()
Темы не дает создавать, потому что менее 3х сообщений написано.


Раньше такого не было, видать юкоз обновлял движок и внес такую фичу. Сейчас исправил это, надеюсь впредь такого не случится.

Цитата n99_ru ()
Насчет .a файлов, понятно что их подложить было нужно, вопрос был где этих красавцев найти/скачать


Так вроде все более-менее нормальные библиотеки я выкладывал на своем сайте. Если чего-то нет, может есть в моей сборке. Или искать по оф. сайтам, и компилировать (если конечно умеешь это делать)


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
haavДата: Воскресенье, 19.06.2016, 15:32 | Сообщение # 12
Генерал-лейтенант
Группа: Администраторы
Сообщений: 793
Репутация: 34
Статус: Offline
Цитата n99_ru ()
Чтобы как белый человек, взять и использовать штатные Courier, Arial, Times из штатной поставки Windows.


Ну так я предложил библиотеку xFont, чем не нравится?


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
n99_ruДата: Воскресенье, 19.06.2016, 15:35 | Сообщение # 13
Рядовой
Группа: Пользователи
Сообщений: 4
Репутация: 0
Статус: Offline
Насколько я понял, XFont работает только со своим форматом шрифтов, XF.
 
haavДата: Воскресенье, 19.06.2016, 15:40 | Сообщение # 14
Генерал-лейтенант
Группа: Администраторы
Сообщений: 793
Репутация: 34
Статус: Offline
Цитата n99_ru ()
Насколько я понял, XFont работает только со своим форматом шрифтов, XF.


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


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
WQДата: Среда, 10.08.2016, 22:07 | Сообщение # 15
Подполковник
Группа: Пользователи
Сообщений: 139
Репутация: 5
Статус: Offline
Из имеющегося писать строки можно или средствами WinApi (по ссылке там с freebasic.net вполне нормальный пример)
или, действительно, использовать XFont для заранее известных шрифтов,
или использовать библиотеку FreeType на низком уровне ( примеры char.bas и drawstr.bas из стандартного архива папка с FreeBASIC\examples\graphics\FreeType )
или библиотеку Cairo (под win нужно несколько мегабайт dll)
или использовать средства библиотек создания интерфейсов (хотя там обычно тоже все через FreeType
)

У каждого метода свои достоинства и недостатки, зависит от задачи

Добавлено (10.08.2016, 22:07)
---------------------------------------------
На счет библиотеки FBImage для загрузки картинок
Здесь

http://www.freebasic.net/forum/viewtopic.php?f=14&t=24909

D.J.Peters обновил примеры к библиотеке TinyGL, и там в архиве (1 сообщение) теперь есть статическая версияFBImage для Win и Linux
А архив в теме самой FBImage почему-то не обновил
Я не проверял ее работу, т.к. у меня есть своя несколько измененная скомпилированная статическая библиотека

haav
Не смотрел, а в твоей сборке она есть, статическая или динамическая? Если нет, то, возможно, стоит добавить в следующую сборку?


Сообщение отредактировал WQ - Среда, 10.08.2016, 22:14
 
Форум » Freebasic » Вопросы по языку FreeBasic » Почему функция не корректно работает в графическом режиме? (Неясные мне, неопытному, баги самопальной библиотеки.)
Страница 1 из 11
Поиск: