![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Параметр PChar со значением по умолчанию [D6, Win95/98]
EsKor © (2002-05-13 04:43:00)Написана DLL и в одну из ее функций требуется передавать или не передавать строковый параметр, т.е. необходим параметр со значением по умолчанию. Но установить его, как приведено ниже, не удается, компилятор выдает сообщение:"Ожидается константное выражение" (Constant expression expected). Как по другому не могу сообразить.
function BalLink(ParamStr: PChar = "2400,7,2,E"): PChar; stdcall;
EsKor (2002-05-14 05:31:00) [1]Всем спасибо! К сожалению я не догадался указать, что эта самая DLL предназначена для использования программой написанной не на Delphi, в частности на Visual FoxPro. Мне кажется, что в этом случае наиболее подойдут или использование перегруженных функций, или, видимо самое простое, использовать в качестве значения по умолчанию nil, т.к., действительно, в данном случае это значение является "бессмысленным" для параметра. Хотя для меня еще проще было бы убедить программиста от FoxPro при вызове функции всегда указывать параметр-строку. Тогда не придется переделывать уже работающую DLL.
С другой стороны подобные проблемы являются хорошим средством препятствующий "закисанию" мозгов.
Еще раз Всем спасибо!
PVOzerski (2002-05-13 14:43:00) [2]>PChar же это указаель на строку/символ и ее можно инициализировать только указателем,
Тогда конструкция
const
p : pchar = "abc";
столь же несуразна, но, тем не менее, поддерживается. Как и опускание ^ перед . и [
при работе с указателями на массивы и записи. Как и вообще default-параметры - не
ленись, подставляй вручную! Более серьёзно, IMHO, если уж какие-то расширения
синтаксиса введены для того, чтобы увеличить удобство работы (в ущерб стройности
логики языка), так уж и доводить бы надо их до ума полностью.
Anatoly Podgoretsky (2002-05-13 13:43:00) [3]Это не ошибка
string это строка, поэтому ее можно инициализировать значениеи
PChar же это указаель на строку/символ и ее можно инициализировать только указателем, а не значением
К сожелению не проходит вариант
const
p : pchar = "abc";
function BalLink(const ParamStr: pchar = p):PChar;
PVOzerski (2002-05-13 12:05:00) [4]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 10:45:00) [5]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;
McSimm (2002-05-13 10:36:00) [6]Ошибся. Разумеется без константы BalLink(ParamStr: PChar)
EsKor (2002-05-13 10:23:00) [7]Спасибо за идею. Попробовать придется только завтра - через 10 минут конец рабочего дня. Только не совсем понятно с первым вариантом, т.к. компилятор как раз и ругается на указание параметра в виде ... PChar = "<строка>".
McSimm (2002-05-13 10:07:00) [8]Нельзя. Для указателей можно только 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;