Форум: "Основная";
Текущий архив: 2002.05.23;
Скачать: [xml.tar.bz2];
ВнизПараметр PChar со значением по умолчанию Найти похожие ветки
← →
EsKor (2002-05-13 04:43) [0]Написана DLL и в одну из ее функций требуется передавать или не передавать строковый параметр, т.е. необходим параметр со значением по умолчанию. Но установить его, как приведено ниже, не удается, компилятор выдает сообщение:"Ожидается константное выражение" (Constant expression expected). Как по другому не могу сообразить.
function BalLink(ParamStr: PChar = "2400,7,2,E"): PChar; stdcall;
← →
McSimm (2002-05-13 10:07) [1]Нельзя. Для указателей можно только nil задать.
Поробуй использовать директиву overload. Приблизительно так:
function BalLink(ParamStr: PChar = "2400,7,2,E"): PChar; stdcall; overload;
function BalLink: PChar; stdcall; overload;
implementation
function BalLink(ParamStr: PChar = "2400,7,2,E"): PChar; stdcall; overload;
begin
// твоя процедура
end;
function BalLink: PChar; stdcall; overload;
begin
Result := BalLink("2400,7,2,E")
end;
← →
EsKor (2002-05-13 10:23) [2]Спасибо за идею. Попробовать придется только завтра - через 10 минут конец рабочего дня. Только не совсем понятно с первым вариантом, т.к. компилятор как раз и ругается на указание параметра в виде ... PChar = "<строка>".
← →
McSimm (2002-05-13 10:36) [3]Ошибся. Разумеется без константы BalLink(ParamStr: PChar)
← →
Anatoly Podgoretsky (2002-05-13 10:45) [4]function BalLink(ParamStr: PChar = nil) : PChar; stdcall;
implementation
function BalLink(ParamStr: PChar = nil) : PChar; stdcall;
const
Def = "2400,7,2,E";
begin
if ParamStr = nil then ParamStr := Def;
end;
← →
PVOzerski (2002-05-13 12:05) [5]2 Anatoly Podgoretsky:
Этот подход хорош, но только если nil - "запрещенное" или "бессмысленное" значение для параметра
ParamStr. В противном же случае явная передача nil приведет к его подмене этим самым 2400,7,2,E.
Я бы предложил более "кривой", но более общий вариант:
function __BalLink(ParamStr:PChar):PChar;stdcall;
external "<имя>.DLL" name "BalLink";
function BalLink(const ParamStr:string="2400,7,2,E"):PChar;
begin
Result:=__BalLink(pChar(ParamStr));
end;
Суть-то дела в том, что при объявлении констант типа pChar присвоение
строковых значений допускается, а вот в Default-параметрах - нет (IMHO,
явный просчёт Borland, если вообще не баг) - и это при том, что для
параметров типа String подобные default-значения допустимы.
← →
Anatoly Podgoretsky (2002-05-13 13:43) [6]Это не ошибка
string это строка, поэтому ее можно инициализировать значениеи
PChar же это указаель на строку/символ и ее можно инициализировать только указателем, а не значением
К сожелению не проходит вариант
const
p : pchar = "abc";
function BalLink(const ParamStr: pchar = p):PChar;
← →
PVOzerski (2002-05-13 14:43) [7]>PChar же это указаель на строку/символ и ее можно инициализировать только указателем,
Тогда конструкция
const
p : pchar = "abc";
столь же несуразна, но, тем не менее, поддерживается. Как и опускание ^ перед . и [
при работе с указателями на массивы и записи. Как и вообще default-параметры - не
ленись, подставляй вручную! Более серьёзно, IMHO, если уж какие-то расширения
синтаксиса введены для того, чтобы увеличить удобство работы (в ущерб стройности
логики языка), так уж и доводить бы надо их до ума полностью.
← →
EsKor (2002-05-14 05:31) [8]Всем спасибо! К сожалению я не догадался указать, что эта самая DLL предназначена для использования программой написанной не на Delphi, в частности на Visual FoxPro. Мне кажется, что в этом случае наиболее подойдут или использование перегруженных функций, или, видимо самое простое, использовать в качестве значения по умолчанию nil, т.к., действительно, в данном случае это значение является "бессмысленным" для параметра. Хотя для меня еще проще было бы убедить программиста от FoxPro при вызове функции всегда указывать параметр-строку. Тогда не придется переделывать уже работающую DLL.
С другой стороны подобные проблемы являются хорошим средством препятствующий "закисанию" мозгов.
Еще раз Всем спасибо!
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.05.23;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.01 c