Может ли MATLAB Coder сгенерировать функцию, которая принимает указатель в качестве входных данных?

Я хотел бы использовать MATLAB Coder для создания исполняемого файла (или функции в объектный файл), который принимает указатель на массив в качестве входных данных.

Я использовал libpointer для создания объекта указателя, а затем попытался скомпилировать с следующую команду codegen:

codegen -config:lib foo -args {coder.typeof(pointer_object_name)}

Полученное сообщение об ошибке сообщило, что coder.typeof не поддерживает lipointer тип.

Моя конечная цель — создать что-то, что можно будет вызывать из другой функции C, без MATLAB, и получать указатель на массив в качестве входных данных. Может ли MATLAB Coder сгенерировать что-то подобное?


@ryan-livingston запросил сигнатуру функции, которую я хотел бы сгенерировать в MATLAB Coder.

Предположим, что samples является указателем на массив чисел с плавающей запятой. Я думаю, что хочу, чтобы MATLAB Coder создал void foo(float *samples), который выполняет различные вычисления с этими числами с плавающей запятой и, возможно, записывает результаты в файл или сокет.

Теперь, когда ко мне обратил внимание @ryan-livingston, полагаю, я должен спросить следующее.

  • Может ли Coder заставить такие функции, как resample, работать с указателями?
  • Указатели уже используются под капотом, что делает мою заботу ненужной?

person Joe Mack    schedule 12.11.2020    source источник
comment
Можете ли вы опубликовать пример точной подписи C, которую вы ищете? Это поможет информировать дискуссию.   -  person Ryan Livingston    schedule 13.11.2020
comment
@RyanLivingston: Спасибо за ответ. Я добавил подпись к своему вопросу.   -  person Joe Mack    schedule 15.11.2020
comment
Добавил немного информации. Можете ли вы также рассказать больше о вашем случае использования, почему вы хотите, чтобы указатели отображались на интерфейсах или использовались внутри? Какая мотивация: тестирование, эффективность и т.д.?   -  person Ryan Livingston    schedule 16.11.2020


Ответы (1)


Если вы просто сгенерируете код с вводом массива фиксированного размера, сгенерированный код сможет принять указатель. Например:

function x = foo(x)
x = 2*x;
% You can use MATLAB fopen, fprintf, fwrite here to write x to a file

>> codegen foo -args zeros(10,20) -config:lib -report

производит интерфейс:

void foo(double x[200]);

что то же самое, что:

void foo(double *x);

из-за распада массива на указатель при вызовах в C.

Обратите внимание, что я использовал x = foo(x) синтаксис, чтобы Coder передал x по ссылке на foo. Функции, объявленные с одной и той же переменной как для ввода, так и для вывода, обычно производят передачу по ссылке, когда также вызываются с той же переменной, что и для ввода и вывода в месте вызова.

person Ryan Livingston    schedule 16.11.2020
comment
Спасибо. Я подумал о другой ситуации, в которой я хотел бы передать указатель C на функцию, определенную в m-файле: было бы удобно передать argv непосредственно функции, определенной в m-файле. Есть ли способ сделать это? - person Joe Mack; 21.11.2020