Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
4-73464
slydiman
2002-03-25 11:09
2002.05.23
Вопрос к спецам по Hook ам (супер баг?)


14-73361
Alexander Vasjuk
2002-04-11 18:45
2002.05.23
Замаскировать средство разработки


1-73272
Makss
2002-05-11 03:24
2002.05.23
Ресурсы сжатых исполняемых файлов


3-73066
Евгений Р.
2002-04-28 13:40
2002.05.23
Изменение структуры таблицы


7-73424
lipskiy
2002-02-25 16:18
2002.05.23
Как предотвратить ошибку EOleSysError для старой версии Shdocvw.dll (то есть, IE)?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский