www.map-info.ru :: Просмотр темы - Инициализация массива
                               РќР° главную страницу сайта

 
                                
ВходВход    РегистрацияРегистрация    ПрофильПрофиль    ПользователиПользователи    ГруппыГруппы    FAQFAQ    ПоискПоиск  
На страницу 1, 2  След.
 
   Список форумов www.map-info.ru | Форум - программирование в среде MapInfo Добавить ответ
Предыдущая тема :: Следующая тема  
Автор Сообщение
Nick4



Зарегистрирован: 15.10.2011
Сообщения: 95

СообщениеДобавлено: Пн Авг 18, 2014 4:40 pm    Заголовок сообщения: Инициализация массива Добавить ответ со ссылкой на данный текст

Подскажите, есть какая либо возможность записать данные в массив одной строчкой, как функция array() в VBA?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
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 соответствующий массив-результат.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Nick4



Зарегистрирован: 15.10.2011
Сообщения: 95

СообщениеДобавлено: Ср Авг 20, 2014 2:23 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Я так и сделал, только в теле основной программы. Не знал (и в описании нигде не указано), что в качестве параметров можно задавать массив с пустой размерностью.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
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.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
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 я до сих пор не могу передать адрес переменной.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
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 не хочет. По этому, подводя итоги: проблемы возникают не у меня, а у разработчика ПО, о чем мы ему в свою очередь сигнализируем путем этого форума.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
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 не позволяет получить адрес переменной (как в С *), что и сбило с толку. Еще раз спасибо за помощь.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
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 писал(а):
Еще раз спасибо за помощь.


Пожалуйста. Ежели чего - обращайтесь Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
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

Как говорится из песни слов не выкинешь.
Возможно поможете с передачей адреса функции? Допустим когда надо перехватить определенное событие и требуется передача адреса функции обработчика.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Показать сообщения:   
   Список форумов www.map-info.ru | Форум - программирование в среде MapInfo Добавить ответ
На страницу 1, 2  След.
Страница 1 из 2

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


Top.Mail.Ru