Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.02.20;
Скачать: [xml.tar.bz2];

Вниз

string -> array of char   Найти похожие ветки 

 
Humen   (2003-02-09 13:09) [0]

Люди, подскажите, как преобразовать string в массив char.
Спасибо!


 
vlad   (2003-02-09 13:14) [1]

var i:integer;
s:string;
ch:array[0..255] of char;
for i:=0 to length(s) do
ch[i]:=s[i];


 
Anatoly Podgoretsky   (2003-02-09 13:29) [2]

Он как бы и есть массив char, автоматически управляемый.


 
uw   (2003-02-09 13:45) [3]

>vlad (09.02.03 13:14)

ch[length(s) + 1] := #0;


 
uw   (2003-02-09 13:48) [4]

>uw © (09.02.03 13:45)

Ошибочка вышла!


 
Anatoly Podgoretsky   (2003-02-09 14:06) [5]

А это Саид как прикажешь понимать
for i:= 0 to length(s) do
ch[i]:=s[ i];


 
DarkGreen   (2003-02-09 15:31) [6]

2 Humen (09.02.03 13:09)
var
S: string;
....
.... = PChar(S); //Вот тебе array of char
....


 
Юрий Зотов   (2003-02-09 15:49) [7]

Сколько мнений...

> как преобразовать string в массив char.

Да никак не надо преобразовывать. Строка - это УЖЕ и есть массив символов. См. Anatoly Podgoretsky © (09.02.03 13:29) и любую книжку по Паскалю.


 
DarkGreen   (2003-02-09 16:33) [8]

Согласен, но при передачи строки в функцию, которой требуется параметр PChar, необходимо делать преведение типов PChar(S)


 
Anatoly Podgoretsky   (2003-02-09 17:16) [9]

Ну и что - надо так надо.


 
Юрий Зотов   (2003-02-10 12:20) [10]

> DarkGreen © (09.02.03 16:33)

Да, только какое отношение это имеет к сабжу? Разве в вопросе есть хоть слово о вызове функций?


 
han_malign   (2003-02-10 12:37) [11]

А для константных строк еще и это проходит:
program res;
{$APPTYPE CONSOLE}
var ch: array[0..255]of char;
begin
ch:="Helo World!";
Writeln(ch);
end.


 
Anatoly Podgoretsky   (2003-02-10 12:46) [12]

han_malign © (10.02.03 12:37)
Это есть преобразование string в массив char?


 
Humen   (2003-02-10 12:54) [13]

>var i:integer;
s:string;
ch:array[0..255] of char;
for i:=0 to length(s) do
ch[i]:=s[i];

Эта ф-ция переводит все символы в нижний регистр...


 
MBo   (2003-02-10 12:59) [14]

>Эта ф-ция переводит все символы в нижний регистр
Не знал, надо будет воспользоваться ;)))


 
Андрей Сенченко   (2003-02-10 13:04) [15]

Мастера ! Прекратите издеваться над народом :)


 
Danilka   (2003-02-10 13:07) [16]

Humen (10.02.03 12:54)
правда???
а может она вываливается с ошибкой, "аццесс виолейшон"????


 
Андрей Сенченко   (2003-02-10 13:12) [17]

Danilka © (10.02.03 13:07)

Нет. Она переводит и увидев что натворила - сразу вываливается. Чтобы MBo © не воспользовался


 
MBo   (2003-02-10 13:14) [18]

>Humen
В общем, лучше будет сказать, какая у тебя задача


 
viajero   (2003-02-10 13:15) [19]

Почему дурацкие ветки всегда самые длинные?


 
Palladin   (2003-02-10 13:16) [20]

2 Humen
ты скажи нормально для чего тебе нужен массив char?


 
Андрей Сенченко   (2003-02-10 13:19) [21]

viajero (10.02.03 13:15)

Потому что серьезные ветки заканчиваются достаточно быстро одним-двумя серьезными ответами и перестают быть интересными для обсуждения ( в большинстве своем ) - только для чтения и наматывания на ус.
А в таких ветках можно чуток расслабиться ... ну и поупражняться в остроумии :)

В "ПОТРЕПАТЬСЯ" ОДНОЗНАЧНО !


 
DarkGreen   (2003-02-10 13:48) [22]

2 Юрий Зотов © (10.02.03 12:20)
Если чел хочет явно преобразовать string в Pchar
то это так делается

var
P: PChar;
s: string;
........
P := PChar(S); // Вот ответ на вопрос, как преобразовать стринг в пчар (высказывания типа PChar не есть array of char не пренимаются


 
Anatoly Podgoretsky   (2003-02-10 13:52) [23]

Принимаются


 
DarkGreen   (2003-02-10 14:15) [24]

Сорри за синтаксис, начальство рядом, торопился :-)


 
Юрий Зотов   (2003-02-10 17:25) [25]

> DarkGreen © (10.02.03 13:48)

> Если чел хочет явно преобразовать string в PСhar
Он хотел вовсе не этого. В сабже вопрос сформулирован абсолютно четко и ясно. Без всяких "если".

