Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Параметр 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;


Наверх

Титульная страница Поиск, карта сайта Написать письмо