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

Вниз

array of Char + string   Найти похожие ветки 

 
maxwam   (2008-03-03 17:58) [0]

x1: array [0..15] of Char;
x2: string;


я хочу сделать x1 := x2, как такого лучше всего добиться?


 
Palladin ©   (2008-03-03 18:00) [1]

ты не поверишь
x2:=x1;


 
Palladin ©   (2008-03-03 18:02) [2]

о блин... гоню... наоборот же...

move(x2[1],x1,16);


 
Eraser ©   (2008-03-03 18:22) [3]


> move(x2[1],x1,16);

в свете выхода CDS2008 с поддержкой unicode так бы не стОит делать, imho )


 
DiamondShark ©   (2008-03-03 18:27) [4]

StrPLCopy(x1, x2, 15)


 
Palladin ©   (2008-03-03 18:44) [5]


> 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 может наблюдаться... так что мрак...


 
clickmaker ©   (2008-03-03 18:51) [6]


> [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 19:02) [7]


> 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 19:07) [8]


> у нас не ASCIIZ, WASCIIZ сторка, у нас массив из 16 символов

у нас строка, которую мы записываем в массив, который станет ASCIIZ после этого


 
Eraser ©   (2008-03-03 21:45) [9]

строки не предназначены для хранения данных.


 
korneley ©   (2008-03-03 21:50) [10]


> Eraser ©   (03.03.08 21:45) [9]
> строки не предназначены для хранения данных.

Эта... В каком смысле? Байты, призванные олицетворять символы, поражены в правах называться данными? Заинтригован...


 
DVM ©   (2008-03-03 22:23) [11]


> maxwam   (03.03.08 17:58)  

Вроде так тоже должно получиться (не проверял)

x2:=strpas(PChar(@x1));


 
Eraser ©   (2008-03-03 22:24) [12]

> В каком смысле?

в смысле не строковых данных.


 
DVM ©   (2008-03-03 22:26) [13]


> в смысле не строковых данных.

строковые от не строковых данных отличаются лишь тем что мы сами их так обзываем.


 
Eraser ©   (2008-03-03 22:47) [14]

вот это открытие.


 
DVM ©   (2008-03-03 22:49) [15]


> Eraser ©

что такое по твоему строка?


 
Eraser ©   (2008-03-03 23:01) [16]

> [15] DVM ©   (03.03.08 22:49)

это набор символов, при этом количество памяти, занимаемое каждым символом может отличаться.
для работы со строками надо использовать строковые функции.


 
korneley ©   (2008-03-03 23:12) [17]


> Eraser ©   (03.03.08 23:01) [16]
> это набор символов, при этом
> количество памяти, занимаемое каждым символом может отличаться.

А по моему строка это тип данных, характеризующийся своими правилами обработки и интерпретации результата.

> для работы со строками надо использовать строковые функции.

Тут согласен, особенно, если заменить "надо" на "рекомендуется".


 
DVM ©   (2008-03-03 23:17) [18]


> это набор символов, при этом количество памяти, занимаемое
> каждым символом может отличаться.

Все верно. Причем всегда должна быть известна длина этого набора символов. Или как то помечен конец.

Поэтому строкой вообще говоря можно считать любую область памяти с любыми произвольными данными известной нам длины. И известным началом и концом. Как трактовать этот набор байт - другой вопрос.


 
Palladin ©   (2008-03-03 23:20) [19]


>clickmaker ©   (03.03.08 19:07) [8]

массив должен содержать 16 значимых символов, а не 15 и ноль в конце именно потому, что он задекларирован так и никак иначе. и неважно что там. array [0..15] of char или array [0..3] of cardinal.


 
Eraser ©   (2008-03-03 23:42) [20]

> [17] korneley ©   (03.03.08 23:12)

все что угодно можно интерпритировать, как нетипизированный указатель на кусок памяти длиной X.
только не просто так умные люди придумали типизацию данных, imho )

> [18] DVM ©   (03.03.08 23:17)


> Как трактовать этот набор байт - другой вопрос.

именно, для того и придумали строковые функции, а самому изобретать велосипед хоть никто и не запрещает, но потом после [2] не стОит удивляться, что через пол годика, после релиза 2008, на форуме начнут появлятся соответствующие вопросы )


 
korneley ©   (2008-03-04 00:05) [21]


> Eraser ©   (03.03.08 21:45) [9]
> строки не предназначены для хранения данных.


> Eraser ©   (03.03.08 22:24) [12]
>в смысле не строковых данных.

То есть строки все же данные. Но строки. Поэтому любые значения, помещаемые в строку, данными быть не перестают, да и ничем не отличаются от таких же, но в других структурах. Строка это только то, что мы интепретируем как строку. А работать, правильно, лучше с функциями, а не закладываться на внутреннее представление.



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

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

Наверх





Память: 0.5 MB
Время: 0.233 c
2-1204743273
timekiller
2008-03-05 21:54
2008.03.30
TDateTimePicker позиция курсора и текст после этой позиции


15-1203318814
Шмелъ
2008-02-18 10:13
2008.03.30
Периодика?


2-1204617905
Alex_C
2008-03-04 11:05
2008.03.30
Вызов события OnClose дочерних форм


2-1204410233
Dizark
2008-03-02 01:23
2008.03.30
Как получить номер записи из DBGrid


15-1203244125
avptt
2008-02-17 13:28
2008.03.30
подхватил троян





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