Board.KolibriOS.org

Official KolibriOS board
It is currently Mon Aug 19, 2019 4:47 am

All times are UTC+03:00




Post new topic  Reply to topic  [ 104 posts ]  Go to page Previous 13 4 5 6 7 Next
Author Message
PostPosted: Fri Dec 18, 2015 9:08 am 
Offline

Joined: Sat Nov 14, 2015 11:15 am
Posts: 299
Code:
// функция 2 получить код нажатой клавиши
bool kos_GetKey( Byte &keyCode )
{
   Dword result;
   //
   __asm
   {
      push edx
getkey:
      mov  eax,2 ; Gluk
      int  0x40
      cmp eax,1
      jne getkeyi
      mov ah,dh
      jmp getkeyii
getkeyi:
      mov dh,ah ; Gluk
      jmp getkey
getkeyii:
      pop edx
      mov result, eax
   }
   //
   keyCode = result >> 8;
   //
   return ( result & 0xFF ) == 0;
}

Я Си знаю плохо, поверхностно, но насколько я понял, что в данном случае результат возвращается и через саму функцию kos_GetKey и через "байт в скобках" ( Byte &keyCode ). Я такого никогда не делал (хотя знаю, что это вполне допустимо), для меня подобное выгладит дико! Т.е. в моём понимании, функцию используют, только для получения(возвращения) одного единственного параметра, через имя самой функции. В остальных случаях, применяется процедура.
Поэтому в данном случае должно быть либо две функции
bool GetKeyStatus и Byte GetKeyCode (надеюсь правильно написал для СИ)
либо одной процедурой GetKey (bool Status ,Byte KeyCode) (надеюсь правильно написал для СИ) где Status и KeyCode могут быть использованный как для входных и возвращающихся данных из процедуры.
Считаю нормальным возврат из функции в виде структуры (записи) содержащей в себе поля Status и KeyCode, но в данном случае, это неудобно да и не нужно! Не тот случай!


Top
   
PostPosted: Fri Dec 18, 2015 2:26 pm 
Offline
Mentor/Kernel Developer
User avatar

Joined: Thu Mar 26, 2015 5:16 pm
Posts: 1264
Подожди, названия ещё не утвердили.
Зачем функции? KOSfuncs.h можно сделать в виде макросов.


Top
   
PostPosted: Fri Dec 18, 2015 4:39 pm 
Offline

Joined: Sat Nov 14, 2015 11:15 am
Posts: 299
Pathoswithin wrote:
Подожди, названия ещё не утвердили.

Хорошо! Сообщайте когда утвердите!
Pathoswithin wrote:
Зачем функции? KOSfuncs.h можно сделать в виде макросов.

В виде макросов, говоришь!?.... :-) в виде таких макросов на который нарвался я ?! :D :lol:


Top
   
PostPosted: Fri Dec 18, 2015 6:10 pm 
Offline

Joined: Sun Aug 09, 2015 3:41 pm
Posts: 112
Обертки делай в виде функций.
В Си нет процедур. Для возврата нескольких значений из функции используется передача параметров по ссылке, т.е. с указанием операции взятия адреса & перед именем параметра. Либо возврат структуры, объекта, указателя через return.


Top
   
PostPosted: Fri Dec 18, 2015 6:20 pm 
Offline

Joined: Thu Jan 26, 2006 8:47 pm
Posts: 284
Ray wrote:
Для возврата нескольких значений из функции используется передача параметров по ссылке, т.е. с указанием операции взятия адреса & перед именем параметра

Увы, это возможно для C++, но не для C. А вот передача параметров по указателю более универсальная


Top
   
PostPosted: Fri Dec 18, 2015 7:56 pm 
Offline
Kernel Developer
User avatar

Joined: Thu Sep 03, 2009 1:52 pm
Posts: 1620
ALEXS1983 wrote:
Я Си знаю плохо, поверхностно, но насколько я понял, что в данном случае результат возвращается и через саму функцию kos_GetKey и через "байт в скобках" ( Byte &keyCode ). Я такого никогда не делал (хотя знаю, что это вполне допустимо), для меня подобное выгладит дико! Т.е. в моём понимании, функцию используют, только для получения(возвращения) одного единственного параметра, через имя самой функции. В остальных случаях, применяется процедура.
Поэтому в данном случае должно быть либо две функции
bool GetKeyStatus и Byte GetKeyCode (надеюсь правильно написал для СИ)
либо одной процедурой GetKey (bool Status ,Byte KeyCode) (надеюсь правильно написал для СИ) где Status и KeyCode могут быть использованный как для входных и возвращающихся данных из процедуры.
Считаю нормальным возврат из функции в виде структуры (записи) содержащей в себе поля Status и KeyCode, но в данном случае, это неудобно да и не нужно! Не тот случай!

А что, в дельфи уже нельзя написать function GetKey(var keyCode: byte): boolean; или как оно там?
Эта функция достаёт очередную клавишу из очереди, продвигая при этом очередь, и возвращает признак успеха: true, если получилось, и false, если нет. Если ты предлагаешь две функции, ты просто не понимаешь, что происходит.

