purebasic.info

PureBasic forum
Текущее время: Чт янв 17, 2019 1:44 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 29 ]  На страницу Пред.  1, 2
Автор Сообщение
СообщениеДобавлено: Пт янв 11, 2019 9:40 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6438
Благодарил (а): 21 раз.
Поблагодарили: 204 раз.
Пункты репутации: 52
Gregory писал(а):
Сергейчик писал(а):
Kallback переводиться как перерезвоните
При таком написании переводится очень неприлично. :lol:

Да уж :lol:
Kallback

_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пт янв 11, 2019 11:05 pm 
Не в сети
док

Зарегистрирован: Чт окт 27, 2011 7:43 pm
Сообщений: 111
Откуда: Санкт-Ленинград
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
repeat писал(а):
MIDIin это MidiInProc
Тогда уж скорее midiInMessage.
Т.е. это тоже API-функции?
А почему у них тогда можно имена изменять, и без нижнего подчёркивания?
Что-то вместо понимания, наоборот отупение приходит. :lol:

_________________
ICQ нет, и, в ближайшее время, не будет


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб янв 12, 2019 12:22 am 
Не в сети
профессор

Зарегистрирован: Сб фев 06, 2016 6:18 pm
Сообщений: 283
Благодарил (а): 14 раз.
Поблагодарили: 33 раз.
Пункты репутации: 0
Gregory писал(а):
А почему у них тогда можно имена изменять, и без нижнего подчёркивания?
Потому, что это не Windows API а Procedure (PureBasic). А имена можно менять и в api:
Код:
1
2
3
4
5
6
7
8
9
Beep_(200, 300)
 
Delay(200)
 
Import "kernel32.lib"
  Test(dwFreq.l, dwDuration.l) As "_Beep@8"
EndImport
 
Test(200, 300)



Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб янв 12, 2019 1:41 pm 
Не в сети
док

Зарегистрирован: Чт окт 27, 2011 7:43 pm
Сообщений: 111
Откуда: Санкт-Ленинград
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
repeat писал(а):
Потому, что это не Windows API а Procedure (PureBasic)
Но выше же вроде обратное говорили (и ссылку давали). :roll:

_________________
ICQ нет, и, в ближайшее время, не будет


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб янв 12, 2019 7:54 pm 
Не в сети
профессор

Зарегистрирован: Сб фев 06, 2016 6:18 pm
Сообщений: 283
Благодарил (а): 14 раз.
Поблагодарили: 33 раз.
Пункты репутации: 0
Gregory писал(а):
Но выше же вроде обратное говорили (и ссылку давали). :roll:
Gregory писал(а):
запускает процедуру MIDIin
repeat писал(а):
MIDIin это MidiInProc а MidiInProc уже определена. вот
А в вот написано:
Цитата:
MidiInProc is a placeholder for the application-supplied function name.
:roll:


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб янв 12, 2019 9:35 pm 
Не в сети
док

Зарегистрирован: Чт окт 27, 2011 7:43 pm
Сообщений: 111
Откуда: Санкт-Ленинград
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
repeat писал(а):
MIDIin это MidiInProc
Ну, судя по параметрам, это - всё-таки midiInMessage.
Так и вот как понять, какую функцию использовать?
Или можно любую?

_________________
ICQ нет, и, в ближайшее время, не будет


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб янв 12, 2019 9:43 pm 
Не в сети
профессор

Зарегистрирован: Сб фев 06, 2016 6:18 pm
Сообщений: 283
Благодарил (а): 14 раз.
Поблагодарили: 33 раз.
Пункты репутации: 0
Gregory писал(а):
Или можно любую?
можно любую :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб янв 12, 2019 10:03 pm 
Не в сети
док

Зарегистрирован: Чт окт 27, 2011 7:43 pm
Сообщений: 111
Откуда: Санкт-Ленинград
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
repeat писал(а):
можно любую
Краткость, конечно, сестра кое-кого (или чего), но не настолько же. :lol:
"Любую" из чего?

_________________
ICQ нет, и, в ближайшее время, не будет


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс янв 13, 2019 12:48 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11360
Благодарил (а): 4 раз.
Поблагодарили: 445 раз.
Callback это не WinAPI функция, а функция/процедура определенная в коде. Не зря же ее адрес нужно передать вызываемой функции, например midiInOpen, а раз так что имя у callback может быть любым. В данном случае функция вызывается не по имени, а по адресу.
Простой пример.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Procedure CB(Param1, Param2)
  Res = 0
 
  If Param2<=10
    Res = 1
    Debug Param2
  EndIf
 
  ProcedureReturn Res
