![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
array of Char + string [D7]
maxwam © (2008-03-03 17:58:00)
x1: array [0..15] of Char;
x2: string;
я хочу сделать x1 := x2, как такого лучше всего добиться?
korneley (2008-03-04 00:05:00) [1]
> Eraser © (03.03.08 21:45) [9]
> строки не предназначены для хранения данных.
> Eraser © (03.03.08 22:24) [12]
>в смысле не строковых данных.
То есть строки все же данные. Но строки. Поэтому любые значения, помещаемые в строку, данными быть не перестают, да и ничем не отличаются от таких же, но в других структурах. Строка это только то, что мы интепретируем как строку. А работать, правильно, лучше с функциями, а не закладываться на внутреннее представление.
Eraser (2008-03-03 23:42:00) [2]> [17] korneley © (03.03.08 23:12)
все что угодно можно интерпритировать, как нетипизированный указатель на кусок памяти длиной X.
только не просто так умные люди придумали типизацию данных, imho )
> [18] DVM © (03.03.08 23:17)
> Как трактовать этот набор байт - другой вопрос.
именно, для того и придумали строковые функции, а самому изобретать велосипед хоть никто и не запрещает, но потом после [2] не стОит удивляться, что через пол годика, после релиза 2008, на форуме начнут появлятся соответствующие вопросы )
Palladin (2008-03-03 23:20:00) [3]
>clickmaker © (03.03.08 19:07) [8]
массив должен содержать 16 значимых символов, а не 15 и ноль в конце именно потому, что он задекларирован так и никак иначе. и неважно что там. array [0..15] of char или array [0..3] of cardinal.
DVM (2008-03-03 23:17:00) [4]
> это набор символов, при этом количество памяти, занимаемое
> каждым символом может отличаться.
Все верно. Причем всегда должна быть известна длина этого набора символов. Или как то помечен конец.
Поэтому строкой вообще говоря можно считать любую область памяти с любыми произвольными данными известной нам длины. И известным началом и концом. Как трактовать этот набор байт - другой вопрос.
korneley (2008-03-03 23:12:00) [5]
> Eraser © (03.03.08 23:01) [16]
> это набор символов, при этом
> количество памяти, занимаемое каждым символом может отличаться.
А по моему строка это тип данных, характеризующийся своими правилами обработки и интерпретации результата.
> для работы со строками надо использовать строковые функции.
Тут согласен, особенно, если заменить "надо" на "рекомендуется".
Eraser (2008-03-03 23:01:00) [6]> [15] DVM © (03.03.08 22:49)
это набор символов, при этом количество памяти, занимаемое каждым символом может отличаться.
для работы со строками надо использовать строковые функции.
DVM (2008-03-03 22:49:00) [7]
> Eraser ©
что такое по твоему строка?
Eraser (2008-03-03 22:47:00) [8]вот это открытие.
DVM (2008-03-03 22:26:00) [9]
> в смысле не строковых данных.
строковые от не строковых данных отличаются лишь тем что мы сами их так обзываем.
Eraser (2008-03-03 22:24:00) [10]> В каком смысле?
в смысле не строковых данных.
DVM (2008-03-03 22:23:00) [11]
> maxwam (03.03.08 17:58)
Вроде так тоже должно получиться (не проверял)
x2:=strpas(PChar(@x1));
korneley (2008-03-03 21:50:00) [12]
> Eraser © (03.03.08 21:45) [9]
> строки не предназначены для хранения данных.
Эта... В каком смысле? Байты, призванные олицетворять символы, поражены в правах называться данными? Заинтригован...
Eraser (2008-03-03 21:45:00) [13]строки не предназначены для хранения данных.
clickmaker (2008-03-03 19:07:00) [14]
> у нас не ASCIIZ, WASCIIZ сторка, у нас массив из 16 символов
у нас строка, которую мы записываем в массив, который станет ASCIIZ после этого
Palladin (2008-03-03 19:02:00) [15]
> clickmaker © (03.03.08 18:51) [6]
LPTSTR lstrcpyn(
LPTSTR lpString1, // address of target buffer
LPCTSTR lpString2, // address of source string
int iMaxLength // number of bytes or characters to copy
);
Parameters
lpString1
Points to a buffer into which the function copies characters. The buffer must be large enough to contain the number of bytes (ANSI version) or characters (Unicode version) specified by iMaxLength, including room for a terminating null character.
...
я бы не стал поправлять [4]
у нас не ASCIIZ, WASCIIZ сторка, у нас массив из 16 символов
clickmaker (2008-03-03 18:51:00) [16]
> [5] Palladin © (03.03.08 18:44)
lstrcpyn(x1, PChar(x2), Sizeof(x1)); // ANSI
lstrcpynW(x1, PWChar(x2), Sizeof(x1) shr 1); // Unicode
Palladin (2008-03-03 18:44:00) [17]
> DiamondShark © (03.03.08 18:27) [4]
это не совсем то, что нужно, массив содержит 16 символов и не оканчивается нулем. если уж и мерятся органами, то должно быть так
l:=Length(x2);
If l>=16 Then Move(x2[1],x1,16) Else
Begin
Move(x2[1],x1,l);
ZeroMem(x1[l],16-l); // на всякий случай
End;
ну а с учетем модных супер нововведений, на которые сразу всем миром перейдут, рассказынных многоуважаемым Eraser © (03.03.08 18:22) [3], который перейдет самый первый на cds2008 :))), то думаю возможно будет организовать нечто подобное
l:=Length(x2);
If l>=32 Then Move(x2[1],x1,32) Else
Begin
Move(x2[1],x1,l*2);
ZeroMem(x1[l],32-l*2); // на всякий случай
End;
это конечно при условии что char вдруг станет widechar по-умолчанию, а string соответсвенно widestring... хотя там еще и utf может наблюдаться... так что мрак...
DiamondShark (2008-03-03 18:27:00) [18]StrPLCopy(x1, x2, 15)
Eraser (2008-03-03 18:22:00) [19]
> move(x2[1],x1,16);
в свете выхода CDS2008 с поддержкой unicode так бы не стОит делать, imho )
Palladin (2008-03-03 18:02:00) [20]о блин... гоню... наоборот же...
move(x2[1],x1,16);