Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Nick4
Зарегистрирован: 15.10.2011 Сообщения: 95
|
Добавлено: Пн Авг 18, 2014 4:40 pm Заголовок сообщения: Инициализация массива |
|
|
Подскажите, есть какая либо возможность записать данные в массив одной строчкой, как функция array() в VBA? |
|
Вернуться к началу |
|
|
thegeo
Зарегистрирован: 17.01.2012 Сообщения: 119
|
Добавлено: Пн Авг 18, 2014 8:45 pm Заголовок сообщения: |
|
|
Можно написать свою функцию, что-то типа
Function toArray(byval str as string,ar() as float)
где str строка с данными, например "12.51,0.45,31.2,11.98",
а ar соответствующий массив-результат. |
|
Вернуться к началу |
|
|
Nick4
Зарегистрирован: 15.10.2011 Сообщения: 95
|
Добавлено: Ср Авг 20, 2014 2:23 pm Заголовок сообщения: |
|
|
Я так и сделал, только в теле основной программы. Не знал (и в описании нигде не указано), что в качестве параметров можно задавать массив с пустой размерностью. |
|
Вернуться к началу |
|
|
FedorinoFF
Зарегистрирован: 01.02.2007 Сообщения: 272 Откуда: Санкт-Петербург
|
Добавлено: Чт Авг 21, 2014 7:54 am Заголовок сообщения: |
|
|
Nick4 писал(а): |
Я так и сделал, только в теле основной программы. Не знал (и в описании нигде не указано), что в качестве параметров можно задавать массив с пустой размерностью. |
Надеюсь, документацию по MapBasic читали?
Раздел справки "Оператор Sub...End Sub":
....
Sub-процедура может обрабатывать массивы. В списке параметров массив объявляется с помощью пустых скобок, следующих за именем переменной. В следующем примере в процедуре "ListProcessor" объявлен в качестве параметра массив целых величин "items".
Sub ListProcessor(items() As Integer)
При вызове такой процедуры оператором Call параметром вызова должно быть имя массива переменных целого типа без круглых скобок.
... |
|
Вернуться к началу |
|
|
Nick4
Зарегистрирован: 15.10.2011 Сообщения: 95
|
Добавлено: Чт Авг 21, 2014 8:47 am Заголовок сообщения: |
|
|
Я достаточно подробно ознакомился с MapBasicUserGuide. В разделе "массивы", "вызов процедур с параметрами", "передача параметров ссылкой" и не нашел ни единого упоминания. Кто же мог подумать, что достаточно важная информация упоминается всего лишь в виде примера в Reference. На месте разработчика, я бы просто продублировал её в нужных разделах. А вообще спасибо. А то я уже хотел писать функцию на с++ и подключать dll. |
|
Вернуться к началу |
|
|
FedorinoFF
Зарегистрирован: 01.02.2007 Сообщения: 272 Откуда: Санкт-Петербург
|
Добавлено: Чт Авг 21, 2014 3:51 pm Заголовок сообщения: |
|
|
"User Guide" и "Lang Ref" немного разные вещи. Кроме того, в User Guide, по крайней мере к MB 11.5, написано:
Как осваивать MapBasic?
Поскольку MapBasic предназначен для программирования в среде MapInfo, Вам следует освоить MapInfo прежде, чем начать работу с MapBasic. В данном Руководстве мы предполагаем,
что Вы уже достаточно близко знакомы с такими концепциями MapInfo, как Таблицы, окна Списков, слои Карт и Рабочие Наборы.
Ознакомившись с работой MapInfo Professional, Вы можете приступить к изучению языка MapBasic с помощью данного Руководства и Справочной системы.
Руководство пользователя MapBasic
В этой книге изложены основные концепции программирования на языке MapBasic.
Руководство пользователя MapBasic – первая книга, с которой Вам следует ознакомиться при изучении языка MapBasic. В каждой главе описана своя область программирования. Следующие главы должен прочитать каждый программист: Основы MapBasic. Создание интерфейса пользователя, где рассказывается как создавать меню и диалоги, а также Ввод/вывод в файлы, где рассказывается, как работать с подсистемой ввода/вывода.
Справочник MapBasic
Содержит расположенные в алфавитном порядке подробные описания всех операторов и функций языка MapBasic. Обращайтесь к Справочнику MapBasic, когда у Вас возникнет вопрос по какому-либо конкретному элементу языка.
Примеры программ
Многие программисты считают, что лучшим способом освоения нового языка программирования является изучение примеров программ. Комплект поставки MapBasic включает библиотеку с примерами программ. Смотрите каталог "Samples" на компакт-диске
MapBasic, в котором приведены примеры кода программ MapBasic.
P.S. Самому стало интересно что и как написано в доке... С другой стороны, если есть штатный тип Массив, то почему должны быть проблемы с передачей его в процедуры и функции? Кроме этого, на худой конец, есть глобальные переменные ;-) |
|
Вернуться к началу |
|
|
Nick4
Зарегистрирован: 15.10.2011 Сообщения: 95
|
Добавлено: Чт Авг 21, 2014 4:36 pm Заголовок сообщения: |
|
|
Вообще то я работаю в Mapinfo и пишу на MapBasic с 2011 года. И смею надеяться, кое-что освоил. Допустим вот такая задача: получить координаты мыши, там где была нажата правя кнопка. Т.е. по нажатии правой кнопки, из меню выбираем нашу процедуру, а в процедуре должны получить координаты мыши. Попробуйте предложить решение, интересно, насколько совпадет с моим.
А проблема передачи массива, это то, что размерность массива при описании и вызове должна совпадать, что меня не устраивает. Поэтому я обрадовался возможности передавать массив разной размерности. Т.е. я передаю просто ссылку на массив. Кстати, на функции WINAPI я до сих пор не могу передать адрес переменной. |
|
Вернуться к началу |
|
|
FedorinoFF
Зарегистрирован: 01.02.2007 Сообщения: 272 Откуда: Санкт-Петербург
|
Добавлено: Чт Авг 21, 2014 5:31 pm Заголовок сообщения: |
|
|
Nick4 писал(а): |
Вообще то я работаю в Mapinfo и пишу на MapBasic с 2011 года. |
Время не показатель. Надежды имеют право на жизнь...
Nick4 писал(а): |
Допустим вот такая задача: получить координаты мыши, там где была нажата правя кнопка. |
Координаты экрана или карты? А почему именно правая, чтоб сложностей побольше? ;-) Нельзя замутить ToolButton ну и т.п.
Вроде проскакивало по форумам про отлов кнопок мыши. вроде решалось хуками, но могу ошибаться.
Nick4 писал(а): |
А проблема передачи массива, это то, что размерность массива при описании и вызове должна совпадать, что меня не устраивает. Поэтому я обрадовался возможности передавать массив разной размерности. Т.е. я передаю просто ссылку на массив. |
Ничего не понял про "проблему". какие размерности должны совпадать...
Nick4 писал(а): |
Кстати, на функции WINAPI я до сих пор не могу передать адрес переменной. |
странная формулировка "передать адрес переменной". Может надо копнуть глубже? почитать про архитектуру ПК, про хранение данных в памяти, про указатели... Чуток понять как это работает.
опять же, куча примеров использования WINApi в Mapbasic. а вот типа "массив" в WINAPI нет |
|
Вернуться к началу |
|
|
FedorinoFF
Зарегистрирован: 01.02.2007 Сообщения: 272 Откуда: Санкт-Петербург
|
Добавлено: Чт Авг 21, 2014 5:38 pm Заголовок сообщения: |
|
|
Кстати, посмотрел сообщения от пользователя Nick4. Судя по форуму, у вас вообще не должно быть вопросов по памяти, указателям, WinAPI и прочей фундаментальной ерунде ;-). Вот и про мышь с HOOK-ами ваша тема.... |
|
Вернуться к началу |
|
|
Nick4
Зарегистрирован: 15.10.2011 Сообщения: 95
|
Добавлено: Пт Авг 22, 2014 2:27 pm Заголовок сообщения: |
|
|
Проблема размерности:
declare sub main
declare sub array(mas(7) as integer,byval ind as integer)
sub main
dim mas(8) as integer
call array(mas,7)
note mas(7)
end sub
sub array(mas(7) as integer,byval ind as integer)
mas(ind)=123
end sub
т.е. если я (не зная о том, что можно в описании массива ставить пустые скобки) задаю в описании процедуры или функции массив определенной размерности, то далее превышение его невозможно, что и привело меня к вопросу на форуме по поводу возможности наличия элементарной функции во встроенном языке программирования.
Вопрос про адрес переменной: программистам С++ этот вопрос не кажется странным. Переменные получают не значение, а адрес передающей переменной. В Map Basic я не смог добиться передачи адреса переменной. Ну допустим попробуйте получить имя пользователя Windows через Wndows API. Формат функции:
Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As integer) As integer
Заметьте, в VBA работает, в С++ работает, а в MP не хочет. По этому, подводя итоги: проблемы возникают не у меня, а у разработчика ПО, о чем мы ему в свою очередь сигнализируем путем этого форума. |
|
Вернуться к началу |
|
|
FedorinoFF
Зарегистрирован: 01.02.2007 Сообщения: 272 Откуда: Санкт-Петербург
|
Добавлено: Пт Авг 22, 2014 9:10 pm Заголовок сообщения: |
|
|
Nick4 писал(а): |
Формат функции:
Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As integer) As integer
. |
Ну давайте разбираться. что значит byVal при описании параметра? правильно - передача по значению. т.е., на низком уровне, значение переменной пихается в стэк (вроде так). в противном случае, параметр передается по ссылке, т.е. как раз тот самы адрес, который вы хотели получить. Программисты на с++ это вроде как очень хорошо понимают. и в с++ тоже есть модификаторы параметров. я не зря говорил про примеры по winapi на MapBasic. и вот даже просто поиск "mapbasic winapi" в google сразу дает ссылку на хороший сайт и там есть такой пример
http://www.wap3.com/mapbasic/UserName.shtml
имя переменной - это суть адрес на область памяти, в которой лежит значение переменной. не ошибаюсь? |
|
Вернуться к началу |
|
|
FedorinoFF
Зарегистрирован: 01.02.2007 Сообщения: 272 Откуда: Санкт-Петербург
|
Добавлено: Пт Авг 22, 2014 9:21 pm Заголовок сообщения: |
|
|
Nick4 писал(а): |
Проблема размерности:
declare sub main
declare sub array(mas(7) as integer,byval ind as integer)
sub main
dim mas(8) as integer
call array(mas,7)
note mas(7)
end sub
sub array(mas(7) as integer,byval ind as integer)
mas(ind)=123
end sub
т.е. если я (не зная о том, что можно в описании массива ставить пустые скобки) задаю в описании процедуры или функции массив определенной размерности, то далее превышение его невозможно, что и привело меня к вопросу на форуме по поводу возможности наличия элементарной функции во встроенном языке программирования.
|
тут тоже не понял. на версии Mapbasic 6.0 никаких ограничений не увидел.
Чуток модифицировал ваш пример, и вижу инициализацию всех элементов массива.
declare sub main
declare sub array(mas(7) as integer,byval ind as integer)
sub main
dim mas(8) as integer
call array(mas,7)
note mas(7)
call array(mas,8)
note mas(8)
end sub
sub array(mas(7) as integer,byval ind as integer)
mas(ind)=ind
end sub
Судя по всему, MapBasic просто не понимает размерность массива при определении процедуры и работает тупо с указателем на массив. |
|
Вернуться к началу |
|
|
Nick4
Зарегистрирован: 15.10.2011 Сообщения: 95
|
Добавлено: Вт Авг 26, 2014 8:30 am Заголовок сообщения: Ну кто бы мог подумать |
|
|
FedorinoFF писал(а): |
Nick4 писал(а): |
Формат функции:
Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As integer) As integer
. |
Ну давайте разбираться. что значит byVal при описании параметра? правильно - передача по значению. т.е., на низком уровне, значение переменной пихается в стэк (вроде так). в противном случае, параметр передается по ссылке, т.е. как раз тот самы адрес, который вы хотели получить. Программисты на с++ это вроде как очень хорошо понимают. и в с++ тоже есть модификаторы параметров. я не зря говорил про примеры по winapi на MapBasic. и вот даже просто поиск "mapbasic winapi" в google сразу дает ссылку на хороший сайт и там есть такой пример
http://www.wap3.com/mapbasic/UserName.shtml
имя переменной - это суть адрес на область памяти, в которой лежит значение переменной. не ошибаюсь? |
Действительно работает. Ну кто бы мог подумать, что в описании функций на MB надо фантазировать. Ведь во всех описаниях функций WINAPI, getusername декларируется в первом параметре именно с Byval, хотя логично (для получения данных) передавать адрес переменной. Просто во всех примерах, далее вызов функции идет с передачей адреса переменной. А MB не позволяет получить адрес переменной (как в С *), что и сбило с толку. Еще раз спасибо за помощь. |
|
Вернуться к началу |
|
|
FedorinoFF
Зарегистрирован: 01.02.2007 Сообщения: 272 Откуда: Санкт-Петербург
|
Добавлено: Вт Авг 26, 2014 2:28 pm Заголовок сообщения: Re: Ну кто бы мог подумать |
|
|
Nick4 писал(а): |
Ну кто бы мог подумать, что в описании функций на MB надо фантазировать. Ведь во всех описаниях функций WINAPI, getusername декларируется в первом параметре именно с Byval, хотя логично (для получения данных) передавать адрес переменной. Просто во всех примерах, далее вызов функции идет с передачей адреса переменной. А MB не позволяет получить адрес переменной (как в С *), что и сбило с толку.. |
Уважаемый, позвольте... смотрим устав
http://msdn.microsoft.com/ru-ru/library/windows/desktop/ms724432(v=vs.85).aspx
написано черным по белому:
lpBuffer [out]
A pointer to the buffer to receive the user's logon name.
какой ByVal? строки, могу ошибаться, передаются по ссылке, чтоб потом ядро винды не парилось с их удалением.
Nick4 писал(а): |
Еще раз спасибо за помощь. |
Пожалуйста. Ежели чего - обращайтесь |
|
Вернуться к началу |
|
|
Nick4
Зарегистрирован: 15.10.2011 Сообщения: 95
|
Добавлено: Пн Сен 01, 2014 1:27 pm Заголовок сообщения: Re: Ну кто бы мог подумать |
|
|
Уважаемый, позвольте... смотрим устав
http://msdn.microsoft.com/ru-ru/library/windows/desktop/ms724432(v=vs.85).aspx
какой ByVal? строки, могу ошибаться, передаются по ссылке, чтоб потом ядро винды не парилось с их удалением.
Описание функции на VBA, в том числе и на сайте Microsoft
http://support.microsoft.com/kb/152970/ru
Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" _
(ByVal lpBuffer As String, nSize As Long) As Long
Как говорится из песни слов не выкинешь.
Возможно поможете с передачей адреса функции? Допустим когда надо перехватить определенное событие и требуется передача адреса функции обработчика. |
|
Вернуться к началу |
|
|
|