Форум: "Основная";
Текущий архив: 2004.03.14;
Скачать: [xml.tar.bz2];
ВнизCopyFile Найти похожие ветки
← →
Builder (2004-03-03 02:26) [0]Здравствуйте, столкнулся с такой проблеммой - делаю:
copyfile("D:\a","C:\a",true); // все нормально, но!
var
s: STRING //причем не важно string или shotstring
begin
S:=edit1.text;
copyfile("D:\a",S,true);
end.
несоответствие типов String и TAnsiChar
если объявляю: S: TAnsiChar;, то уже у Edit"а :((тоже самое (что впрочем естественно), а вот как выпутаться не понимаю...
← →
Builder (2004-03-03 02:26) [1]И еще, может кто обяснить что такое TAnsiChar?
← →
Defunct (2004-03-03 02:37) [2]
Var S:String
Begin
S:=Edit1.Text;
CopyFile("D:\a", PChar(S), True);
...
PChar отличпется от String тем, что последним символом такой строки будет символ #0. Не забываем также что и PChar и String являются указателем на строку.
← →
Германн (2004-03-03 03:22) [3]2 Defunct © (03.03.04 02:37) [2]
Выражайтесь, плиииз, точнее. PChar от String отличается гораздо более! Кроме того и String есть разные! А то что они все являются "указателем на строку", имхо ясно и ежу.
А пример ответа, абсолютно правильный. Имхо.
← →
Defunct (2004-03-03 03:30) [4]> Выражайтесь, плиииз, точнее. PChar от String отличается гораздо более!
Угу, но для файловой системы принципиальным является именно последний #0.
← →
Германн (2004-03-03 03:51) [5]Может я чего-то не понял. Может я вообще "Даун"?, но причем тут связь "файловой системы" и "последнего #0"?
← →
Defunct (2004-03-03 04:03) [6]Германн © (03.03.04 03:51) [5]
Поясню:
Так повелось, что еще с DOS 1.0 в роли имени файла выступала AsciiZ строка. В Win32 эта особенность не изменилась. Используя напрямую функцию Kernel32 (CopyFile) в роли имен файлов выступают две именно AsciiZ строки. Надеюсь что такое AsciiZ строка Вы в курсе, на всякий случай пример:
DB "myfile.txt"+#0
← →
Германн (2004-03-03 04:44) [7]2 Defunct © (03.03.04 04:03) [6]
Что именно "выступало в роли имени файла" я не знаю. Да и бог с ним! Что такое "роль имени файла"?
В DOS, если уж пошла "пьяная разборка", относитетельно "имен файлов", существовала FAT. Переводить не буду. Никаких #0 в ней не было. Был список файлов с указанием начального кластера и размера. Нигде в DOS - напрямую, не было Ascizz строк!
Если же имеется в виду параметры типа "LPCTSTR", так надо сразу указать, что они значат.
← →
Defunct (2004-03-03 05:12) [8]> В DOS, если уж пошла "пьяная разборка", относитетельно "имен файлов", существовала FAT.
Причем тут FAT?
Не надо путать FAT и имя файла, эти понятия несовместимы. Имя файла есть и в NTFS, и в HPFS, в любой FS.
Никаких #0 в ней не было.
В FAT может быть что угодно, это просто таблица цепочек с номерами кластеров. Кстати, 0 в FAT обозначает свободный кластер. Адресация диска начинается с кластера №2.
Возвращаясь к теме:
В DOS было даже понятие AsciiZZ (это чтоб ParamStr(0) выловить из PSP). Функции открытия и создания файлов:
AH = 3Ch (создание)
AH = 3Dh (открытие)
DS:DX - адрес AsciiZ строки имени файла.
Был список файлов с указанием начального кластера и размера. Нигде в DOS - напрямую, не было Ascizz строк!
Опять же причем тут список? Когда речь идет о функциях с полным именем файла.
Для ликбеза советую открыть TechHelp и освежить память о функциях DOS (Int 21h), а также о структуре логических дисков.
← →
Defunct (2004-03-03 05:36) [9]Германн © (03.03.04 04:44) [7]
Что именно "выступало в роли имени файла" я не знаю. Да и бог с ним! Что такое "роль имени файла"?
Может я выразился не однозначно.
Давайте перефразируем: ... в качестве имени файла выступает AsciiZ строка ...
← →
Юрий Зотов (2004-03-03 06:01) [10]> Defunct © (03.03.04 02:37) [2]
> PChar отличпется от String тем, что последним символом такой
> строки будет символ #0.
Все же, вот как раз ЭТИМ они и НЕ отличаются (поскольку завершающий ноль есть и там, и там). Они ДРУГИМ отличаются.
> Defunct © (03.03.04 04:03) [6]
> Используя напрямую функцию Kernel32 (CopyFile) в роли имен
> файлов выступают две именно AsciiZ строки.
Все же, не сами ASCIIZ-строки, а указатели на них.
← →
Defunct (2004-03-03 06:31) [11]> Все же, вот как раз ЭТИМ они и НЕ отличаются (поскольку завершающий ноль есть и там, и там). Они ДРУГИМ отличаются.
Заблуждался относительно String, проверил действительно #0 есть (перепутал с ShortString). Ну а чем же тогда (физически получается ничем), разве только способом работы с такими стороками компилятора и директивой {$H-}?
>> Используя напрямую функцию Kernel32 (CopyFile) в роли имен
>> файлов выступают две именно AsciiZ строки.
> Все же, не сами ASCIIZ-строки, а указатели на них.
Спасибо что поправили, разумеется указатели.
← →
Юрий Зотов (2004-03-03 18:58) [12]> Defunct © (03.03.04 06:31) [11]
> Ну а чем же тогда (физически получается ничем)
PChar - чистый указатель на тело строки и более ничего.
String - указатель на структуру вида:
Смещение Содержимое
-8 Счетчик ссылок
-4 Длина в байтах
0 Начало тела ASCIIZ-строки
Как видим, физически PChar и String действительно не отличаются ничем (в смысле того, что они содержат один и тот же адрес) - и понятно, почему (чтобы сделать String совместимым с сишными строками). Но вот логически разница между ними огромная - управляемое время жизни.
← →
Defunct (2004-03-03 19:18) [13]Юрий Зотов © (03.03.04 18:58) [12]
Спасибо, прояснили ситуацию. Сам бы я не догадался залезть по смещению -4 и -8, а в хелпе об этом не говорится.
← →
VMcL (2004-03-03 20:24) [14]>>Defunct © (03.03.04 19:18) [13]
Вобщем-то говорится:
F1 | Index | "Long strings"
AnsiString, also called a long string, represents a dynamically allocated string whose maximum length is limited only by available memory. It uses 8-bit ANSI characters.
A long-string variable is a pointer occupying four bytes of memory. When the variable is empty—that is, when it contains a zero-length string—the pointer is nil and the string uses no additional storage. When the variable is nonempty, it points to a dynamically allocated block of memory that contains the string value, a 32-bit length indicator, and a 32-bit reference count. This memory is allocated on the heap, but its management is entirely automatic and requires no user code.
Because long-string variables are pointers, two or more of them can reference the same value without consuming additional memory. The compiler exploits this to conserve resources and execute assignments faster. Whenever a long-string variable is destroyed or assigned a new value, the reference count of the old string (the variable’s previous value) is decremented and the reference count of the new value (if there is one) is incremented; if the reference count of a string reaches zero, its memory is deallocated. This process is called reference-counting. When indexing is used to change the value of a single character in a string, a copy of the string is made if—but only if—its reference count is greater than one. This is called copy-on-write semantics.
P.S.
А смещения в Help"е не приводятся, потому как считаются Borland"ом зависимыми от версии компилятора (уже много версий подряд :)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.03.14;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.011 c