_________________
Сделаем мир лучше!


Top
   
PostPosted: Fri Dec 18, 2015 8:17 pm 
Offline
Mentor/Kernel Developer
User avatar

Joined: Thu Mar 26, 2015 5:16 pm
Posts: 1264
Хорошо, тогда... функции versus макросы.

Код макросов будет выглядеть так:

push ebx
mov eax, funcNumber
mov ebx, subFuncNumber
mov ecx, [a]
mov edx, [b]
int 40h
mov [c], eax
mov [d], ebx
pop ebx

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

push d
push c
push [b]
push [a]
call funcName

но в программу будет включатся код функции (всех функций подключаемого файла, насколько я понимаю), который соответствует коду макроса.


Top
   
PostPosted: Fri Dec 18, 2015 8:21 pm 
Offline
Kernel Developer
User avatar

Joined: Thu Sep 03, 2009 1:52 pm
Posts: 1620
ALEXS1983 wrote:
(Вот только жаль функции нельзя присвоить в том массив процедур, и отдельный массив функций нельзя создать, в частности в Дельфи7)

Что, правда нельзя? В Си - запросто:
Code:
typedef unsigned char Byte; // Byte = unsigned char
typedef Byte (*MyFunctionType)(void); // MyFunctionType = pointer to any function that takes no parameters and returns Byte
MyFunctionType funcArray[201];
Byte Test(void) { return 42; }
funcArray[3] = &Test;

Только это неприменимо к данной теме. Массивы подразумевают, что все их элементы однотипны, а системные функции принимают и возвращают сильно разное число аргументов сильно разных типов.

_________________
Сделаем мир лучше!


Top
   
PostPosted: Fri Dec 18, 2015 8:55 pm 
Offline
Kernel Developer
User avatar

Joined: Thu Sep 03, 2009 1:52 pm
Posts: 1620
SF_AUDIO -> SF_PC_SPEAKER. Нормальное аудио совсем не здесь.
SF_SERVISES -> SF_SYS_SERVICE. Хотя с учётом разнообразия подфункций это скорее даже SF_MISC, miscellaneous.
Названия SSF_* порой слишком общие. SSF_MAP? Для фонового рисунка? Что, если в файловой системе появится операция map типа mmap/MapViewOfFile?
В APLLY опечатка, в SSF_КX_PACKET_COUNT русская К вместо R, если используется форма прошедшего времени received, а не начальная receive, то должно быть и sent вместо send.

_________________
Сделаем мир лучше!


Top
   
PostPosted: Fri Dec 18, 2015 9:34 pm 
Offline
Mentor/Kernel Developer
User avatar

Joined: Thu Mar 26, 2015 5:16 pm
Posts: 1264
Quote:
должно быть и sent вместо send
Надо же, из документации копипастил...
Quote:
Названия SSF_* порой слишком общие
Ну одно короткое имя вполне может быть, а уже следующее придётся делать более конкретным. Если такой подход тебя не устраивает, то какие удлинять? Все из одного слова?


Top
   
PostPosted: Sun Dec 20, 2015 12:29 am 
Offline

Joined: Sat Nov 14, 2015 11:15 am
Posts: 299
CleverMouse wrote:
А что, в дельфи уже нельзя написать function GetKey(var keyCode: byte): boolean; или как оно там?

Да писать то можно! Но я же говорю, что выглядит это дико! Я сколько пересматривал примеров и частей кода по дельфи, не помню, чтобы мне такое попадалось на глаза!
Ну да ладно!... :-) Принимайте "в печать"! Пусть будет!


Top
   
PostPosted: Mon Dec 21, 2015 2:40 pm 
Offline
Mentor/Kernel Developer
User avatar

Joined: Thu Mar 26, 2015 5:16 pm
Posts: 1264
Ладно, тогда вот так.


Top
   
PostPosted: Tue Dec 22, 2015 7:54 pm 
Offline
Mentor/Kernel Developer
User avatar

Joined: Thu Mar 26, 2015 5:16 pm
Posts: 1264
revision #6000
Названия утверждены. Теперь можно делать стандартный KOSfuncs.h для сей.


Top
   
PostPosted: Sun Jan 03, 2016 10:10 pm 
Offline

Joined: Sat Nov 14, 2015 11:15 am
Posts: 299
Pathoswithin wrote:
revision #6000
Названия утверждены. Теперь можно делать стандартный KOSfuncs.h для сей.

Ну и ?!..... Чего ждём ?! :-) Окончания новогодних праздников ? :-)
Или зачинщика который этим займётся ?! :-)
Могу заняться. Но... для дельфи, а после "перевести" программкой "Delphi2Cpp" на Си, так пойдёт ? Пробное кидать ?


Top
   
PostPosted: Sun Jan 03, 2016 11:21 pm 
Offline

Joined: Tue Apr 12, 2011 11:19 pm
Posts: 1150
Кидай, просто список имен, без реализации. Как утвердятся имена, можно будет и заголовочные файлы переписывать.

_________________
я лишь учусь


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 104 posts ]  Go to page Previous 13 4 5 6 7 Next

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 2 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited