Рассмотрим MyClass.java:
public class MyClass {
public void firstfunction(double fwd[]) {
fwd[0] = 42;
}
public void secondfunction(Double fwd[]) {
fwd[0] = new Double(42);
}
}
Обе функции возвращают значение 42 в fwd
, верно?
Из MATLAB я хочу получить доступ к этому значению 42:
myobj=MyClass;
var1=0.0;
myobj.firstfunction(var1);
fprintf('%1.1f',var1); %// ... var1 is still 0.0 ... :-(
var2 = javaArray ('java.lang.Double',1);
var2(1)=java.lang.Double(0.0);
myobj.secondfunction(var2); %// var2 now contains the value 42 :-)
Хотя оба вызова «работают» (как есть: нет сообщения об ошибке), только var2 содержит возвращаемое значение 42; var1 по-прежнему имеет значение 0,0.
Есть ли способ использовать MATLAB для вызова функции firstfunction
и получения возвращаемого значения?
Некоторая предыстория: MATLAB может передавать объекты Java при вызове функции Java и вносить изменения в эти объекты впоследствии доступны в MATLAB - , за исключением , когда объект Java является массивом примитивного типа данных. В этом случае срабатывает автоматическое преобразование между MATLAB и Java, обеспечение соответствия Java array-of-primitive-double непосредственно двойной матрице в MATLAB - что по соглашениям MATLAB является вещью, «переданной как значение», поэтому возвращаемые значения невозможны. Поэтому мой вопрос можно перефразировать так: есть ли способ обойти это?
(вы можете прекратить читать здесь.)
Для справки, мой частный случай был следующим:
У меня Java class MyClass.java обертывает DLL, которую я хочу использовать в MATLAB. Однако возвращаемое значение одной из функций - это double [], переданное в качестве параметра , содержимое которого не возвращается в MATLAB из-за того, как взаимодействие с Java реализована.
Есть ли способ обойти эту проблему, не изменяя способ, которым DLL возвращает данные?
Вот уродливые детали:
public class MyClass
{
static
{
System.load("C:\\fullpath\\mydll.dll");
}
public static native long SetFWD(double fwd);
public static native long GetFWD(double fwd[]);
}
Это видно изнутри MATLAB, как только я правильно установил javapath:
>> methods MyClass -full
Methods for class MyClass:
static long GetFWD(double[])
MyClass()
static long SetFWD(double)
[and stuff inherited from java.lang.Object]
Я могу вызвать функцию SetFWD изнутри MATLAB, но я не могу заставить GetFWD что-нибудь вернуть:
myobj=MyClass;
fwd=3.0;
myobj.SetFWD(fwdval); % this works fine
fwd=0.0;
myobj.GetFWD(fwd); % this does not give an error, but fwd stays unmodified - as one would expect in MATLAB
fwd = javaArray ('java.lang.Double',1);
fwd(1) = java.lang.Double(0.0);
myobj.GetFWD(fwd) % this gives the error "??? No method 'GetFWD' with matching signature found for class 'MyClass'."
Из чтения документации MATLAB Передача данных в метод Java и Работа с массивами Java , а также сообщения SO Переход от типов Java к типам MATLAB и Странные классы переданы из Matlab в java , я понимаю, что Matlab автоматически преобразует любой двойной массив, который я передаю функции, в массив Java, а затем игнорирует любые изменения, вносимые в эти массивы. Кажется, что если бы мое определение функции в MyClass содержало объекты Double вместо примитивов double, моя вторая попытка могла бы сработать.
Есть ли способ заставить MATLAB вернуть значение, которое я ищу, без изменения исходного .DLL (mydll.dll)?
Обновление
Я понимаю, что MATLAB обычно передает все "по значению". Но в Передача данных в метод Java Mathworks говорит, что
Если вам нужно получить доступ к изменениям, Тогда метод Java преобразует массив, вместо передачи массива MATLAB, вы должны создать и передать Java Я хочу, чтобы люди могли регистрироваться только в том случае, если они используют один из двух конкретных доменов в своем адресе электронной почты.
Так, например, они могут зарегистрироваться, если они используют @ domain1.co.uk или @ domain2.co.uk, но никакие другие домены (например, Gmail, Yahoo и т. д.) использовать нельзя.
Было бы здорово, если бы кто-нибудь указал мне правильное направление.