Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.05.23;
Скачать: CL | DM;

Вниз

Параметр 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.01 c
3-73067
СергейКнязев
2002-04-25 13:35
2002.05.23
Как программно определить стоит ли на компе BDE


4-73456
Alex_LG
2002-03-23 17:21
2002.05.23
Как получить хендл и (или) ссылку на ресурсы ({$R файл.res})?


6-73326
atl_max
2002-03-11 19:11
2002.05.23
TNMSMTP - как приконнектится к серверу если ....


3-73051
Roman9
2002-04-27 04:29
2002.05.23
DLL & Interbase UDF


1-73295
Ross
2002-05-02 14:26
2002.05.23
Курсор в Memo