Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

переменная string. Поменять местами некоторые данные [D6, Win2k]


Страницы:   1 2 3

Phoenix9000 ©   (2005-05-20 15:11:00) 

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

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

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

25.12.1980

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

12.25.1980

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


Jeer   (2005-05-20 18:04:00) [21]

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

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

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


Sha   (2005-05-20 17:53:00) [22]

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

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


Jeer   (2005-05-20 17:52:00) [23]

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

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

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


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

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


Jeer   (2005-05-20 17:47:00) [25]

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


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

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

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


Sha   (2005-05-20 17:43:00) [27]

> 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 :)


Jeer   (2005-05-20 17:42:00) [28]

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

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

P-IV 2GHz 1Gb


Jeer   (2005-05-20 17:33:00) [29]

default ©   (20.05.05 17:28) [30]

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


default   (2005-05-20 17:28:00) [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:24:00) [31]

Sha ©   (20.05.05 16:53) [22]

9 ns

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


default   (2005-05-20 17:23:00) [32]

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


default   (2005-05-20 17:20:00) [33]

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


Sha   (2005-05-20 17:14:00) [34]

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

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


default   (2005-05-20 17:14:00) [35]

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


default   (2005-05-20 17:12:00) [36]

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


default   (2005-05-20 17:10:00) [37]

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


Sha   (2005-05-20 16:53:00) [38]

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

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;


Jeer   (2005-05-20 16:46:00) [39]

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

Слетает на D5.


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


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

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


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо