Mapbasic: передача параметров функции по ссылке
-
- Новоприбывший
- Сообщения: 6
- Зарегистрирован: 04 окт 2011, 12:11
- Репутация: 0
- Откуда: Томск
Re: Mapbasic: передача параметров функции по ссылке
Спасибо SergS, за быстрый ответ.
НО:
если сделать
void GetMapIdFromDB(int *идентификатор_карты);
точнее так:
unsafe void GetMapIdFromDB(int *идентификатор_карты); //т.к. компилятор считает такие действия небезопасным кодом + включить в компиляторе опцию "/unsafe" чтоб он понимал такие вставки
все равно появляется та же самая ошибка.
будут другие идеи?
НО:
если сделать
void GetMapIdFromDB(int *идентификатор_карты);
точнее так:
unsafe void GetMapIdFromDB(int *идентификатор_карты); //т.к. компилятор считает такие действия небезопасным кодом + включить в компиляторе опцию "/unsafe" чтоб он понимал такие вставки
все равно появляется та же самая ошибка.
будут другие идеи?
-
- Активный участник
- Сообщения: 120
- Зарегистрирован: 14 апр 2011, 13:24
- Репутация: 5
- Откуда: Екатеринбург
Re: Mapbasic: передача параметров функции по ссылке
дык это же не ошибка. просто компилятор параноидально оповещает вас о возможных неприятностях, на случай если вы случайно что-нить не то написали - по последним веяниям прямая работа с памятью видимо считается ужос небезопасной. но если вы хотите изменять передаваемую в качестве параметра переменную - другого пути нет (передача ссылки - это ведь тоже самое, даже вид не сбоку).
Ну можно еще возвращать интересующее значение return-ом (имно - некрасиво, и касается только стандартных типов данных, а если вам понадобиться цельную струтуру в функцию передать и поменять как-нить? или целый массив? компилятор опять ведь ругаться будет. так что мое мнение - нехай ругается, лишь бы не мешал)
Ну можно еще возвращать интересующее значение return-ом (имно - некрасиво, и касается только стандартных типов данных, а если вам понадобиться цельную струтуру в функцию передать и поменять как-нить? или целый массив? компилятор опять ведь ругаться будет. так что мое мнение - нехай ругается, лишь бы не мешал)
-
- Новоприбывший
- Сообщения: 6
- Зарегистрирован: 04 окт 2011, 12:11
- Репутация: 0
- Откуда: Томск
Re: Mapbasic: передача параметров функции по ссылке
добавление unsafe - не важно в данном случае.
главное - если я убираю из описания метода в MapBasic ключевое слово "ByVal"
то программа на MapBasic по иному хочет увидеть функцию в dll-ке.
я применил Ваши рекомендации (убрал "ByVal" из кода на MapBasic-а, добавил int* в код на C#)
ничего не получилось: по прежнему MapInfo запустив программу на MapBasic говорит что не может найти в библиотеке запрашиваемую функцию.
главное - если я убираю из описания метода в MapBasic ключевое слово "ByVal"
то программа на MapBasic по иному хочет увидеть функцию в dll-ке.
я применил Ваши рекомендации (убрал "ByVal" из кода на MapBasic-а, добавил int* в код на C#)
ничего не получилось: по прежнему MapInfo запустив программу на MapBasic говорит что не может найти в библиотеке запрашиваемую функцию.
-
- Активный участник
- Сообщения: 120
- Зарегистрирован: 14 апр 2011, 13:24
- Репутация: 5
- Откуда: Екатеринбург
Re: Mapbasic: передача параметров функции по ссылке
Vladislav
см. ЛС
см. ЛС
-
- Новоприбывший
- Сообщения: 6
- Зарегистрирован: 04 окт 2011, 12:11
- Репутация: 0
- Откуда: Томск
Re: Mapbasic: передача параметров функции по ссылке
Добрый день всем!
По поводу невозможности вызвать из MapBasic функцию из DLL написанной на C#, передавая её параметр "как ссылку":
Похоже решение найдено!
Для передачи из MapBasic в dll параметров по ссылке надо на стороне dll всего лишь перед описанием типа принимаемой переменной добавить ключевое слово ref, что будет символизировать, что эта переменная принимается как ссылка.
При этом на C# описание функции в dll будет выглядеть так:
На C# запись эквивалентна записи в хорошо известном С++.
Благодарю за участие SergS.
Наводку на правильный ответ нашёл тут: http://www.gotdotnet.ru/forums/2/48318/ ... post237347
Документ от 2008 года
По поводу невозможности вызвать из MapBasic функцию из DLL написанной на C#, передавая её параметр "как ссылку":
Похоже решение найдено!
Для передачи из MapBasic в dll параметров по ссылке надо на стороне dll всего лишь перед описанием типа принимаемой переменной добавить ключевое слово ref, что будет символизировать, что эта переменная принимается как ссылка.
При этом на C# описание функции в dll будет выглядеть так:
Код: Выделить всё
public static int GetParam_2(ref int id) { ... }
Код: Выделить всё
ref int id
Код: Выделить всё
int* id
Благодарю за участие SergS.
Наводку на правильный ответ нашёл тут: http://www.gotdotnet.ru/forums/2/48318/ ... post237347
Документ от 2008 года
-
- Новоприбывший
- Сообщения: 6
- Зарегистрирован: 04 окт 2011, 12:11
- Репутация: 0
- Откуда: Томск
Re: Mapbasic: передача параметров функции по ссылке
Уважаемые форумчане!
Вот еще один вопрос по поводу C# + MapBasic:
Из MapBasic вызываю внешнюю (dll) процедуру, передавая ей МАССИВ как ССЫЛКУ.
Код MapBasic-а
Вопрос в том, как корректно работать с таким массивом на стороне C# ?
Полагаю, что принимающая процедура должна выглядеть примерно так:
Вообщем я не уверен.
Прошу подсказать, правильный код для принятия ссылки на массив целых чисел в C#.
Вот еще один вопрос по поводу 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
Полагаю, что принимающая процедура должна выглядеть примерно так:
Код: Выделить всё
public void FillArray(ref int Array) // или надо public void FillArray(ref int[] Array) ?
{
...
}
Прошу подсказать, правильный код для принятия ссылки на массив целых чисел в C#.
-
- Гуру
- Сообщения: 4205
- Зарегистрирован: 10 апр 2006, 22:34
- Репутация: 433
- Откуда: Париж
Re: Mapbasic: передача параметров функции по ссылке
MapBasic'у где-то около 15-20 лет. С тех пор в нем самом ничего не менялось. А остальные языки программирования развивались и трансформировались. Даже самое понятие "целое число" притерпело изменения. Это все какие-то опасные эксперименты.
Чем плохи тестовые строки? При современной скорости вычислений преобразование строка-число требует незаметного времени и ресурсов.
Вообще с мапбасиком, самое безопасное и многократно проверенное - обмениваться через временные файлы. Все равно при малых размерах они будут лежать в оперативной памяти.
Чем плохи тестовые строки? При современной скорости вычислений преобразование строка-число требует незаметного времени и ресурсов.
Вообще с мапбасиком, самое безопасное и многократно проверенное - обмениваться через временные файлы. Все равно при малых размерах они будут лежать в оперативной памяти.
-
- Новоприбывший
- Сообщения: 6
- Зарегистрирован: 04 окт 2011, 12:11
- Репутация: 0
- Откуда: Томск
Re: Mapbasic: передача параметров функции по ссылке
Всем спасибо за участие.
Ответ найден на странице другого форума.
В итоге, чтобы принять в процедуру массив целых чисел по ссылке в C# следовало всего лишь написать
Ответ найден на странице другого форума.
В итоге, чтобы принять в процедуру массив целых чисел по ссылке в C# следовало всего лишь написать
Код: Выделить всё
public static void FillArray(int[] Array)
{
... // что-то делаю с принятым массивом
}
Приведенные объяснения взяты с другого форума (vse.kz).Здесь ссылка на массив myArray передается в функцию по значению (без ключевого слова ref). Но созданная внутри функции копия ссылки myArray ссылается на тот же самый массив, поэтому внутри функции можно изменять значения его элементов. После выхода из функции элементы массива myArray сохранят сделанные изменения.
-
- Новоприбывший
- Сообщения: 2
- Зарегистрирован: 07 фев 2018, 16:11
- Репутация: 0
- Откуда: Чита
Re: Mapbasic: передача параметров функции по ссылке
Здравствуйте уважаемые форумчане. Не могу победить передачу структуры 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;
}
Конкретнее:
Код 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;
}
-
- Активный участник
- Сообщения: 216
- Зарегистрирован: 21 окт 2009, 13:29
- Репутация: 28
- Откуда: Новосибирск
Re: Mapbasic: передача параметров функции по ссылке
Удобнее для отдельного вопроса заводить отдельную тему.alexscorpio писал(а): ↑07 фев 2018, 16:31Не могу победить передачу структуры MapBasic в метод C# по ссылке.
Ну и вам встречный вопрос: как передаются примитивные типы в C#, по значению или по ссылке?
-
- Гуру
- Сообщения: 1195
- Зарегистрирован: 23 апр 2011, 10:32
- Репутация: 205
- Откуда: Ульяновск
Re: Mapbasic: передача параметров функции по ссылке
Вы уверены, что ваш код вообще работает? Какой магией у вас класс TPoint превращается в Point?
-
- Новоприбывший
- Сообщения: 2
- Зарегистрирован: 07 фев 2018, 16:11
- Репутация: 0
- Откуда: Чита
-
- Активный участник
- Сообщения: 216
- Зарегистрирован: 21 окт 2009, 13:29
- Репутация: 28
- Откуда: Новосибирск
Re: Mapbasic: передача параметров функции по ссылке
Попробуйте вначале вызывать свою функцию из другого приложения C#.alexscorpio писал(а): ↑08 фев 2018, 15:32Мало того, методы между собой работают правильно, а переданный объект извне возвращается без изменений.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 28 гостей