взаимодействие с системой

Предыдущая тема Следующая тема Перейти вниз

взаимодействие с системой

Сообщение  Eric-S в Вт Окт 07, 2008 7:50 am

Программа должна и может взаимодействовать с окружением и система важная часть.


введение

Тема эта обширна, но не так сложна, как могло бы показаться.

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

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

Но на прикладном уровне программирования, ещё со времён dos'а понятие "работа с системой" несколько уже.
Именно в рамках этого мы и будем говорить о системе.

Здесь и далее, под "системой" понимаеться "операционная система", которая управляет файлами на диске, запуском приложений, контролем их выполнения и взаимодействия.

Ниже я буду рассказывать о системах вообщем и ms-dos в частности, поскольку это наиболее наглядно.
В linux или windows всё это тоже есть, хотя может быть скрыто от неискушенного пользователя.


аргументы командной строки

Когда запускаеться программа, то ей можно передать строку параметров. Например для проверки диска есть команда "chkdsk"., мы можем ей передать в качестве параметра букву диска.
Код:

chkdsk c:

Где chkdsk это имя программы, в данном случае "chkdsk.exe", а имя диска "c:" это ключ в командной строке.

Командная строка, это одна команда, которую вы ввели в консоли и нажали enter.
В командной строке, первая часть это имя программы, которую нужно запустить, при необходимости можно указать полный или относительный путь.
Вторая часть, это любой текст, который будет передан на обработку самой программе. Операционная система не обрабатывает, она только передаёт, анализ ключей это забота конкретного приложения и его разработчиков.

В командной строке есть ещё специальные символы, для конвеерной обработки данных, об этом поговорим позже. Просто нужно отметить, что не все символы могут быть переданы.


Чтобы получить всю переданную строку, или её отдельные ключи есть функция command.

command - получение аргументов коммандной строки. В качестве параметра, функции можно указать индекс нужного ключа. По умолчанию он равен (-1) и функция возвращает все параметры в одной строке.

Давайте напишем програмку "command1.bas"
Код:

print "Hello!"
print command

Компилируем а потом запускаем в консоли.
Код:

c:\freebasic\test >
c:\freebasic\test\command1 test command line keys.

вот что я получил в результате:

Hello!
test command line keys.

c:\freebasic\test >

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

Вот пример из мануала.
Код:

