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

Вниз

Тип AniString   Найти похожие ветки 

 
Германн ©   (2011-05-13 02:30) [0]

Напомните мне пожалуйста какой смысл имеет (если имеет) для данного типа символ #0. Конкретно, функция Length его учитывает или нет?


 
MBo ©   (2011-05-13 05:25) [1]

>функция Length его учитывает или нет?
Нет


 
han_malign   (2011-05-13 08:54) [2]


> >функция Length его учитывает или нет?
> Нет

char(0) - является допустимым символом String в любом месте, при этом String неявно дополнено нулевым символом...

Length("123"#0"4") = 5
lstrlen(PChar("123"#0"4")) = 3
PChar("123"#0"4")[5] = #0 //без AV

Length( String( PChar("123"#0"4") ) ) = 3
SetString(s, PChar("123"#0"4"), 5); Length(s) = 5

З.Ы. фишечка синтаксиса - char(0)=#0=^@ (#13#10=#$D#$A=^M^J)


 
RWolf ©   (2011-05-13 09:27) [3]


> han_malign   (13.05.11 08:54) [2]

^символ — удобная вещь, спасибо.
//судя по тому, что она не подсвечивается редактором, о ней не знают даже сами разработчики Delphi.


 
Anatoly Podgoretsky ©   (2011-05-13 09:35) [4]

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


 
RWolf ©   (2011-05-13 09:41) [5]


> Anatoly Podgoretsky ©   (13.05.11 09:35) [4]

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


 
Anatoly Podgoretsky ©   (2011-05-13 09:45) [6]

Да какая разница сколько их работает, того который не знает базового синтаксиса можно уволить, как некомпетентного и его деньги отдать тому кто знает.


 
Anatoly Podgoretsky ©   (2011-05-13 09:46) [7]


> Напомните мне пожалуйста какой смысл имеет (если имеет)
> для данного типа символ #0. Конкретно, функция Length его
> учитывает или нет?

Никакого. Length учитывает, доказали примерами.


 
han_malign   (2011-05-13 09:55) [8]

З.З.Ы. Главное не путать с ShortString(aka Pascal String):
var passtr: string[5];
...
passtr:= "123"#0"4";
PChar(passtr) = #5"123"{#0} // !!!


Если нужно привести ShortString к PChar, проще всего - PChar(String(passtr)), но нужно помнить, что создается временный экземпляр String, который уничтожается при выходе из области видимости.
то есть:
hf:= CreateFile(PChar(String(passtr)), ...);{выход из ОВ} - все путем
pch:= PChar(String(passtr));{выход из ОВ}
...
hf:= CreateFile(pch, ...);
- грабли, т.к. String(passtr) - уже отпущен...
Вылавливать такие грабли потом очень трудно, т.к. виртуальная память может все еще удерживаться менеджером памяти, а содержимое может все еще не быть испорченным другими операциями с памятью...
Ключевое слово здесь - может(как звезды расположатся)...


При этом:
var passtr5: string[5];...
passtr5:= "12345";
try
  passtr5[6] <> #0
except
on E: EAccessViolation do {а вы чего хотели?} ;
end;
passtr5:= "321";
passtr5[4] = "4"
passtr5[5] = "5"

- это на тот случай - если кто-то решит, что он самый умный(PChar(@passtr[1])), или действительно умный(passtr[ord(passtr[0])+1]:= #0), но забыл про вариант
sizeof(passtr[0])+(ord(passtr[0]))*sizeof(passtr[1]) = sizeof(passtr)...


 
MBo ©   (2011-05-13 10:07) [9]

Хмм... Я-то в [1] про финишный ноль подумал


 
Anatoly Podgoretsky ©   (2011-05-13 14:15) [10]

Это не #0 хоть и тоже значение, это завершающий ноль, для совместимости с PChar. Это не часть строки.


 
Германн ©   (2011-05-13 15:46) [11]

Да. Знать ничего не остается приемлемого, кроме PChar.


 
Anatoly Podgoretsky ©   (2011-05-13 16:28) [12]

> Германн  (13.05.2011 15:46:11)  [11]

В большинстве случаев это провал в производительности и неудобство.


 
MBo ©   (2011-05-13 16:31) [13]

>Знать ничего не остается приемлемого, кроме PChar.

Для какой такой особой цели???


 
Германн ©   (2011-05-13 16:46) [14]


> Для какой такой особой цели

Приемный накопительный буфер.


 
MBo ©   (2011-05-13 16:51) [15]

И чем AnsiString в данном случае не устраивает?


 
Anatoly Podgoretsky ©   (2011-05-13 17:03) [16]

> Германн  (13.05.2011 16:46:14)  [14]

string с предварительно установленой длиной, длину все равно надо
устанавливать, но для PChar еще и память запрашивать.


 
Германн ©   (2011-05-13 17:32) [17]


> И чем AnsiString в данном случае не устраивает?

Многочисленные SetLength.


 
sniknik ©   (2011-05-13 18:50) [18]

> Многочисленные SetLength.
ну так сделай одинарный, на максимум. чем не устраивает?


 
clickmaker ©   (2011-05-13 18:52) [19]

> Многочисленные SetLength

а какая разница? SetLength, Realloc...


 
Германн ©   (2011-05-13 19:06) [20]


> ну так сделай одинарный, на максимум. чем не устраивает?

Тем, что хотя это и буфер, но нужно работать с ним как со строкой.

> а какая разница? SetLength, Realloc

Не будет никаких Realloc. Будет array[0.1023] of char


 
Eraser ©   (2011-05-13 20:12) [21]

> [14] Германн ©   (13.05.11 16:46)

используйте TBytes.


 
Германн ©   (2011-05-13 20:19) [22]


> Eraser ©   (13.05.11 20:12) [21]
>
> > [14] Германн ©   (13.05.11 16:46)
>
> используйте TBytes.

Т.е. "тонкий" намек на то, чтобы я ушел с Д2007?
:)


 
sniknik ©   (2011-05-13 20:19) [23]

>  Тем, что хотя это и буфер, но нужно работать с ним как со строкой.
работай как с массивом, кто мешает? индексация только с 1, и вся разница.


 
Германн ©   (2011-05-13 20:35) [24]


> работай как с массивом, кто мешает? индексация только с
> 1, и вся разница.

У строк куча готовых функций типа Copy, Pos etc. Простое сложение двух строк опять же.


 
Ega23 ©   (2011-05-13 21:00) [25]


> Не будет никаких Realloc. Будет array[0.1023] of char

Тогда уж of AnsiChar. Подложи соломки заранее.


 
Германн ©   (2011-05-13 21:11) [26]


> Подложи соломки заранее.

Спасибо, подложу.


 
sniknik ©   (2011-05-13 21:59) [27]

> У строк куча готовых функций типа Copy, Pos etc. Простое сложение двух строк опять же.
и что? нет, не пойму, серьезно. понятно когда чего-то нет и поэтому использовать не удобно, но когда есть что-то дополнительное, пусть не нужное, при прочих равных, ну и что? не используй и все.

вот когда говорят - у велосипеда нет колес, одна голая рама, поэтому ездить на нем не могу. это понятно. а вот когда - у велосипеда куча запасных колес, плюс насосы, и т.д. всякие фенечки, гараж, и бесплатная обслуга, поэтому ездить на нем не могу.... ????? на тебя же это добро не навьючивают, обслуживать тебя самого не заставляют, оно есть и есть, чем нужно воспользуешься, что не нужно, пусть в гараже лежит. непонятно в общем.

ты бы "на пальцах" как для идиотов пояснил бы.


 
Eraser ©   (2011-05-13 22:00) [28]

> [22] Германн ©   (13.05.11 20:19)

я всего лишь повторяю то, что рекомендует embarcadero http://edn.embarcadero.com/article/38703 . Практика это подтверждает, очень часто рассадник багов именно там, где используют строку, как буфер для любых данных. Особенно в крупных проектах, в которых несколько разработчиков.


 
Anatoly Podgoretsky ©   (2011-05-13 22:08) [29]

> Германн  (13.05.2011 17:32:17)  [17]

vs GetMem и плюс еще FreeMem


 
Anatoly Podgoretsky ©   (2011-05-13 22:13) [30]

> sniknik  (13.05.2011 20:19:23)  [23]

Так и массив можно объявить с 1
Кроме того и SetLength можно делать один раз и никакой разницы с
array[0.1023] of char
Кроме удобства


 
Anatoly Podgoretsky ©   (2011-05-13 22:17) [31]

> Eraser  (13.05.2011 22:00:28)  [28]

Они это утверждают в связи с Юникод, но кто же мешает вместо String написать
AnsiString


 
sniknik ©   (2011-05-13 22:26) [32]

> Кроме того и SetLength можно делать один раз и никакой разницы с
> array[0.1023] of char
> Кроме удобства
именно, все тоже, только удобнее, память не выделять, и есть дополнительные функции обработки.
единственное условие, не путать char и widechar, но как будто с массивом или pchar по другому, и решается все одним, правильным, объявлением типа, дальше оно тебе само врнинги и ошибки будет показывать...

и если не видно разницы... то выбирают почему то "по грязнее", чтобы еще ручной стирки досталось, вместо - "узнать побольше, и делать поменьше".
не понятно.


 
sniknik ©   (2011-05-13 22:37) [33]

> Они это утверждают в связи с Юникод, но кто же мешает вместо String написать AnsiString
на самом деле, даже если написать WideString ничего не помешает использовать его как буфер под байты... единственное удобство потеряется, т.к. самому придется все высчитывать, а вот проблем от (цитата статьи) "или использует строку как буфер для данных" не вижу, и никогда не испытывал. в отличие от "в которых несколько разработчиков", тут постоянно, но только строки/буферы данных/и т.д. в этом не виноваты...


 
Eraser ©   (2011-05-13 22:40) [34]

> [31] Anatoly Podgoretsky ©   (13.05.11 22:17)

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


 
sniknik ©   (2011-05-13 23:07) [35]

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

хотя мой опыт подсказывает, чем меньше "закладок на будущее", усилий по "несуществующей еще совместимости", и больше внимание на текущее, тем без проблемней проект... а будущее, для какого то конкретного, может (и в 90% точно) и не наступит.
т.е. подавляющее большинство усилий на то "чтобы завтра было хорошо" тратится впустую. не тратить их вовсе, и когда понадобится просто переписать по новой/изменить было бы проще (но все одно тратят).


 
Anatoly Podgoretsky ©   (2011-05-13 23:48) [36]

> sniknik  (13.05.2011 22:37:33)  [33]

Да они просто нагнали страху, мол размер будет неправильный, ну и что?


 
Германн ©   (2011-05-14 02:28) [37]


> sniknik ©   (13.05.11 21:59) [27]
>
> > У строк куча готовых функций типа Copy, Pos etc. Простое
> сложение двух строк опять же.
> и что? нет, не пойму, серьезно. понятно когда чего-то нет
> и поэтому использовать не удобно, но когда есть что-то дополнительное,
>  пусть не нужное, при прочих равных, ну и что? не используй
> и все.
>
> вот когда говорят - у велосипеда нет колес, одна голая рама,
>  поэтому ездить на нем не могу. это понятно. а вот когда
> - у велосипеда куча запасных колес, плюс насосы, и т.д.
> всякие фенечки, гараж, и бесплатная обслуга, поэтому ездить
> на нем не могу.... ????? на тебя же это добро не навьючивают,
>  обслуживать тебя самого не заставляют, оно есть и есть,
>  чем нужно воспользуешься, что не нужно, пусть в гараже
> лежит. непонятно в общем.
>
> ты бы "на пальцах" как для идиотов пояснил бы.

Сегодня уже не в состоянии.


 
Германн ©   (2011-05-15 06:13) [38]


> Германн ©   (14.05.11 02:28) [37]

Значится так.
По протоколу TCP/IP посылаю сам себе и получаю от самого себя некие команды. Команды посылаются в текстовом виде типа "CCCxxx..x#13". Где CCC - трёхбуквенный идентификатор команды, xxx..x - параметры команды произвольной длины, #13 признак конца команды. (Да не убъёт меня АП за отсутствие #10).
Сейчас принял такое решение. Для  приемного накопительного буфера использую "настоящий" PAnsiChar. Zero-based array не прошёл по ряду причин. В обработчике события OnDataAvailable (библиотека ICS) ввёл локальную переменную типа AnsiString, в которую "копирую" содержимое данного буфера. Далее работаю в этом обработчике со строкой, применяя функциb Pos и Delete при разборке содержимого/принятого. По завершении обработки сохраняю остаток в буфере типа
MyStr:=PAnsiChar(St);
Превышения размера принятых данных более установленного при создании объекта вроде быть не должно, но это я частично учел. При приёме я проверяю размер уже существующих данных в буфере плюс принятых только что.


 
Anatoly Podgoretsky ©   (2011-05-15 07:32) [39]

> Германн  (15.05.2011 06:13:38)  [38]

Почему не убью, особенно для TCP/IP


 
DVM ©   (2011-05-15 23:14) [40]


> Германн ©   (13.05.11 16:46) [14]
>
> > Для какой такой особой цели
>
> Приемный накопительный буфер.

бери мой, может подойдет

unit uBuffer;

interface

const
 MinAllocation = 1024;

type

 TBuffer = class(TObject)
 private
   FStorage: PAnsiChar;                    
   FAllocation: integer;                  
   FHead: PAnsiChar;                      
   FTail: PAnsiChar;                      
   FSize: integer;                        
   function GetBytes(Index: Integer): PAnsiChar;
   procedure SetSize(ASize: integer);
 public
   constructor Create; overload;
   constructor Create(ASize: integer); overload;
   constructor Create(AStorage: PAnsiChar; ASize: integer); overload;
   constructor Create(ABuffer: TBuffer); overload;

   destructor Destroy; override;

   function Append(ABuffer: TBuffer): integer; overload;
   function Append(AStorage: PAnsiChar; ASize: integer): integer; overload;

   function Assign(AStorage: PAnsiChar; ASize: integer): integer; overload;
   function Assign(ABuffer: TBuffer): integer; overload;

   function Consume(ACount: integer): integer;
   procedure Empty;
   procedure Compact;
   function IsEmpty: boolean;
   function Expand(ACount: integer): integer;
   function Extract(ACount: integer): PAnsiChar;
   function Shrink(ACount: integer): integer;
   procedure Tidy;
   property Head: PAnsiChar read FHead;
   property Size: integer read FSize write SetSize;
   property Storage: PAnsiChar read FStorage;
   property Tail: PAnsiChar read FTail;
   property Allocation: integer read FAllocation;
   property Bytes[Index: Integer]: PAnsiChar read GetBytes;
 end;




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

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

Наверх





Память: 0.56 MB
Время: 0.005 c
1-1264840745
Igorishe
2010-01-30 11:39
2011.08.28
Изменить цвет Caption в TTabSheet


15-1304773902
картман
2011-05-07 17:11
2011.08.28
Господь меня услышал


2-1305650677
Артём
2011-05-17 20:44
2011.08.28
Копирование значения в CheckListBox -> ListBox


2-1305523776
ruslan_as
2011-05-16 09:29
2011.08.28
Dev Express cxGrid - как включить итоги


15-1305056428
И. Павел
2011-05-10 23:40
2011.08.28
Как получить список запущенных приложений из сервиса





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