> то это так делается
Thanks. Непременно воспользуюсь :о)

> Вот ответ на вопрос, как преобразовать стринг в пчар
И этот ответ не имеет никакого отношения к сабжу.

> высказывания типа PChar не есть array of char...
Вот именно. УКАЗАТЕЛЬ есть СКАЛЯРНАЯ переменная, а никакой не массив.

> ...не пренимаются
Здрасьте, приехали! Уж тогда сразу бы так и написали - никакие возражения не принимаются. Было бы еще круче.


 
Sha   (2003-02-10 17:56) [26]

2 Humen (09.02.03 13:09)
Если только понимаешь, что делаешь:

var
st: string;
sa: array of char;
begin;
sa:=pointer(st);
end;


 
Humen   (2003-02-10 18:23) [27]

прошу прощения это vkkeyscan все переводит в нижний регистр


 
Sha   (2003-02-10 18:36) [28]

2 Humen (10.02.03 18:23)
Тогда в ПОТРЕПАТЬСЯ :)))))))))


 
DarkGreen   (2003-02-11 05:40) [29]

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


 
Danilka   (2003-02-11 07:58) [30]

Humen (10.02.03 18:23)
обьясни толком, чего ты хочешь?
а то тут такой базар уже развели...
и уж точно тебе vkkeyscan не нужен.
для того чтобы узнать код символа используй ord


 
Anatoly Podgoretsky   (2003-02-11 08:02) [31]

Настойчивый ты человек, приводя правильный пример делаешь неверные выводы.
Передается именно PChar, как указатель на массив символов. Внутри функция делает преобразование строки S (кстати тоже указатель), путем пересылки одного массива в другой и возвращает адрес этого массива. Тебя вводит заюлуждене простота и непонимаяние разницы между массивом и указателем на массив.
Разные это вещи. Правдо непонимание тебе не мешает работать, но так будет не во всех этих случае, часто это непонимание приводит к неправильной работе, при передаче адресов массивов черех PChar указатель - это довольно часто повторяемый здесь вопрос.


 
DarkGreen   (2003-02-11 09:22) [32]

2 Anatoly Podgoretsky © (11.02.03 08:02)
Анатолий, в делфи, первые три параметра, если их размер больше 4 байт (не считая stdcall и т. д.) передаются по ссылке через регистры eax, edx, ecx, поэтому и передается в функцию не array of char, а @A, то есть PChar, но это уже внутренняя реализация.
Про заблуждения и непонимание таких фундаментальных вещей вы конечно загнули :-)


 
Anatoly Podgoretsky   (2003-02-11 09:33) [33]

@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:55) [34]


> @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 © & Юрий Зотов ©
Извеняюсь за спор и резкость


 
Юрий Зотов   (2003-02-11 11:45) [35]

> 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 12:48) [36]


> Надеюсь, это Вас убедит?

Угу, сам уже убедился, не стал сюда писать. Понять вот только не могу, какая ему на фиг разница :-/.
> Чудеса? Никаких чудес. Просто IndexOf берет String, а TPropInfo.Name
> объявлено, как ShortString, вот и все. Мы чуть-чуть изменили
> код - и все заработало.

Знакомая ситуация, мы из BP7.0 + TurboVision портировали свои проекты Delphi 6.0 + TV(здесь взяли и малость подправли), так с этими длинными и короткими строками извиняю затра@#$%^&



 
DarkGreen   (2003-02-11 12:51) [37]


> Надеюсь, это Вас убедит?

Угу, сам уже убедился, не стал сюда писать. Понять вот только не могу, какая ему на фиг разница :-/.
> Чудеса? Никаких чудес. Просто IndexOf берет String, а TPropInfo.Name
> объявлено, как ShortString, вот и все. Мы чуть-чуть изменили
> код - и все заработало.

Знакомая ситуация, мы из BP7.0 + TurboVision портировали свои проекты Delphi 6.0 + TV(здесь взяли и малость подправли), так с этими длинными и короткими строками извиняю затра@#$%^&


> Вот и с идентичностью Array-PChar ситуация похожая. Так
> что пишите, как Вам нравится - можете рассчитывать на компилятор,
> можете не рассчитывать, дело Ваше. Только не удивляйтесь
> последствиям.


Согласен, еще раз каюсь и посыпаю голову пеплом :-)


 
:)   (2003-02-11 13:11) [38]


type
TArr=array[0..254] of char;
PArr=^TArr;
Var
S:String[255];
c:char;

...
c:=PArr(@S[1])^[i];
...




Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.02.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.008 c
9-63463
xMagicx
2002-08-05 19:24
2003.02.20
Изометрический движок


1-63678
NOE
2003-02-11 17:22
2003.02.20
Отрезок времени меньше 1 милисекунды


7-63873
Status_I
2002-12-15 03:22
2003.02.20
Установка шрифта


3-63504
z_olga_al
2003-02-02 16:10
2003.02.20
SQL


6-63720
really_Deflorator
2002-12-28 23:13
2003.02.20
Поиск сервера в сети





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