EndProcedure
 
 
Procedure MyFunct(*AdrCB, Param)
  If *AdrCB
   
    x=Param
    Repeat
      If CallFunctionFast(*AdrCB, Param, x) = 0
        Break
      EndIf
      x+1
    ForEver
   
  EndIf
EndProcedure
 
 
MyFunct(@CB(), 2)

Представьте что функция MyFunct() это WinAPI функция и она находится где-то в системных DLL. Она ничего не знает об имени callback, а знает только ее адрес, число аргументов и что в них нужно передавать.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс янв 13, 2019 12:20 pm 
Не в сети
док

Зарегистрирован: Чт окт 27, 2011 7:43 pm
Сообщений: 111
Откуда: Санкт-Ленинград
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр писал(а):
знает только ее адрес, число аргументов и что в них нужно передавать
Так вот с аргументами я и пытаюсь разобраться.
Если сведения об аргументах содержатся в самой API функции, то получается, что в роли Callback может выступать только одна единственная процедура (точнее определённый набор аргументов, при её описании).
Если же эти процедуры могут быть разными, то как функция определяет, какой надо использовать?

_________________
ICQ нет, и, в ближайшее время, не будет


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс янв 13, 2019 12:32 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11360
Благодарил (а): 4 раз.
Поблагодарили: 445 раз.
Функции известен лишь адрес. Если у callback несоответствие аргументов, получим ошибку.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Procedure CB(Param1, Param2, Param3, Param4)
  Res = 0
 
  If Param2<=10
    Res = 1
    Debug Param2
  EndIf
 
  ProcedureReturn Res
EndProcedure
 
 
Procedure MyFunct(*AdrCB, Param)
  If *AdrCB
   
    x=Param
    Repeat
      If CallFunctionFast(*AdrCB, Param, x) = 0
        Break
      EndIf
      x+1
    ForEver
   
  EndIf
EndProcedure
 
 
MyFunct(@CB(), 2)


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс янв 13, 2019 1:16 pm 
Не в сети
док

Зарегистрирован: Чт окт 27, 2011 7:43 pm
Сообщений: 111
Откуда: Санкт-Ленинград
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр писал(а):
Если у callback несоответствие аргументов, получим ошибку.
Ну, т.е. можно использовать только определённый набор аргументов.
По указанной выше ссылке сказано, что в качестве Callback для midiInOpen должна использоваться MidiInProc callback function, а в приведённом примере набор аргументов указывает на midiInMessage function, которая вроде как и callback function не является.
Где "собака порылась"?
Пример неправильный?
Но ошибки, вроде, не выдаёт... :roll:

_________________
ICQ нет, и, в ближайшее время, не будет


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс янв 13, 2019 1:35 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11360
Благодарил (а): 4 раз.
Поблагодарили: 445 раз.
Gregory писал(а):
Ну, т.е. можно использовать только определённый набор аргументов.
В x86 при вызове типа stdcall аргументы передаются через стек и если их будет больше или меньше (и в некоторых случаях если не соответствует тип), содержимое стека сместится и например возврат из функции произойдет по неправильному адресу что приведет к ошибке.

Gregory писал(а):
По указанной выше ссылке сказано, что в качестве Callback для midiInOpen должна использоваться MidiInProc callback function, а в приведённом примере набор аргументов указывает на midiInMessage function
Чем указывает? В MidiInProc 5 аргументов, в midiInMessage 4 аргумента. Типы аргументов отличаются.

Gregory писал(а):
Но ошибки, вроде, не выдаёт
Код:
1
midiInOpen_(0, 0, @midiInMessage_(), 0, 0)

Точно нет ошибки?

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс янв 13, 2019 7:17 pm 
Не в сети
док

Зарегистрирован: Чт окт 27, 2011 7:43 pm
Сообщений: 111
Откуда: Санкт-Ленинград
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр писал(а):
Чем указывает? В MidiInProc 5 аргументов, в midiInMessage 4 аргумента. Типы аргументов отличаются.
Так вот процедура MIDIin как-раз имеет 4 аргумента с соответствующим типом.

Пётр писал(а):
Точно нет ошибки?
Имелось ввиду ошибки компиляции.
Поскольку нет входных миди-портов, функция возвращает не #MMSYSERR_NOERROR, с выдачей соответствующего окна.

_________________
ICQ нет, и, в ближайшее время, не будет


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 29 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB