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

Вниз

переменная string. Поменять местами некоторые данные   Найти похожие ветки 

 
Phoenix9000 ©   (2005-05-20 15:11) [0]

Доброго времени суток.

Есть переменная date типа string.

В нее идет запись даты с помощью Datetostr() например:

25.12.1980

нужно сделаь так, чтобы в переменной date2 тоже типа string эта дата была записана как :

12.25.1980

Заранее спасибо за ответ


 
Ega23 ©   (2005-05-20 15:14) [1]

FormatDateTime + F1


 
Marser ©   (2005-05-20 15:17) [2]

var d:TDateTime;
begin
 d:=StrToDate("25.12.1980");
 caption:=formatdatetime("mm.dd.yyyy",d);


 
Jeer ©   (2005-05-20 15:21) [3]

s[3] := s[1]
s[6] := s[2]
s[1] := s[4]
s[2] := s[5]
s[4] := s[3]
s[5] := s[6]
s[3] := "."
s[6] := "."


 
Alexander Panov ©   (2005-05-20 15:23) [4]


> Phoenix9000 ©   (20.05.05 15:11)
> Доброго времени суток.
>
> Есть переменная date типа string.


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


 
default ©   (2005-05-20 15:32) [5]

Jeer ©   (20.05.05 15:21) [3]
забавно:)
Вы бы в своём коде стали так писать или же ф-ции использовать?


 
evvcom ©   (2005-05-20 15:33) [6]


> Jeer ©   (20.05.05 15:21) [3]

var w: Word;
begin
 w := PWORD(@s[1])^;
 PWORD(@s[1])^ := PWORD(@s[4])^;
 PWORD(@s[4])^ := w;
end;


 
default ©   (2005-05-20 15:35) [7]

evvcom ©   (20.05.05 15:33) [6]
тут интерес то весь был в точках(без дополнительных переменных):) мы ведь знаем что они там всегда есть и стирая при перестановке не теряем никакой информации


 
evvcom ©   (2005-05-20 15:43) [8]


> default ©   (20.05.05 15:35) [7]

Я это понял, но тем не менее начиная с этого поста (Jeer ©   (20.05.05 15:21) [3]) можно смело ставить смайлики. Хотя новичка, не знающего [1], должно заинтересовать и [3], и [6], и есть еще варианты, и все они работают.


 
Jeer ©   (2005-05-20 15:47) [9]

default ©   (20.05.05 15:32) [5]

Jeer ©   (20.05.05 15:21) [3]
47 ns

Marser ©   (20.05.05 15:17) [2]
3105 ns


 
Jeer ©   (2005-05-20 15:50) [10]

evvcom ©   (20.05.05 15:33) [6]

25 ns !!!


 
VVV-First   (2005-05-20 16:04) [11]

В нее идет запись даты с помощью Datetostr() например:

25.12.1980


а что не прощебудет сразу записать в стрин , так как тебе надо

var
t:TDateTime;
begin
s := FormatDateTime("mm.dd.yyyy",T);
end;


 
evvcom ©   (2005-05-20 16:05) [12]

Ну, Marser ©   (20.05.05 15:17) [2] 3105 ns - это не корректно, это был чистый пример использования FormatDateTime, который должен делаться вместо DateToStr. Поэтому сравнивать на скорость этот пример просто неделикатно.


 
default ©   (2005-05-20 16:11) [13]


procedure TForm1.Button1Click(Sender: TObject);
var
 w: Word;
 s1: String;
 s2: PChar;
begin
 s1 := "25.12.1980";
 s2  := PChar(s1);
 w := PWord(@s2[0])^;
 PWord(@s2[0])^ := PWord(@s2[3])^;
 PWord(@s2[3])^ := w;
 Caption := s1
 // PChar для того чтобы избежать внутренних вызовов уникальности строки
 // при работе с типом String
end;

Jeer ©   (20.05.05 15:50) [10]
а так сколько будет?


 
evvcom ©   (2005-05-20 16:15) [14]


> // PChar для того чтобы избежать внутренних вызовов уникальности
> строки
>  // при работе с типом String

в [6] итак нет никаких "внутренних вызовов уникальности строки"


 
Jeer ©   (2005-05-20 16:19) [15]

Не знаю, поскольку вылетает:)


 
Jeer ©   (2005-05-20 16:21) [16]

evvcom ©   (20.05.05 16:05) [12]

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


 
default ©   (2005-05-20 16:23) [17]

evvcom ©   (20.05.05 16:15) [14]
в CPU если посмотреть на код

procedure TForm1.Button1Click(Sender: TObject);
var
w: Word;
s: String;
begin
s := "25.12.1980";
w := PWORD(@s[1])^;
PWORD(@s[1])^ := PWORD(@s[4])^;
PWORD(@s[4])^ := w;
Caption := s
end;

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


 
default ©   (2005-05-20 16:31) [18]

Jeer ©   (20.05.05 16:19) [15]

var
 Form1: TForm1;
 s1: String;
 s2: PChar;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
w: Word;
begin
s1 := "25.12.1980";
s2  := PChar(s1);
w := PWord(@s2[0])^;
PWord(@s2[0])^ := PWord(@s2[3])^;
PWord(@s2[3])^ := w;
//// s2[4] := "7";
// Caption := s2[2];
Caption := s1
// PChar для того чтобы избежать внутренних вызовов уникальности строки
// при работе с типом String
end;


 
default ©   (2005-05-20 16:31) [19]

Jeer ©   (20.05.05 16:19) [15]

var
 Form1: TForm1;
 s1: String;
 s2: PChar;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
w: Word;
begin
s1 := "25.12.1980";
s2  := PChar(s1);
w := PWord(@s2[0])^;
PWord(@s2[0])^ := PWord(@s2[3])^;
PWord(@s2[3])^ := w;
Caption := s1
end;


 
evvcom ©   (2005-05-20 16:35) [20]


> то там видны вызововы UniqueStringA

у меня сейчас нет дельфей под руками, но что-то меня терзают смутные сомнения по поводу [17]... Приеду домой попробую. А если не влом, то можно сюда выложить увиденное?


 
Jeer ©   (2005-05-20 16:46) [21]

PWord(@s2[0])^ := PWord(@s2[3])^;

Слетает на D5.


 
Sha ©   (2005-05-20 16:53) [22]

Привет участникам соревнований!

procedure TForm1.Button4Click(Sender: TObject);
var
 s: string;
 p, q: pchar;
 w: word;
begin;
 s:="25.12.1980";

 UniqueString(s);
 p:=pointer(s); q:=p+3;
 w:=pword(p)^; pword(p)^:=pword(q)^; pword(q)^:=w;

 Caption:=s;
 end;


 
default ©   (2005-05-20 17:10) [23]

Jeer ©   (20.05.05 16:46) [21]
а на D6 нет
так и пришлось Sha вызвать UniqueString(s); чтобы потом преспокойно менять строку...


 
default ©   (2005-05-20 17:12) [24]

evvcom ©   (20.05.05 16:35) [20]
пробовал принтскрин+распечатка+сканирование+распознание, но распозналось криво, быстрее было бы руками набить...


 
default ©   (2005-05-20 17:14) [25]

к [24]
криво не из-за распечатывания(так пришлось...), а то что сдвинуто всё вышло


 
Sha ©   (2005-05-20 17:14) [26]

> default ©   (20.05.05 17:10) [23]

Если мы уверены, что строка уникальна, то вызывать не требуется.
Собственно сам обмен требует 6 машинных команд.


 
default ©   (2005-05-20 17:20) [27]

Sha ©   (20.05.05 17:14) [26]
почему код [19] работает на D6, а на D5 не работает?


 
default ©   (2005-05-20 17:23) [28]

Sha ©   (20.05.05 17:14) [26]
"Если мы уверены, что строка уникальна, то вызывать не требуется."
НЕТ!
код [13] вообще не работает(кроме как в режиме отладки)
поставив UniqueString(s1); всё заработало
так что эта штука имеет вес и когда нет дублей...


 
Jeer ©   (2005-05-20 17:24) [29]

Sha ©   (20.05.05 16:53) [22]

9 ns

На грани чувствительности:)
А может и за гранью.


 
default ©   (2005-05-20 17:28) [30]

Jeer ©   (20.05.05 17:24) [29]
моя идея!:)
если писать

procedure TForm1.Button1Click(Sender: TObject);
var
w: Word;
s1: String;
s2: PChar;
begin
s1 := "25.12.1980";
UniqueString(s1); s2  := PChar(s1);
w := PWord(@s2[0])^;
PWord(@s2[0])^ := PWord(@s2[3])^;
PWord(@s2[3])^ := w;
Caption := s1
// PChar для того чтобы избежать внутренних вызовов уникальности строки
// при работе с типом String
end;

то работает!
учитывая что нет дублей строки я этот вызов не поставил и ...не заработало


 
Jeer ©   (2005-05-20 17:33) [31]

default ©   (20.05.05 17:28) [30]

Твоя - так твоя.
12 ns


 
Jeer ©   (2005-05-20 17:42) [32]

поправка из-за глюков:

Jeer: 47-49 ns
Sha:  45-46 ns ns
Defunct: 43-44 ns

P-IV 2GHz 1Gb


 
Sha ©   (2005-05-20 17:43) [33]

> default ©   (20.05.05 17:20) [27]
почему код [19] работает на D6, а на D5 не работает?

Ну, код [19] - пример того, как делать не надо.
Он и в D6 работать не будет, если все используемые переменные объявить внутри процедуры.

Дело тут в том, что присваививания значений локальным и глобальным строкам в D6 используются разные процедуры.
Локальные просто ссылаются на RO-строку (отсюда AV),
а глобальные копируют ее содержимое (поэтому все работает).

Вызов UniqueString гарантирует нам, что строка не RO.

> default ©   (20.05.05 17:23) [28]
>> Sha ©   (20.05.05 17:14) [26]
>> "Если мы уверены, что строка уникальна, то вызывать не требуется."
> НЕТ!

Не спорь, пока не посмотришь в окно CPU :)


 
Юрий Зотов ©   (2005-05-20 17:45) [34]

> Jeer ©   (20.05.05 17:24) [29]

Дык... если автор призы от Борланда берет за оптимальный ассемблеровский код - что ж удивляться-то?
:о)


 
Jeer ©   (2005-05-20 17:47) [35]

Я удивляюсь ?
Наоборот, очень рад, что это наши ребята берут призы.
А об успехах Шарохова знаю, смотрел и не раз его рейтинг.


 
Игорь Шевченко ©   (2005-05-20 17:49) [36]

Я бы сразу писал в нужном виде через FormatDateTime, или, если исходная строка получается извне, то так, как в [3], потому что оно понятнее программисту :)


 
Jeer ©   (2005-05-20 17:52) [37]

Игорь Шевченко ©   (20.05.05 17:49) [36]

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

Программисту - это понятно, а профи - кто же его поймет:))


 
Sha ©   (2005-05-20 17:53) [38]

> Jeer ©   (20.05.05 17:42) [32]
Думаю, измерения не совсем точны.
Для того, чтобы убедиться в этом, попробуй замерить время выполнения пустого оператора ";" :)

Кроме того, вызов UniqueString не должен входить в измеряемый интервал времени, т.к. в реальном приложении строка получается в результате вычислений и, как правило, уникальна и уж точно не является RO-константой.


 
Jeer ©   (2005-05-20 18:04) [39]

Пустой цикл замерить невозможно (~1 ns)

После выноса UniqueString(s)

Jeer is = 49 ns
Sha is = 44 ns
Defunct is = 45 ns


 
Jeer ©   (2005-05-20 18:08) [40]

Defunct:

0 [ns] - s2 := PChar(s1);
0 [ns] - w := PWord(@s2[0])^;
12 [ns] - PWord(@s2[0])^ := PWord(@s2[3])^;
45 [ns] - PWord(@s2[3])^ := w;


 
Jeer ©   (2005-05-20 18:11) [41]

Sha:
0 [ns]-  p:=pointer(s);
0 [ns]-  q:=p+3;
0 [ns]-  w:=pword(p)^;
10[ns]-  pword(p)^:=pword(q)^;
44[ns]-  pword(q)^:=w;


 
Sha ©   (2005-05-20 18:11) [42]

> Jeer ©   (20.05.05 18:04) [39]

44 нс на 2ГГц пентиуме - это 88 тактов CPU.
Не могут 6 мувов в цикле исполняться такое время.


 
Sha ©   (2005-05-20 18:12) [43]

Ты чем таким меришь, что у тебя такая дискретность?


 
Jeer ©   (2005-05-20 18:13) [44]

Jeer:
6 [ns]-   s[3] := s[1];
11[ns]-   s[6] := s[2];
17[ns]-   s[1] := s[4];
24[ns]-   s[2] := s[5];
30[ns]-   s[4] := s[3];
35[ns]-   s[5] := s[6];
44[ns]-   s[3] := ".";
49[ns]-   s[6] := ".";


 
Jeer ©   (2005-05-20 18:17) [45]

QueryPerformanceCounter;
Допускаю, конечно, наличие систематического сдвига.


 
Sha ©   (2005-05-20 18:18) [46]

> Jeer ©   (20.05.05 18:17) [45]

Код приведи.


 
Jeer ©   (2005-05-20 18:19) [47]

Так это выглядит:)
N := 10000001;
 tm.Clear;
 tm.Start;
 for i:=1 to N do begin
   s[3] := s[1];
   s[6] := s[2];
   s[1] := s[4];
   s[2] := s[5];
   s[4] := s[3];
   s[5] := s[6];
   s[3] := ".";
   s[6] := ".";
 end;
 tm.Stop;


 
Sha ©   (2005-05-20 18:26) [48]

Ну так ты меришь накладные расходы на организацию выполнения цикла :)

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

Попробуй своим способом измерить время работы оператора nop (0.5 такта CPU):
asm nop; end;


 
default ©   (2005-05-20 18:44) [49]

Sha ©   (20.05.05 17:43) [33]
"Локальные просто ссылаются на RO-строку (отсюда AV)"
"а глобальные копируют ее содержимое (поэтому все работает)."
зачем такое разделение?
кстати если локальной строке присвоить константу, то её счётчик ссылок равен $FFFFFFFF и AV в результате
если же попытатьcя изменить нелегеально значение строки, к примеру, со счётчиком ссылок 3, то нет никакого AV-а
:(


 
default ©   (2005-05-20 18:45) [50]

Sha ©   (20.05.05 17:43) [33]
"Локальные просто ссылаются на RO-строку (отсюда AV)"
"а глобальные копируют ее содержимое (поэтому все работает)."
зачем такое разделение?
кстати если локальной строке присвоить константу, то её счётчик ссылок равен $FFFFFFFF и AV в результате
если же попытатьcя изменить нелегеально значение строки, к примеру, со счётчиком ссылок 3, то нет никакого AV-а
:(


 
Sha ©   (2005-05-20 18:51) [51]

> default ©   (20.05.05 18:44) [49]
> "Локальные просто ссылаются на RO-строку (отсюда AV)"
> "а глобальные копируют ее содержимое (поэтому все работает)."
> зачем такое разделение?

Думаю, для совмести со старыми версиями.

> кстати если локальной строке присвоить константу, то её
> счётчик ссылок равен $FFFFFFFF и AV в результате

Ну, так я тебе сказал то же самое: RO-константы имеют счетчик ссылок -1.

> если же попытатьcя изменить нелегеально значение строки,
> к примеру, со счётчиком ссылок 3, то нет никакого AV-а

Ну ты понимаешь, конечно, что тем самым ты меняешь значения 3-х строк, а не одной? :)


 
default ©   (2005-05-20 18:53) [52]

+[50]
"кстати если локальной строке присвоить константу, то её счётчик ссылок равен $FFFFFFFF и AV в результате
если же попытатьcя изменить нелегеально значение строки, к примеру, со счётчиком ссылок 3, то нет никакого AV-а"
вот это кажется понял - в первом случае AV из-за изменения константы, во втором это уже не константа хоть и строка RO

первый вопрос остаётся?
почему глобальная переменная сразу готова к изменению, для локальной же обязательно избавляться от RO?


 
default ©   (2005-05-20 18:56) [53]

RO я понимал как Read Only(RefCount>1)
сначала подумал что RO это ReferenceOne:)
"Ну ты понимаешь, конечно, что тем самым ты меняешь значения 3-х строк, а не одной? :)"
да, конечно

RO-константы расшифруйте(


 
default ©   (2005-05-20 19:00) [54]

вообщем всё понял


 
Sha ©   (2005-05-20 19:02) [55]

> RO-константы расшифруйте(
Строки, которые при загрузке экзешника, размещаются на странице
памяти с доступом только на чтение.
Всегда имеют счетчик ссылок, установленный в -1.


 
default ©   (2005-05-20 19:05) [56]

Sha ©   (20.05.05 19:02) [55]
угу
это разделение нелогичное, конечно, впечатлило...


 
evvcom ©   (2005-05-20 22:36) [57]

Добрался до машины с Delphi... посмотрел CPU. Да... Век живи, век учись.


 
Defunct ©   (2005-05-21 01:20) [58]

> Jeer

Я, к сожалению, в этой ветке не участвовал ;>
Все лавры господину default"у!

PS: спасибо, что обо мне вспомнили, :)


 
Jeer ©   (2005-05-23 10:36) [59]

К сожалению, в пятницу, при проверке вышеприведенных методов система пребывала, как оказалось, в странном состоянии.
Собственно, это было видно по цифрам - явно разные по количеству тактов тесты стали давать примерно одинаковый результат.
(хотя для Marser и Jeer были сделаны верные оценки)

Дома, на досуге, перепроверил и, с учетом вызовов RDTSC,
function GetCPUTicks_:int64;
asm
   dw 310Fh // rdtsc
end;
, а также затрат на организацию цикла получаем:

Marser is = 2941.30 ns
Tcall  is = 88 ticks
Tcycle is = 2 ticks
Ttest  is = 5941 ticks

Jeer is = 47.53 ns
Tcall  is = 88 ticks
Tcycle is = 2 ticks
Ttest  is = 96 ticks

Sha is = 1.49 ns
Tcall  is = 88 ticks
Tcycle is = 2 ticks
Ttest  is = 3 ticks

Default is = 4.95 ns
Tcall  is = 88 ticks
Tcycle is = 2 ticks
Ttest  is = 10 ticks

Общее время теста выбиралось менее системного кванта (10 ms на w2k), чтобы снизить вероятность переключения задач.

Для коротких тестов, вполне можно сделать расчет вручную по тактам.

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

P.S.
Default/Defunct - я уже в вас путаюсь, не к добру это:)



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

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

Наверх





Память: 0.61 MB
Время: 0.015 c
14-1116490509
*Pavel
2005-05-19 12:15
2005.06.06
Все пионеры поздравляются


1-1116699184
seregka
2005-05-21 22:13
2005.06.06
Запуск программы из контекстного меню IE


5-1087272276
Sun bittern
2004-06-15 08:04
2005.06.06
Проблема с событием OnPaint :(


1-1116396618
Миша
2005-05-18 10:10
2005.06.06
КАК ВЫКОВЫРЯТЬ ТЕКСТ ИЗ WORD?


1-1116875983
INCOGNITO
2005-05-23 23:19
2005.06.06
алгоритм преобразования TDateTime в String





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