![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
string -> array of char
Humen © (2003-02-09 13:09:00)Люди, подскажите, как преобразовать string в массив char.
Спасибо!
:) (2003-02-11 13:11:00) [1]
type
TArr=array[0..254] of char;
PArr=^TArr;
Var
S:String[255];
c:char;
...
c:=PArr(@S[1])^[i];
...
DarkGreen (2003-02-11 12:51:00) [2]
> Надеюсь, это Вас убедит?
Угу, сам уже убедился, не стал сюда писать. Понять вот только не могу, какая ему на фиг разница :-/.
> Чудеса? Никаких чудес. Просто IndexOf берет String, а TPropInfo.Name
> объявлено, как ShortString, вот и все. Мы чуть-чуть изменили
> код - и все заработало.
Знакомая ситуация, мы из BP7.0 + TurboVision портировали свои проекты Delphi 6.0 + TV(здесь взяли и малость подправли), так с этими длинными и короткими строками извиняю затра@#$%^&
> Вот и с идентичностью Array-PChar ситуация похожая. Так
> что пишите, как Вам нравится - можете рассчитывать на компилятор,
> можете не рассчитывать, дело Ваше. Только не удивляйтесь
> последствиям.
Согласен, еще раз каюсь и посыпаю голову пеплом :-)
DarkGreen (2003-02-11 12:48:00) [3]
> Надеюсь, это Вас убедит?
Угу, сам уже убедился, не стал сюда писать. Понять вот только не могу, какая ему на фиг разница :-/.
> Чудеса? Никаких чудес. Просто IndexOf берет String, а TPropInfo.Name
> объявлено, как ShortString, вот и все. Мы чуть-чуть изменили
> код - и все заработало.
Знакомая ситуация, мы из BP7.0 + TurboVision портировали свои проекты Delphi 6.0 + TV(здесь взяли и малость подправли), так с этими длинными и короткими строками извиняю затра@#$%^&
Юрий Зотов (2003-02-11 11:45:00) [4]> DarkGreen © (11.02.03 05:40)
А теперь в Вашем же примере меняем всего одну лишь цифру - нижнюю границу массива:
var
A: array[1..79] of Char; // Изменили 0 на что угодно другое.
S: String;
begin
S := "Honk if you know Blaise.";
StrPCopy(A, S);
Canvas.TextOut(10, 10, string(A));
end;
Результат компиляции в D5:
Incompatible types "Array" and "PChar". (!!!!!!!)
Надеюсь, это Вас убедит?
> для делфей, нет разницы между PChar и array of char
Как мы только что видели, у компилятора на этот счет явно иное и весьма недвусмысленное мнение.
Понимаете, ну никак не может не быть разницы между указателем на массив и самим массивом. И это надо четко понимать, даже несмотря на то, что умный компилятор Delphi иногда поступает неформально и рулит по контексту кода, а не по самому коду.
Кстати, неформальная компиляция по контексту кода, а не по самому коду - напрасное, IMHO, нововведение Borland"а. Потому что оно может быть источником труднолокализуемых глюков. И вот реальный пример, когда надежды программиста на интеллект компилятора не оправдались (а в результате мы вчера втроем почти до часу ночи вылавливали ошибку).
var
StringList: TStringList;
PropInfo: PPropInfo;
...
if StringList.IndexOf(PropInfo^.Name) > - 1 then ...
Смотрим под отладчиком:
StringList[0] = "Date";
PropInfo^.Name = "Date";
Казалось бы, все ОК. А ветка then не работает. Проверяем по Ctrl+F7 и видим:
StringList.IndexOf(PropInfo^.Name) = -1 (!!!)
Чудеса? Никаких чудес. Просто IndexOf берет String, а TPropInfo.Name объявлено, как ShortString, вот и все. Мы чуть-чуть изменили код - и все заработало.
В 99% случаев компилятор сам и автоматически разруливает такие вещи. Писавший код программист прекрасно это знал (я с ним знаком и, уверяю Вас, он далеко не новичок), понадеялся на компилятор - и в результате напоролся на оставшийся 1%. А если бы компилятор сразу выдал хотя бы предупреждение и в стиле старого доброго Паскаля потребовал бы явного приведения типа - не было бы никаких проблем.
Вот и с идентичностью Array-PChar ситуация похожая. Так что пишите, как Вам нравится - можете рассчитывать на компилятор, можете не рассчитывать, дело Ваше. Только не удивляйтесь последствиям.
DarkGreen (2003-02-11 09:55:00) [5]
> @A это не PChar, а адрес А
Согласен, в примере действует неявное приведение типов.
> Теперь ближе к вопросу об PChar = это указатель на нультерминированную
> строку (из хелпа A PChar is a pointer to a null-terminated
> string of 8-bit characters.)
> Array of char таким не является, не обязан быть null-terminated
> и если туда и добавлен символ #0 то только для совместимости
> с функциями Виндоус или Дельфи, которые требуют этого символа.
> Более того Array of char не является указателем, а только
> массивом.
Согласен. Просто, до сих пор мне приходится работать в BP7.0 и статические переменные A: array[0..255] of char я стараюсь не объявлять из-за ограниченного размера сегмента данных заменя их A: Pointer или A: PChar и соответственно
A[34] для меня равно PChar(PChar(A)+34)^ поэтому я в своем ответе, просто преобразовал строке к PChar.
2 Anatoly Podgoretsky © & Юрий Зотов ©
Извеняюсь за спор и резкость
Anatoly Podgoretsky (2003-02-11 09:33:00) [6]@A это не PChar, а адрес А
Теперь ближе к вопросу об PChar = это указатель на нультерминированную строку (из хелпа A PChar is a pointer to a null-terminated string of 8-bit characters.)
Array of char таким не является, не обязан быть null-terminatedи если туда и добавлен символ #0 то только для совместимости с функциями Виндоус или Дельфи, которые требуют этого символа. Более того Array of char не является указателем, а только массивом.
С другой стороны для PChar указателя без разницы указывает он на Array of char или на Array of something, string constant, string (PChar(S)) или на любой буфер, например выделенный по GetMem или возвращенный из функции API, лишь бы оно было нультерминировано, если конечно используется по назначению, а не для другой цели.
Насчет непония, извиняюсь может и загнул, впечатление такое создалось.
DarkGreen (2003-02-11 09:22:00) [7]2 Anatoly Podgoretsky © (11.02.03 08:02)
Анатолий, в делфи, первые три параметра, если их размер больше 4 байт (не считая stdcall и т. д.) передаются по ссылке через регистры eax, edx, ecx, поэтому и передается в функцию не array of char, а @A, то есть PChar, но это уже внутренняя реализация.
Про заблуждения и непонимание таких фундаментальных вещей вы конечно загнули :-)
Anatoly Podgoretsky (2003-02-11 08:02:00) [8]Настойчивый ты человек, приводя правильный пример делаешь неверные выводы.
Передается именно PChar, как указатель на массив символов. Внутри функция делает преобразование строки S (кстати тоже указатель), путем пересылки одного массива в другой и возвращает адрес этого массива. Тебя вводит заюлуждене простота и непонимаяние разницы между массивом и указателем на массив.
Разные это вещи. Правдо непонимание тебе не мешает работать, но так будет не во всех этих случае, часто это непонимание приводит к неправильной работе, при передаче адресов массивов черех PChar указатель - это довольно часто повторяемый здесь вопрос.
Danilka (2003-02-11 07:58:00) [9]Humen (10.02.03 18:23)
обьясни толком, чего ты хочешь?
а то тут такой базар уже развели...
и уж точно тебе vkkeyscan не нужен.
для того чтобы узнать код символа используй ord
DarkGreen (2003-02-11 05:40:00) [10]2 Юрий Зотов © (10.02.03 17:25)
Ок, возражения принимаются. Тогда я поправлю свой ответ. Вот это я думаю будет правильно
function StrPCopy(Dest: PChar; const Source: string): PChar;
Еси вы скажете, что параметром ей передается PChar, а не array of char то в дополнение:
uses SysUtils;
var
A: array[0..79] of Char;
S: String;
begin
S := "Honk if you know Blaise.";
StrPCopy(A, S);
Canvas.TextOut(10, 10, string(A));
end;
Пример из Delphi, который показывает, что для делфей, нет разницы между PChar и array of char, то бишь по фиг ему указатель или массив (и именно это я и имел ввиду, когда говорил, что возражения не принимаются).
Да, функция StrPCopy не является reintroduced
Пример взят из Help Delphi 5
Sha (2003-02-10 18:36:00) [11]2 Humen (10.02.03 18:23)
Тогда в ПОТРЕПАТЬСЯ :)))))))))
Humen (2003-02-10 18:23:00) [12]прошу прощения это vkkeyscan все переводит в нижний регистр
Sha (2003-02-10 17:56:00) [13]2 Humen (09.02.03 13:09)
Если только понимаешь, что делаешь:
var
st: string;
sa: array of char;
begin;
sa:=pointer(st);
end;
Юрий Зотов (2003-02-10 17:25:00) [14]> DarkGreen © (10.02.03 13:48)
> Если чел хочет явно преобразовать string в PСhar
Он хотел вовсе не этого. В сабже вопрос сформулирован абсолютно четко и ясно. Без всяких "если".
> то это так делается
Thanks. Непременно воспользуюсь :о)
> Вот ответ на вопрос, как преобразовать стринг в пчар
И этот ответ не имеет никакого отношения к сабжу.
> высказывания типа PChar не есть array of char...
Вот именно. УКАЗАТЕЛЬ есть СКАЛЯРНАЯ переменная, а никакой не массив.
> ...не пренимаются
Здрасьте, приехали! Уж тогда сразу бы так и написали - никакие возражения не принимаются. Было бы еще круче.
DarkGreen (2003-02-10 14:15:00) [15]Сорри за синтаксис, начальство рядом, торопился :-)
Anatoly Podgoretsky (2003-02-10 13:52:00) [16]Принимаются
DarkGreen (2003-02-10 13:48:00) [17]2 Юрий Зотов © (10.02.03 12:20)
Если чел хочет явно преобразовать string в Pchar
то это так делается
var
P: PChar;
s: string;
........
P := PChar(S); // Вот ответ на вопрос, как преобразовать стринг в пчар (высказывания типа PChar не есть array of char не пренимаются
Андрей Сенченко (2003-02-10 13:19:00) [18]viajero (10.02.03 13:15)
Потому что серьезные ветки заканчиваются достаточно быстро одним-двумя серьезными ответами и перестают быть интересными для обсуждения ( в большинстве своем ) - только для чтения и наматывания на ус.
А в таких ветках можно чуток расслабиться ... ну и поупражняться в остроумии :)
В "ПОТРЕПАТЬСЯ" ОДНОЗНАЧНО !
Palladin (2003-02-10 13:16:00) [19]2 Humen
ты скажи нормально для чего тебе нужен массив char?
viajero (2003-02-10 13:15:00) [20]Почему дурацкие ветки всегда самые длинные?