Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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&#133 Вот не пойму а так вообще можно?


 
clickmaker ©   (2007-10-15 10:56) [4]


> Я бы написал как Ega…

не надо
лучше так PChar(FlexCelReport1.filename)


 
Kolan ©   (2007-10-15 11:00) [5]

> не надо

Почему, вот что самое интересное для меня в данном вопросе&#133 Мне кажется, что тут кроется ошибка, но хотелось бы узнать точно.


 
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&#133


 
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

так все таки ошибка возможна, щас проверю&#133


 
Kolan ©   (2007-10-15 11:21) [16]

FlexCelReport1.filename := "";
 ShellExecute(0,"open",@FlexCelReport1.filename[1],nil,nil,sw_show);


Да нет, открылась рабочая папка, никаких АВ&#133


 
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]

Тааак мнения разделильсь&#133

То что так писать ненадо понятно.

А вот что с ошибкой:
будет:

Palladin — AV
Ins, Kolan — неверное превращежние в случае "aaaa#0bbbbb"

--
не будет:

Anatoly Podgoretsky — Можно
clickmaker — это все равно массив байтов&#133


 
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 хранится длина строки. Он определит длину по нулевому символу.
Так ли это&#133


 
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]

> а какие сомнения?

Ну вы этого не сказали в начале&#133

Итак вердикт какой?
Такой подход превратить строку неверно, и может стать причной АВ если строка = ""


 
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).

Там написано, что надо вызывать&#133


 
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
2-1192048120
smartleds
2007-10-11 00:28
2007.11.04
Господа подскажите как задать размер динамической матрицы


2-1192379027
Инжинер
2007-10-14 20:23
2007.11.04
Работа с USB


6-1172949074
Den81
2007-03-03 22:11
2007.11.04
WebBrowser и Java функции


2-1192270081
Новичек
2007-10-13 14:08
2007.11.04
Состояние DataSet.


15-1191229149
vasIZmax
2007-10-01 12:59
2007.11.04
Надо собрать комп