Форум: "Основная";
Текущий архив: 2002.12.23;
Скачать: [xml.tar.bz2];
ВнизРабота со строками и PChar Найти похожие ветки
← →
MegaVolt (2002-12-06 18:29) [0]Вот пример:
<\code>
Function(path:PChar....
var
Drive:pchar;
begin
Drive:="C:";
StrCat(Drive,Path);
if path<>"\" then StrCat(Drive,"\");
StrCat(Drive,"*.*");
Result:=FindFirstFile(Drive,FindData);
end;
Function(path:PChar....
var
Drive:string;
begin
Drive:="C:"+String(path);
if (String(path)<>"\") then Drive:=Drive+"\";
Drive:=Drive+"*.*";
result:= FindFirstFile(Pchar(Drive),FindData);
end;
<\code>
Почему когда я работаю со строками DLLка работает а когда с PChar то не работает. Где я что неправильно делаю?
← →
Diamond Cat (2002-12-06 18:35) [1]а dll-ка у тебя не под си была написана, если под си то она не воспринимает pchar
← →
Юрий Федоров (2002-12-06 18:36) [2]Потому что под PChar нужно выделять память, чего явно не происходит в первом случае
← →
MegaVolt (2002-12-06 18:38) [3]Так это и есть кусок DLLки и написана она на дельфях
← →
Sha (2002-12-06 19:07) [4]Когда пишешь на API, приходится так часто самому
выделять-освобождать память, что прямо-таки устаешь.
Вот если б кто-то это делал за меня...
А может кто-то уже делает?
← →
Antonius (2002-12-06 19:17) [5]я делаю. Могу и за тебя делать. О цене договоримся? :)))
← →
Sha (2002-12-06 19:29) [6]Ох, не люблю я платить. Не люблю даже больше, чем эти PCharы :)
← →
Anatoly Podgoretsky (2002-12-06 19:47) [7]Юрий Федоров © (06.12.02 18:36)
Вообще то он выделяет, но только для двух символов (Drive:="C:";), к тому же в кодовом сегменте.
MegaVolt (06.12.02 18:29)
Какая нужда тебя заставляет заниматься садомохохизмом, второй твой пример нормальный, за исключением этой странной штуки
String(path)<>"\"), но может в этом есть какой то смысл.
← →
Anatoly Podgoretsky (2002-12-06 20:10) [8]Юрий Федоров © (06.12.02 18:36)
Вообще то он выделяет, но только для двух символов (Drive:="C:";), к тому же в кодовом сегменте.
MegaVolt (06.12.02 18:29)
Какая нужда тебя заставляет заниматься садомохохизмом, второй твой пример нормальный, за исключением этой странной штуки
String(path)<>"\"), но может в этом есть какой то смысл.
← →
MegaVolt (2002-12-09 09:32) [9]String(path)<>"\" а что в этой строке не так?
Я просто пытался сделать практически так же как в примере на С++ вот от сюда и получился PChar и WinAPI. Так и чувствовал что не выделяю память под PChar но SetLength не прошло и я решил что дельфя всё за меня сделает а про stralloc strdispose забыл :(
← →
MegaVolt (2002-12-09 12:48) [10]Кстати ошибка пошла из сайта по функциям дельфи www.atrussk.ru/delphi/5/string/str5211.htm
где написано чтоо дельфи под длянные строки выделяет память динамически (и как я понял без моей помощи)
← →
Anatoly Podgoretsky (2002-12-09 12:52) [11]MegaVolt (09.12.02 09:32)
Что не так не знаю, тебе виднее что ты здесь делаешь, но выглядит странно.
← →
MegaVolt (2002-12-09 12:58) [12]Так что именно странно всё целиком или строчка какая? :(
← →
Anatoly Podgoretsky (2002-12-09 13:01) [13]Ответь что ты там делаешь, модет ничего странного и нет, смысл этого действия.
← →
MegaVolt (2002-12-09 14:16) [14]Просто мне приходит путь и его нужно преобразовать так
если "\" нужно "c:\*.*"
а если "\program" нужно "c:\program\*.*"
← →
MegaVolt (2002-12-09 14:51) [15]Кстати если применять строки то придётся таскать за собой delphimm.dll ^(
← →
Fantasist (2002-12-09 23:44) [16]
> где написано чтоо дельфи под длянные строки выделяет память
> динамически
Правильно, но имеются ввиду делфийский тип строки string.
PChar - не является строкой ни в каком виде - это указатель на char. Этот тип, естесственно, не управляется компилятором, как и любой другой указатель.
> Просто мне приходит путь и его нужно преобразовать так
> если "\" нужно "c:\*.*"
> а если "\program" нужно "c:\program\*.*"
Тогда тебе надо писать:
if path^<>"\" then ...
← →
MegaVoltik (2002-12-10 13:08) [17]Fantasist:
возможно так и правильно но вроде всё работает и так. А почему?
← →
Anatoly Podgoretsky (2002-12-10 13:18) [18]MegaVolt (09.12.02 14:16)
Так вот у тебя работает только для "если "\" нужно "c:\*.*"", а для "\program" не будет, поэтому это и казалось странным, теперь уже не странно, это уже точно неправильно, тебе надо проверять последний символ строки на "\", а не всю строку
← →
MegaVoltik (2002-12-10 13:31) [19]Да нет просто без этой проверки если мне пришло "\" по на выходе я получу "c:\\*.*" а вот для "program" получу то что нужно "c:\program\*.*". И чтобы не было двойного слеша когда мне передано "\" я делаю проверку и не добавляю слеш.
Кстати этот пример заработал после того как я выделил память под Drive.
Конечно он может работать некоректно но почему я не понимаю :( Растолкуйте пли-и-из
← →
Anatoly Podgoretsky (2002-12-10 13:40) [20]Нет для "program" ты воолще ничего не получишь, так как if ( String(path)<>"\") then Drive:=Drive+"\"; не будет никогда выполнено, странная часть отмечена жирным
← →
Anatoly Podgoretsky (2002-12-10 13:50) [21]Маленькая ошибка в моем предыдущем сообщении
Точнее ты всегда добавишь слеш в конце, есть он там или нет, то есть для program получишь program\ и для program\ получишь program\\ и если пришло "" то получишь c:*.*
Проверять надо только последний символ строки с удалением пробелов в конце (при необходимости если такое может произойти).
Drive:="C:" + Trim(String(path));
if Drive[Length(Drive)] <> "\" then Drive := Drive + "\";
← →
MegaVolt (2002-12-12 09:21) [22]Да нет не так:
формат данных которые мне приходят таков:
обратный слешь + путь без имени диска без слеша в конце следовательно мне нужно в начале всегда добавлять "c:" без слеша в конце так как он есть в пути. А конце мне нужно добавить "\*.*" и всё бы работало правильно кроме случая пустого пути т.е. мне придёт один обратный слеш и если прогнать его по алгоритму получится "c:\\*.*" так вот чтобы такого небыло я проверяю пришол ли мне один слеш и если пришол то один слешь не добавляю.
← →
Fantasist (2002-12-12 21:37) [23]
> формат данных которые мне приходят таков:
> обратный слешь + путь без имени диска без слеша в конце
>
Значит тебе нужно проверять первый символ (как я и подумал вначале), а значит делать так, как я сказал выше.
← →
MegaVolt (2002-12-13 17:19) [24]Fantasist я понял тебя но что самое интересое моя запись тоже работает т.е. я пишу без ^ а это ни на что не влияет почему?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.12.23;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.007 c