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

Вниз

переменная 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;



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

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

Наверх




Память: 0.57 MB
Время: 0.046 c
14-1116515386
QuasiLamo
2005-05-19 19:09
2005.06.06
Актуальный список регионов и городов России


8-1108810484
avlan
2005-02-19 13:54
2005.06.06
Инструмент "Спрей"


4-1113880314
Столков Иван
2005-04-19 07:11
2005.06.06
WinAPI как програмно выключить питание компьютера?


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


1-1116923548
Phoenix
2005-05-24 12:32
2005.06.06
Субменю в PopupMenu