Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.11;
Скачать: CL | DM;

Вниз

Перевод Array of char в String   Найти похожие ветки 

 
Begu   (2005-06-15 04:15) [0]

как правильно реализовать сабж?
есть:
c: array[1..10] of char;
s: string;

FillChar(c, SizeOf(c), 0);
при присвоении s := c; длина s становится = 10, даже если в массиве одни 0.


 
Просто Джо ©   (2005-06-15 04:17) [1]


> длина s становится = 10, даже если в массиве одни 0.

А сколько должно быть по-твоему?


 
Begu   (2005-06-15 04:20) [2]

должно быть 0


 
Просто Джо ©   (2005-06-15 04:30) [3]

Переменная типа string может хранить любые символы. Символ с кодом 0 в ней не является признаком конца строки. Ты перепутал string и null-terminated string.


 
Просто Джо ©   (2005-06-15 04:36) [4]

Вдогонку. Длина строки типа string хранится отдельно, а именно в ячейке размером в двойное слово по относительному адресу [Адрес_строки-4]. Пройдись отладчиком по телу встроенной процедуру LStrLen и все поймешь.

Заключительный символ с кодом 0 добавляется к строкам для совместимости с C-шными строками, используемыми в Windows, т.е, указатель на массив символов PChar.
Возможно, не слишком корректноя формулировка, что-то я спать хочу :)


 
Begu   (2005-06-15 04:38) [5]

я не теорию спрашивал, а задал конкретный вопрос


 
Просто Джо ©   (2005-06-15 04:38) [6]


>  [5] Begu   (15.06.05 04:38)
> я не теорию спрашивал, а задал конкретный вопрос

А из теории слабо сделать выводы?


 
Просто Джо ©   (2005-06-15 04:49) [7]


> [2] Begu   (15.06.05 04:20)
> должно быть 0

Так с какого, прости, перепугу, должно быть 0?


 
Begu   (2005-06-15 04:50) [8]

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


 
Просто Джо ©   (2005-06-15 04:51) [9]


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

Они реализованы. И заодно, ответь, пожалуйста на [7].


 
Begu   (2005-06-15 04:52) [10]

>Просто Джо ©   (15.06.05 04:49) [7]

потому что я думал, что компилятор при преобразовании воспринимает array of char как PChar


 
Begu   (2005-06-15 04:52) [11]

Удалено модератором
Примечание: МАТ, нападки


 
Просто Джо ©   (2005-06-15 04:54) [12]


> я думал, что компилятор при преобразовании воспринимает
> array of char как PChar

Нужно прежде чем думать, хелп прочитать. А после этого объявить массив по-человечески, а именно:

c: array [0..10] of char;


 
Просто Джо ©   (2005-06-15 04:57) [13]

Удалено модератором


 
Begu   (2005-06-15 04:59) [14]

Удалено модератором


 
Просто Джо ©   (2005-06-15 05:00) [15]

Удалено модератором


 
Begu   (2005-06-15 05:05) [16]

Удалено модератором


 
Просто Джо ©   (2005-06-15 05:07) [17]

Удалено модератором


 
Begu   (2005-06-15 05:09) [18]

Удалено модератором


 
-=XP=- ©   (2005-06-15 07:28) [19]

потому что я думал

Это Вы еще пока только раздел "Введение" подумали. Думайте дальше, до раздела "Строковый тип данных". Там, на последних страницах, даны примеры - отталкивайтесь от них.

s := PChar(c[Low(c)]);


 
-=XP=- ©   (2005-06-15 07:38) [20]

Блин, еще не проснулся, а вы тут вопросами неумными грузите.

s := PChar(@c[Low(c)]);


 
Begu   (2005-06-15 07:53) [21]

вот и видно, что ты только проснулся :)
ответ то уже был раньше:
array должен с 0 начинаться, а если с 1, то так:
s := PChar(@c);


 
VMcL ©   (2005-06-15 07:56) [22]

Удалено модератором


 
Begu   (2005-06-15 08:00) [23]

>VMcL ©   (15.06.05 07:56) [22]
это ты о чем, какая матчасть?


 
Alx2 ©   (2005-06-15 08:00) [24]

>Begu   (15.06.05 07:53) [21]

s := PChar(@c);

и неважно с чего индекс начинается.


 
Begu   (2005-06-15 08:04) [25]

>Alx2 ©   (15.06.05 08:00) [24]
а ты проверь с 1


 
Begu   (2005-06-15 08:06) [26]

>Alx2 ©   (15.06.05 08:00) [24]
эт я уже спать начинаю, я так и сказал
а если с 0 начинается, то можно так s := c;


 
Alx2 ©   (2005-06-15 08:06) [27]

>Begu   (15.06.05 08:04) [25]

Var D : array [10..21] of char;
  k : integer;
Begin
for k := Low(D) to High(D) do D[k]:=Char((k  mod 10) +byte("0"));
D[High(D)]:=#0;
ShowMessage(PChar(@D));
End;


 
Alx2 ©   (2005-06-15 08:08) [28]

>Begu   (15.06.05 08:06)
>а если с 0 начинается, то можно так s := c;

Var D : array [12..21] of char;
  k : integer;
  s : string;
Begin
for k := Low(D) to High(D) do D[k]:=Char((k  mod 10) +byte("0"));
s := D;
ShowMessage(S);
End;


 
Begu   (2005-06-15 08:11) [29]

и что ты хотел этим сказать, кроме того, что сказано выше?


 
Alx2 ©   (2005-06-15 08:11) [30]

Или сразу

Var D : array [12..21] of char;
  k : integer;
Begin
for k := Low(D) to High(D) do D[k]:=Char((k  mod 10) +byte("0"));
ShowMessage(D);
End;


Так как к типу string автоматом преобразуется.


 
Alx2 ©   (2005-06-15 08:11) [31]

>Begu   (15.06.05 08:11)
Повторяю:
"и неважно с чего индекс начинается."


 
Begu   (2005-06-15 08:14) [32]

а ты сделай такую простую вещь:

c: array[1..10] of char;
s: string;

FillChar(c, SizeOf(c), 0);
с[1] := "a";
s := c;

теперь поставь точку останова на последнюю строку и посмотри чему у тебя s стала равна


 
Alx2 ©   (2005-06-15 08:21) [33]

Begu   (15.06.05 8:14) [32]

Да, согласен. В этом случае разница есть.


 
Zeqfreed ©   (2005-06-15 08:25) [34]

Begu   (15.06.05 8:14) [32]
Alx2 имеет в виду, что преобразовать массив Char"ов можно к типу String не зависимо от начального индекса массива. О том, что методы будут одинаковыми никто не говорил.



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

Текущий архив: 2005.07.11;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.058 c
1-1119443714
Ded Moroz
2005-06-22 16:35
2005.07.11
Transparent Background


5-1089198820
RagE
2004-07-07 15:13
2005.07.11
не срабатывает таймер


14-1118042670
GrayHairs
2005-06-06 11:24
2005.07.11
Автоматизация внутрицехового учета.Термоэтикетки-2.


14-1118405773
TUser
2005-06-10 16:16
2005.07.11
Угадайка


14-1118758906
Soft
2005-06-14 18:21
2005.07.11
Как вам оформление и техническое решение?