Как объяснить пользователю, что аргумент функции должен быть введен как строка в Matlab? - PullRequest
0 голосов
/ 03 октября 2010

У меня есть следующая функция, последним аргументом которой является имя текстового файла:

function [property_without_headers]=gslib_file_to_matlab_var(nModel,nCell,gslib_file_name) % must enter the last argument, gslib_file_name, in single quotes as its treated as a string

if nargin<3, % making third argument optional (code to be executed even when only 2 arguments are provided)
    gslib_file_name=input('Enter the gslib file name: ','s');
end
if length(gslib_file_name)<4 || ~strcmpi(gslib_file_name(end-3:end),'.dat'),
    gslib_file_name=[gslib_file_name '.dat']; % string concatenation
end

%% Reading directly from the .dat files generated from SGEMS and making the data of file as a variable

property_gslib_format=textread(gslib_file_name,'%f\t','headerlines',nModel+2); 
property_without_headers=reshape(property_gslib_format,nModel,nCell)';

Прямо сейчас, по общему мнению, последний аргумент функции, который нужно ввести, числовой. Как мне сделать так, чтобы пользователю было более понятно, что последний аргумент, имя текстового файла, который нужно ввести, должен быть в строковом формате, то есть в одинарных кавычках? Если я определю последний аргумент функции например, после этого я получаю ошибку Неожиданное выражение MATLAB. :

[property_without_headers]=gslib_file_to_matlab_var(nModel,nCell,'gslib_file_name')

Ответы [ 3 ]

3 голосов
/ 03 октября 2010

Первое, что нужно сделать, это написать «справку» для функции и явно указать, что последний аргумент должен быть строкой.

И вы можете проверить тип этого аргумента, используя "ischar ()", то есть:

if ~ischar(gslib_file_name)
    error('gslib_file_name  should a be string');
end
2 голосов
/ 03 октября 2010

Если ваше приложение не требуется для запуска только на консоли, я предлагаю использовать uigetfile , чтобы пользователь выбрал файл через диалоговое окно графического интерфейса пользователя.Таким образом, для пользователя будет очень ясно, что вы ищете имя файла.

Таким образом, вы написали бы

if nargin < 3
     %# ask for a *.dat file
     [fileName,pathName] = uigetfile('*.dat','select gslib file');
     %# check whether the user selected anything
     if fileName == 0
        error('file selection aborted by user')
     end
     %# construct gslib file name from path and file name
     gslib_file_name = fullfile(pathName,fileName);
end

Очевидно, что документирование функции в любом случае поможет.

2 голосов
/ 03 октября 2010

Это то, для чего нужна справочная документация , и именно это действительно увидит конечный пользователь вашей функции.Еще несколько предложений по форматированию можно найти здесь .

...