Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-43603
mkf
2004-03-02 16:51
2004.03.14
menu as XP


1-43670
Marina_S
2004-03-03 21:57
2004.03.14
функция log2(x)


1-43428
Unforseen
2004-02-29 14:41
2004.03.14
DLL -> OBJ


1-43548
ser_ega
2004-02-25 18:46
2004.03.14
Взаимодействие прог


1-43522
Аноним
2004-02-27 19:19
2004.03.14
Tray





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский