Mapbasic: передача параметров функции по ссылке

MapInfo, MapBasic
Vladislav
Новоприбывший
Сообщения: 6
Зарегистрирован: 04 окт 2011, 12:11
Репутация: 0
Откуда: Томск

Re: Mapbasic: передача параметров функции по ссылке

Сообщение Vladislav » 04 окт 2011, 14:29

Спасибо SergS, за быстрый ответ.
НО:
если сделать
void GetMapIdFromDB(int *идентификатор_карты);
точнее так:
unsafe void GetMapIdFromDB(int *идентификатор_карты); //т.к. компилятор считает такие действия небезопасным кодом + включить в компиляторе опцию "/unsafe" чтоб он понимал такие вставки
все равно появляется та же самая ошибка. :(
будут другие идеи?

SergS
Активный участник
Сообщения: 120
Зарегистрирован: 14 апр 2011, 13:24
Репутация: 5
Откуда: Екатеринбург

Re: Mapbasic: передача параметров функции по ссылке

Сообщение SergS » 04 окт 2011, 14:42

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

Vladislav
Новоприбывший
Сообщения: 6
Зарегистрирован: 04 окт 2011, 12:11
Репутация: 0
Откуда: Томск

Re: Mapbasic: передача параметров функции по ссылке

Сообщение Vladislav » 04 окт 2011, 14:53

добавление unsafe - не важно в данном случае.
главное - если я убираю из описания метода в MapBasic ключевое слово "ByVal"
то программа на MapBasic по иному хочет увидеть функцию в dll-ке.
я применил Ваши рекомендации (убрал "ByVal" из кода на MapBasic-а, добавил int* в код на C#)
ничего не получилось: по прежнему MapInfo запустив программу на MapBasic говорит что не может найти в библиотеке запрашиваемую функцию.

SergS
Активный участник
Сообщения: 120
Зарегистрирован: 14 апр 2011, 13:24
Репутация: 5
Откуда: Екатеринбург

Re: Mapbasic: передача параметров функции по ссылке

Сообщение SergS » 05 окт 2011, 07:05

Vladislav
см. ЛС

Vladislav
Новоприбывший
Сообщения: 6
Зарегистрирован: 04 окт 2011, 12:11
Репутация: 0
Откуда: Томск

Re: Mapbasic: передача параметров функции по ссылке

Сообщение Vladislav » 05 окт 2011, 10:09

Добрый день всем!
По поводу невозможности вызвать из MapBasic функцию из DLL написанной на C#, передавая её параметр "как ссылку":
Похоже решение найдено!
Для передачи из MapBasic в dll параметров по ссылке надо на стороне dll всего лишь перед описанием типа принимаемой переменной добавить ключевое слово ref, что будет символизировать, что эта переменная принимается как ссылка.
При этом на C# описание функции в dll будет выглядеть так:

Код: Выделить всё

public static int GetParam_2(ref int id) { ... }
На C# запись

Код: Выделить всё

ref int id
эквивалентна записи в хорошо известном С++.
Благодарю за участие SergS.
Наводку на правильный ответ нашёл тут: http://www.gotdotnet.ru/forums/2/48318/ ... post237347
Документ от 2008 года :)

Vladislav
Новоприбывший
Сообщения: 6
Зарегистрирован: 04 окт 2011, 12:11
Репутация: 0
Откуда: Томск

Re: Mapbasic: передача параметров функции по ссылке

Сообщение Vladislav » 06 окт 2011, 17:36

Уважаемые форумчане!
Вот еще один вопрос по поводу C# + MapBasic:

Из MapBasic вызываю внешнюю (dll) процедуру, передавая ей МАССИВ как ССЫЛКУ.
Код MapBasic-а

Код: Выделить всё

Declare method FillArray Class "Class1" Lib "Test.dll" (MyArray() as integer)

sub main

  dim MyArray() as integer
  redim MyArray(10)
  call FillArray(MyArray)   ' или надо "call FillArray(MyArray())" ?

end sub
Вопрос в том, как корректно работать с таким массивом на стороне C# ?
Полагаю, что принимающая процедура должна выглядеть примерно так:

Код: Выделить всё

public void FillArray(ref int Array) // или надо public void FillArray(ref int[] Array) ?
{
...
}
Вообщем я не уверен.
Прошу подсказать, правильный код для принятия ссылки на массив целых чисел в C#.

Boris
Гуру
Сообщения: 4205
Зарегистрирован: 10 апр 2006, 22:34
Репутация: 433
Откуда: Париж

Re: Mapbasic: передача параметров функции по ссылке

Сообщение Boris » 07 окт 2011, 17:37

MapBasic'у где-то около 15-20 лет. С тех пор в нем самом ничего не менялось. А остальные языки программирования развивались и трансформировались. Даже самое понятие "целое число" притерпело изменения. Это все какие-то опасные эксперименты.
Чем плохи тестовые строки? При современной скорости вычислений преобразование строка-число требует незаметного времени и ресурсов.
Вообще с мапбасиком, самое безопасное и многократно проверенное - обмениваться через временные файлы. Все равно при малых размерах они будут лежать в оперативной памяти.

Vladislav
Новоприбывший
Сообщения: 6
Зарегистрирован: 04 окт 2011, 12:11
Репутация: 0
Откуда: Томск

Re: Mapbasic: передача параметров функции по ссылке

Сообщение Vladislav » 07 окт 2011, 20:31

Всем спасибо за участие.
Ответ найден на странице другого форума.
В итоге, чтобы принять в процедуру массив целых чисел по ссылке в C# следовало всего лишь написать

Код: Выделить всё

public static void FillArray(int[] Array)
{
... // что-то делаю с принятым массивом
}
Здесь ссылка на массив myArray передается в функцию по значению (без ключевого слова ref). Но созданная внутри функции копия ссылки myArray ссылается на тот же самый массив, поэтому внутри функции можно изменять значения его элементов. После выхода из функции элементы массива myArray сохранят сделанные изменения.
Приведенные объяснения взяты с другого форума (vse.kz).

alexscorpio
Новоприбывший
Сообщения: 2
Зарегистрирован: 07 фев 2018, 16:11
Репутация: 0
Откуда: Чита

Re: Mapbasic: передача параметров функции по ссылке

Сообщение alexscorpio » 07 фев 2018, 16:31

Здравствуйте уважаемые форумчане. Не могу победить передачу структуры MapBasic в метод C# по ссылке. Задача состоит в том, чтобы значение полей структуры изменились после вывода метода.
Конкретнее:
Код MapBasic:

Type TPoint
X As Float
Y As Float
' есть еще поля Integer, Float, String
End Type

Sub Experiment()
Dim Pt as TPoint
Pt.X = 1000
Call InitPoint(Pt)

Note Pt.X 'Пишет 1000, а хотелось бы 0
End Sub

Код C#:
public class Point
{
public double X;
public double Y;
' есть еще поля int, double, string
public Point(double NewX, double NewY){X = NewX; Y = NewY;}
}

public static void InitPoint(ref Point Pt)
{
//Здесь все значения, заданные в Mapbasic, присутствуют
Pt.X = 0;
Pt.Y = 0;
}

Sibit
Активный участник
Сообщения: 216
Зарегистрирован: 21 окт 2009, 13:29
Репутация: 28
Откуда: Новосибирск

Re: Mapbasic: передача параметров функции по ссылке

Сообщение Sibit » 08 фев 2018, 05:43

alexscorpio писал(а):
07 фев 2018, 16:31
Не могу победить передачу структуры MapBasic в метод C# по ссылке.
Удобнее для отдельного вопроса заводить отдельную тему.

Ну и вам встречный вопрос: как передаются примитивные типы в C#, по значению или по ссылке?

freeExec
Гуру
Сообщения: 1195
Зарегистрирован: 23 апр 2011, 10:32
Репутация: 205
Откуда: Ульяновск

Re: Mapbasic: передача параметров функции по ссылке

Сообщение freeExec » 08 фев 2018, 09:19

Вы уверены, что ваш код вообще работает? Какой магией у вас класс TPoint превращается в Point?

alexscorpio
Новоприбывший
Сообщения: 2
Зарегистрирован: 07 фев 2018, 16:11
Репутация: 0
Откуда: Чита

Re: Mapbasic: передача параметров функции по ссылке

Сообщение alexscorpio » 08 фев 2018, 15:32

freeExec писал(а):
08 фев 2018, 09:19
код вообще работает?
Да работает. Внутри DLL значения, заданные в MapBasic отображаются (при желании). Мало того, методы между собой работают правильно, а переданный объект извне возвращается без изменений.

Sibit
Активный участник
Сообщения: 216
Зарегистрирован: 21 окт 2009, 13:29
Репутация: 28
Откуда: Новосибирск

Re: Mapbasic: передача параметров функции по ссылке

Сообщение Sibit » 09 фев 2018, 12:45

alexscorpio писал(а):
08 фев 2018, 15:32
Мало того, методы между собой работают правильно, а переданный объект извне возвращается без изменений.
Попробуйте вначале вызывать свою функцию из другого приложения C#.

Ответить

Вернуться в «MapInfo»

Кто сейчас на конференции

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