Текущий архив: 2007.11.04;
Скачать: CL | DM;
Вниз
Корректна ли запись PAnsiChar := @string ? Найти похожие ветки
← →
Kolan © (2007-10-15 10:45) [0]Можно ли так делать?
ShellExecute(0,"open",@FlexCelReport1.filename[1],nil,nil,sw_show);
← →
Ega23 © (2007-10-15 10:50) [1]
ShellExecute(0,"open",PChar(FlexCelReport1.filename[1]),nil,nil,sw_show);
← →
clickmaker © (2007-10-15 10:51) [2]нравится значок @ ?
← →
Kolan © (2007-10-15 10:54) [3]> нравится значок @ ?
не нравиться. Я бы написал как Ega… Вот не пойму а так вообще можно?
← →
clickmaker © (2007-10-15 10:56) [4]
> Я бы написал как Ega…
не надо
лучше так PChar(FlexCelReport1.filename)
← →
Kolan © (2007-10-15 11:00) [5]> не надо
Почему, вот что самое интересное для меня в данном вопросе… Мне кажется, что тут кроется ошибка, но хотелось бы узнать точно.
← →
clickmaker © (2007-10-15 11:03) [6]
> Почему
[1] там лишнее
просто, глядя на PChar(xxx), сразу видно, что параметр типа PChar
← →
Ega23 © (2007-10-15 11:05) [7]
>
> [1] там лишнее
>
> просто, глядя на PChar(xxx), сразу видно, что параметр типа
> PChar
Стоп-стоп...
filename - это string или TStrings? Если первое - то, конечно, как в [4]. Если второе - то как в [1]
← →
Kolan © (2007-10-15 11:08) [8]filename — это string
← →
Kolan © (2007-10-15 11:08) [9]filename — это string
> filename — это string
Точнее TFileName…
← →
Kolan © (2007-10-15 11:10) [10]
> просто, глядя на PChar(xxx), сразу видно, что параметр типа
> PChar
И все? Ошибки нет?
Я вотч чего смущаюсь. А есои строка"aaaa#0bbbbb"
, то что будет? Не останется ли от нёёaaaa
при сабжевом вызове?
← →
Anatoly Podgoretsky © (2007-10-15 11:13) [11]Kolan © (15.10.07 10:45)
Можно, но не нужно, ерунда получается.
← →
clickmaker © (2007-10-15 11:15) [12]
> есои строка "aaaa#0bbbbb", то что будет? Не останется ли
> от нёё aaaa при сабжевом вызове?
это зависит от того, как функция обрабатывает строку. По сути, это все равно массив байтов
← →
Palladin © (2007-10-15 11:16) [13]
> Kolan ©
Не знаю как в других версиях делфи, но в D6, PAnsiChar := @string ни в коем разе не корректно, бо PAnsiChar - это PChar, @string - указатель на указатель, чуть более корректно только так @string[1] - чуть более в том плане, что если строка пустая - будет AV
← →
Kolan © (2007-10-15 11:18) [14]> Можно, но не нужно, ерунда получается.
Ясно, кстати, раз уж зашла речь, то я пишу так:ShellExecute(0,"open", PAnsiChar(DataModuleRep.FlexCelReport.FileName), nil,nil, SW_SHOW);
Типа что просят, то и даю. Я не прав?
← →
Kolan © (2007-10-15 11:19) [15]
> @string[1] — чуть более в том плане, что если строка пустая
> — будет AV
так все таки ошибка возможна, щас проверю…
← →
Kolan © (2007-10-15 11:21) [16]
FlexCelReport1.filename := "";
ShellExecute(0,"open",@FlexCelReport1.filename[1],nil,nil,sw_show);
Да нет, открылась рабочая папка, никаких АВ…
← →
Ins © (2007-10-15 11:22) [17]
> Я вотч чего смущаюсь. А есои строка "aaaa#0bbbbb", то что
> будет? Не останется ли от нёё aaaa при сабжевом вызове?
ShellExecute не знает, что по смещению -4 хранится длина строки. Он определит длину по нулевому символу. Так что извращаться нет смысла. Вывод такой - всегда писать PChar(String) за исключением случаев строковых литералов. В случае их к PChar приводить не надо.
← →
Palladin © (2007-10-15 11:22) [18]AV будет или не будет... по встречной полосе тоже ехать можно...
← →
Kolan © (2007-10-15 11:25) [19]Тааак мнения разделильсь…
То что так писать ненадо понятно.
А вот что с ошибкой:
будет:
Palladin — AV
Ins, Kolan — неверное превращежние в случае"aaaa#0bbbbb"
--
не будет:
Anatoly Podgoretsky — Можно
clickmaker — это все равно массив байтов…
← →
Ins © (2007-10-15 11:29) [20]
> Ins, Kolan — неверное превращежние в случае "aaaa#0bbbbb"
Я имел в виду, что нужно всегда писать PChar(str), если требуется параметр PChar, но не приводить к PChar, если str - не переменная, а строковая константа, как в таком случае:
MessageBox(0,PChar("Text"),PChar("Caption"),0); - не нужно
MessageBox(0,"Text","Caption",0); - нужно так.
← →
Ins © (2007-10-15 11:36) [21]В общем, еще раз, а то я как-то криво сформулировал:
1. Если функция требует параметром PChar, а у вас есть переменная типа String, то передавать этот параметр нужно так:
SomeFunc(PChar(Str));
2. Если функция требует параметром PChar, а у вас есть строковая константа (литерал), то передавать этот параметр нужно так:
SomeFunc("бла-бла");
Но не так:
SomeFunc(PChar("бла-бла"));
так как в последнем случае глупый компилятор может сделать совсем не то, чего вы от него ждете и получите законное AV.
← →
Kolan © (2007-10-15 11:36) [22]> как в таком случае
А это понятно. Мне интересно про ав все таки.
И про превращение. Я рассуждаю как ты в [17]:ShellExecute не знает, что по смещению —4 хранится длина строки. Он определит длину по нулевому символу.
Так ли это…
← →
clickmaker © (2007-10-15 11:38) [23]
> ShellExecute не знает, что по смещению —4 хранится длина
> строки. Он определит длину по нулевому символу.
> Так ли это…
а какие сомнения?
WinAPI вообще ничего не знает о специфике твоей среды разработки. для нее строка - массив символов, оканчивающийся нулем
← →
Leonid Troyanovsky © (2007-10-15 11:40) [24]
> Kolan © (15.10.07 11:25) [19]
Для ShellExecute требуется Pointer(FileName/Dir)
--
Regards, LVT.
← →
Kolan © (2007-10-15 11:41) [25]> а какие сомнения?
Ну вы этого не сказали в начале…
Итак вердикт какой?
Такой подход превратить строку неверно, и может стать причной АВ если строка = ""
← →
Ins © (2007-10-15 11:59) [26]
> Такой подход превратить строку неверно, и может стать причной
> АВ если строка = ""
Это вряд ли. Компилятор при записи @str[i] в данном случае не пытается обратиться к i-му символу. Он просто берет значение str и инкрементирует его на i-1. Так что опасности передачи параметра таким образом я не вижу.
← →
Palladin © (2007-10-15 12:04) [27]
> Ins © (15.10.07 11:59) [26]
само @str[i] - конечно не вызовет AV, это будет всего лишь адрес со смещением i от str, AV вызовет функция которая к этому адресу обратится, а может и не вызовет, чего то возьмет по этому адресу до первого попавшегося #0, однако к каким последствиям это приведет?
← →
Ins © (2007-10-15 12:07) [28]
> Palladin © (15.10.07 12:04) [27]
Я это понимаю, но просто в случае пустой строки нет никакой принципиальной разницы, просто nil передать, или PChar[Str], или @Str[1]. Я пост [13] комментирую. Не знаю, как в D6, но в D7 точно все в порядке с этой точки зрения.
← →
Palladin © (2007-10-15 12:09) [29]
> Ins © (15.10.07 12:07) [28]
:)так оно и понятно, что передать можно что угодно, хоть Pointer($0000FFF1), я имел ввиду AV в последствии передачи, а не в последствии приведения типов
← →
Leonid Troyanovsky © (2007-10-15 12:12) [30]
> Ins © (15.10.07 12:07) [28]
> Я это понимаю, но просто в случае пустой строки нет никакой
> принципиальной разницы, просто nil передать, или PChar[Str],
Есть, конечно.
--
Regards, LVT.
← →
Ins © (2007-10-15 12:14) [31]
> :)так оно и понятно, что передать можно что угодно, хоть
> Pointer($0000FFF1), я имел ввиду AV в последствии передачи,
> а не в последствии приведения типов
Ну вот это не очевидно из вашего сообщения [13]. Несколько раз перечитал - явно следует такой смысл: @str делать нельзя, так как в этом случае получаем указатель на указатель (с этим не спорю), чуть более верно сделать такое приведение @str[1], но чуть - из-за того, что при пустой строке даст AV (так как первого символа не существует и следовательно у него нет адреса). Утверждаю, что не чуть, а в равной степени верно, как и PChar(Str).
← →
Ins © (2007-10-15 12:15) [32]
> Есть, конечно.
Какая? :)
← →
Kolan © (2007-10-15 12:22) [33]А надо ли использовать RealizeLength после приведения к PChar?
← →
Однокамушкин (2007-10-15 12:23) [34]
> Ins © (15.10.07 12:15) [32]
>
> > Есть, конечно.
>
> Какая? :)
В случае пустой строки Pointer(Str) = nil, и Str[1] приводит к исключению, а PChar(Str) работает нормально, правда, возвращает не nil, а указатель на специально выделенный символ #0, потому что PChar(string) - это не приведение типа, а неявный вызов функции _LStrToPChar
← →
clickmaker © (2007-10-15 12:27) [35]
> [33] Kolan © (15.10.07 12:22)
а это еще что за зверь?
← →
Kolan © (2007-10-15 12:30) [36]А надо ли использовать RealizeLength после приведения к PChar?
> а это еще что за зверь?
Вычитал у текстры, страница 72,(Delphi 5 Руководство разработчика, том 1).
Там написано, что надо вызывать…
← →
Ins © (2007-10-15 12:30) [37]
> В случае пустой строки Pointer(Str) = nil, и Str[1] приводит
> к исключению, а PChar(Str) работает нормально, правда, возвращает
> не nil, а указатель на специально выделенный символ #0,
> потому что PChar(string) - это не приведение типа, а неявный
> вызов функции _LStrToPChar
Проверил - так есть. Вопрос "какая" исчерпан.
← →
Leonid Troyanovsky © (2007-10-15 12:31) [38]
> Однокамушкин (15.10.07 12:23) [34]
+
Например, если FindWindow передать пустую строку s,
а приведение будет типа PChar(s), то искаться будет
не любой (как для nil), скажем, заголовок, а пустой.
--
Regards, LVT.
← →
Ins © (2007-10-15 12:34) [39]
> Leonid Troyanovsky © (15.10.07 12:31) [38]
Ну это уже следствие из [34]. Все ясно, спасибо за ликбез.
← →
clickmaker © (2007-10-15 12:36) [40]
> [36] Kolan © (15.10.07 12:30)
я чегой-то не могу найти эту функцию в delphi\source...
Страницы: 1 2 вся ветка
Текущий архив: 2007.11.04;
Скачать: CL | DM;
Память: 0.56 MB
Время: 0.016 c