Страница 2 из 2

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

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

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

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

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

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

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

Добавлено: 05 окт 2011, 07:05
SergS
Vladislav
см. ЛС

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

Добавлено: 05 окт 2011, 10:09
Vladislav
Добрый день всем!
По поводу невозможности вызвать из 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 года :)

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

Добавлено: 06 окт 2011, 17:36
Vladislav
Уважаемые форумчане!
Вот еще один вопрос по поводу 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#.

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

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

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

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

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

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

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

Добавлено: 07 фев 2018, 16:31
alexscorpio
Здравствуйте уважаемые форумчане. Не могу победить передачу структуры 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;
}

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

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

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

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

Добавлено: 08 фев 2018, 09:19
freeExec
Вы уверены, что ваш код вообще работает? Какой магией у вас класс TPoint превращается в Point?

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

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

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

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