' разбор параметров командной строки
    Print "exe name= "; Command( 0 )

    Dim argc As Integer, argv As String

    argc = 1
    Do
        argv = Command( argc )

        If( Len( argv ) = 0 ) Then
            Exit Do
        End If

        Print "arg"; argc; " = """; argv; """"

        argc += 1
    Loop

    If( argc = 1 ) Then
        Print "(no arguments)"
    End If
    Print "The complete list: ";Command

Запускаем, и получаем:


E:\1\freebasic\test\system>command1 test command line keys.
Hello!
test command line keys.

E:\1\freebasic\test\system>command2 test command line keys.
c:\freebasic\test\ >
c:\freebasic\test\command2 test command line keys
exe name= command2
arg 1 = "test"
arg 2 = "command"
arg 3 = "line"
arg 4 = "keys."
The complete list: test command line keys.

c:\freebasic\test\ >

Если вы используете fbIde, то для тестирования вы можете задавать ключи для запуска вашей программы.
Меню run > параметры (parameters...).



другой вариант


во FreeBasic, еще есть два замечательных макроса зашитых в компилятор.
__fb_argc__- число параметров в командной строке, включая путь __fb_argv__- список указателей на параметры командной строки.

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

for i as integer = 1 to __fb_argc__ -1
поскольку число параметров отсчитывается с единицы, значит __fb_argc__, будет всегда возвращать число параметров больше на единицу, так как нулевой параметр который содержит путь, тоже считается.
__fb_argv__, возвращает список указателей на строковые параметры с завершающимся нулем типа zString. пример
Код:

dim argc as integer, argv as zstring ptr ptr 'две переменные. "argc", список параметров, "argv", указатель на список указателей на параметры командной строки.
argc=__fb_argc__ 'вернем в argc, число параметров из __fb_argc__
argv=__fb_argv__ 'вернем в argv, указатель на список
if argc = 1 then 'если всего один параметр
print"No arguments" 'пользователь не ввел параметры
end
end if

for i as integer =1 to argc - 1 'счетчик до числа параметров минус 1
print "argument";, i, "=",*argv[i] 'в квадратных скобках, выбираем указатель на параметр из списка.
next
sleep



переменные среды окружения

Переменные среды окружения (system environment variable), это несколько переменных самой системы. В командных файлах ( bat файлах ), можно работать с ними напрямую.

Чтобы создать или установить переменную команда set
Код:

set temp=c:\temp

Чтобы получить значение переменной, её имя нужно заключить в символы "%".
Код:

echo %temp%

Переменные среды нужны для лёгкого доступа к информации. В windows есть реестр, это база даныых параметров системы и программ, но использовать реестр может быть просто неудобно. А в системе ms-dos реестра ещё небыло.
Переменные среды помогали назначать временные папки и задавать другие параметры.

Environ - возвращает значение указанной переменной среды окружения.

SetEnv - изменяет значение указанной переменной среды окружения.

Код:

' установим
SetEnv "myvar=Hello, world!"
' получим
print Environ("myvar")
sleep



запуск другого приложения

Чтобы выполнить команду или запустить приложение используйте функцию shell.

Код:

print "version operating system"
shell "ver"
sleep

В моём случае результат был таков:

version operating system

Microsoft Windows XP [Версия 5.1.2600]


завершение программы

Консольные утилиты в случае ошибки завершаються и возвращают код произошедшей ошибки.
Это удобно для пакетной обработки.

В командном файле можно проверить код условием if errorlevel ...
Код:

if errorlevel 1 goto errhandle

Код ошибки будет записан в переменную окружения "errorlevel".

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

end - функция завершает программу. В качестве параметра можно указать число, которое будет передано системе как код завершения.

Код:

print "Hello!"
end 666

Если вы используете fbIde, то вы можете посмотреть код, активизировав функцию в меню run > показать код завершения (show exit code).


Последний раз редактировалось: Eric-S (Чт Окт 09, 2008 2:34 am), всего редактировалось 2 раз(а)

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 34
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: взаимодействие с системой

Сообщение  electrik в Вт Окт 07, 2008 9:33 pm

привет. во FreeBasic, еще есть два замечательных макроса зашитых в компилятор.
"__fb_argc__"- число параметров в командной строке, включая путь
"__fb_argv__"- список указателей на параметры командной строки.
пример программы "test":
код:
dim argc as integer, argv as zstring ptr ptr
argc=__fb_argc__
argv=__fb_argv__
if argc = 1 then
print"No arguments"
end
end if

for i as integer =1 to argc - 1
print "argument";, i, "=",*argv[i]
next
sleep

в командной строке пишу:
test.exe 123 jfw 765 exe

наэкране:
argument 1 = 123
argument 2 = jfw
argument 3 = 765
argument 4 = exe

и в бинарнике меньше занимает

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 37
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: взаимодействие с системой

Сообщение  Eric-S в Ср Окт 08, 2008 1:26 am

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

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 34
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: взаимодействие с системой

Сообщение  electrik в Ср Окт 08, 2008 6:05 pm

ну я даже незнаю как это подробней описать. все понятно, "__fb_argc__", возвращает число параметров в командной строке, включая нулевой. если "__fb_argc__" вернул значение 3, и если мы не хотим обрабатывать нулевой параметр, а только введенные пользователем, тогда в цикле обработки мы должны указать:
for i as integer = 1 to __fb_argc__ -1
поскольку число параметров отсчитывается с единицы, значит "__fb_argc__", будет всегда возвращать число параметров больше на единицу, так как нулевой параметр который содержит путь, тоже считается.
"__fb_argv__", возвращает список указателей на строковые параметры с завершающимся нулем типа zString. пример:
код:
dim argc as integer, argv as zstring ptr ptr 'две переменные. "argc", список параметров, "argv", указатель на список указателей на параметры командной строки.
argc=__fb_argc__ 'вернем в argc, число параметров из __fb_argc__
argv=__fb_argv__ 'вернем в argv, указатель на список
if argc = 1 then 'если всего один параметр
print"No arguments" 'пользователь не ввел параметры
end
end if

for i as integer =1 to argc - 1 'счетчик до числа параметров минус 1
print "argument";, i, "=",*argv[i] 'в квадратных скобках, выбираем указатель на параметр из списка.
next
sleep

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

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 37
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: взаимодействие с системой

Сообщение  Eric-S в Чт Окт 09, 2008 2:06 am

Да, Электрик, ты прав на счёт выпытыванья.
Пока на своей жопе не прочувствуешь все ошибки фиг чего поймёшь.
Но есть и удачные книги где изложено в доступной форме.
А эта книга у нас интерактивная, и в неё будут вноситься изменения, пока она не станет идеальной. Т.е. по сути тоже самое выпытывание.

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

Берёться план, к примеру такой:

1. заголовок.
2. что это и на кой надо.
3. описание функций.
4. пример программы.
5. разъяснение тонких мест и результата работы программы.
6. ньюансы функций, трудные места.
7. заключение, что ты думаешь, о том, что написал.

Это как заполнение формы на сайте, вбил все нужные данные и жми "далее".

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

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 34
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: взаимодействие с системой

Сообщение  Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения