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

Вниз

Как сделать case для строк в 4 символа?   Найти похожие ветки 

 
Оптим   (2006-02-16 02:59) [0]

Ведь Integer - это тоже 4 байта, значит как то можно преобразовать строку в интегер, и делать ему case. Или нельзя?
Вот так Integer("test"): - не получается. А как правильно?


 
Германн ©   (2006-02-16 03:20) [1]

Суть смысла и смысл сути вопроса не понятен абсолютно!


 
Наблюдение   (2006-02-16 03:35) [2]

Если бы сюда зашёл дурак, то он бы тоже не понял.


 
Жуков Олег   (2006-02-16 05:36) [3]

В число:
 i :=  Integer((@"test"[1])^);

и обратно в строку:

 SetLength(s, 4);
 Integer((@s[1])^) := 1953719668;


 
Zeqfreed ©   (2006-02-16 06:11) [4]

Не стоит так извращаться.


 
Оптим   (2006-02-16 06:51) [5]

> i :=  Integer((@"test"[1])^);

А можно для начинающих расшифровать эту запись?

"test"[1] - почему это с цифрой 1?
@"test"[1] - это мы берём адрес, да?
(@"test"[1])^ - это мы чего делаем с адресом? ...


 
КаПиБаРа ©   (2006-02-16 07:03) [6]

Оптим   (16.02.06 6:51) [5]
"test"[1] - первый элемент массива символов "test" тоесть "t"
@"test"[1] - адрес первого символа, то биш "t"
(@"test"[1])^ - значение по указанному выше адресу
 см F1 - Overview of pointers


 
Оптим   (2006-02-16 07:06) [7]

> (@"test"[1])^ - значение по указанному выше адресу
А сам адрес разве не значит что по указанному адресу? Или что он тогда значит?


 
КаПиБаРа ©   (2006-02-16 07:22) [8]

Попробуй разобраться в этом
procedure TForm1.Button1Click(Sender: TObject);
var
 s: string;
 i: Integer;
begin
 s := "Test";
 Memo1.Lines.Add("Первый символ  " + s[1]);
 Memo1.Lines.Add("Адрес первого символа " + IntToStr(Dword(@s[1])));
 Memo1.Lines.Add("Значение хранящееся по этому адресу " + IntToStr(Dword((@s[1])^)));
 Memo1.Lines.Add("Это же значение в 16-ричном виде " + IntToHex(Dword((@s[1])^), 6));
 Memo1.Lines.Add("Или по символам первый    " + Char((@s[1])^));
 Memo1.Lines.Add("Или по символам второй    " + Char((@s[2])^));
 Memo1.Lines.Add("Или по символам третий    " + Char((@s[3])^));
 Memo1.Lines.Add("Или по символам четвертый " + Char((@s[4])^));
end;


 
Leonid Troyanovsky ©   (2006-02-16 09:27) [9]


> Оптим   (16.02.06 02:59)  
> Ведь Integer - это тоже 4 байта, значит как то можно преобразовать
> строку в интегер, и делать ему case. Или нельзя?


procedure TForm1.Button1Click(Sender: TObject);
const
c1 =   $1*             Ord("E")+
       $100*           Ord("d")+
       $10000*         Ord("i")+
       $1000000*       Ord("t"); // Edit
c2 =   $1*             Ord("T")+
       $100*           Ord("e")+
       $10000*         Ord("s")+
       $1000000*       Ord("t"); // Test
begin
 case PLongint(PChar(copy(Edit1.Text,1,4)))^ of
   c1:
     ShowMessage("Edit");
   c2:
     ShowMessage("Test");
 end;
end;

--
Regards, LVT.


 
evvcom ©   (2006-02-16 09:36) [10]


> КаПиБаРа ©   (16.02.06 07:03) [6]
> @"test"[1] - адрес первого символа, то биш "t"
> (@"test"[1])^ - значение по указанному выше адресу

Для лучшего понимания надо добавить строку:
PLongint(@"test"[1]) - приведение к указателю на Longint, т.е. указателю на 4-байтовое целое. А уж потом разадресация: PLongint(@"test"[1])^. См. [9].
Хотя, конечно, в [3] ответ немного иной и интуитивно непонятный.


 
palva ©   (2006-02-16 09:47) [11]

Можно не преобразовывать:

{$APPTYPE CONSOLE}
var
 s: String[7];
 si: LongInt absolute s;
procedure c;
begin
 case si of
 1163350277:
   WriteLn("case1");
 1685283078:
   WriteLn("case2");
 else
   WriteLn("nocase")
 end;
end;
begin
 s := "QWERT";
 c; // case1
 s := "asdfgh";
 c; // case2
 s := "";
 c; // nocase
end.

Только придется составить словарь: значение строки и соответствующее этому значению число, которое требуется для case.


 
evvcom ©   (2006-02-16 09:49) [12]


> palva ©   (16.02.06 09:47) [11]

Угу, и всякий раз, когда решишь изменить 1 символ, будешь брать в руки "железного Феликса"?


 
Плохиш ©   (2006-02-16 11:11) [13]

И после wsego этого они смеют кричать, что вындов - глючный маст дай :-)


 
Оптим   (2006-02-18 02:02) [14]

> Leonid Troyanovsky ©   (16.02.06 09:27) [9]
А можно сделать тоже самое, только без констант, а то с ними не удобно как то.


 
Defunct ©   (2006-02-18 03:32) [15]

Оптим   (18.02.06 02:02) [14]
без констант нельзя, оператор case к сожалению только с константами "оперирует".

может быть имеет смысл вашу задачу решать по-другому?
Например, взять TStringList, засунуть в него строки и ссылки, далее искать строку уже в списке - при совпадении пользоваться ссылкой или индексом строки...


 
Defunct ©   (2006-02-18 03:40) [16]

> Оптим  

может вам пригодится:

помню на первой лекции по "программированию" преподаватель сказал две ключевые фразы, после чего на его предмет можно было не ходить.

Фраза №1.
Программист первым делом, столкнувшись с задачей, должен задать себе вопрос: как эту задачу решали раньше?
Фраза №2.
После того как найдено решение задачи, программист должен задаться вопросом: как тоже самое сделать иначе?


 
Оптим   (2006-02-18 03:52) [17]

> Defunct ©   (18.02.06 03:32) [15]
Я просто хотел слегка ускорить. Чтобы вместо сравнения строк шло сравнение Integer. Пустячок, а ускорение. Функции там не вызываются и всё такое.

> Defunct ©   (18.02.06 03:40) [16]
А как писали раньше Виндос? И как нам написать свои?


 
Defunct ©   (2006-02-18 04:43) [18]

Оптим   (18.02.06 03:52) [17]
А может тогда по первой букве сравнивать? еще быстрее будет

> А как писали раньше Виндос? И как нам написать свои?
это сильно сложная задача, к тому же она перед нами не стоИт. ;)


 
Оптим   (2006-02-18 04:53) [19]

А если первые буквы одинаковые?

> это сильно сложная задача, к тому же она перед нами не стоИт. ;)

Но ведь Виндос 95 была написана чуть ли не под досом, когда было лишь по 8 мегабайт оперативки, процессоры 486.

Неужели спустя 11 лет нельзя написать такое же на Дельфи? Так вообще. Если задуматься.


 
Defunct ©   (2006-02-18 05:12) [20]

> А если первые буквы одинаковые?
А много строк планируете проверять? Раз сase хотели использовать - значит не так много..
Ну тогда доп. проверка по второй букве - 32^2 комбинаций.

> Неужели спустя 11 лет нельзя написать такое же на Дельфи? Так вообще. Если задуматься.

Можно, только если такое писать на Delphi - оно получится под  Windows. ;>
Если уж писать подобное то лучше сразу писать под MK, под тот же Arm, например, потребляет - миливатты, а вычислительная мощность как у Pentium"a.


 
Оптим   (2006-02-18 06:26) [21]

Не под Виндос, а под x86.
Виндос - это большей частью библиотечки Dll со всякими функциями.

Что такое Arm - я не знаю.


 
Оптим   (2006-02-18 06:32) [22]

> Ну тогда доп. проверка по второй букве - 32^2 комбинаций.
А зачем так заморачиваться? Если можно проверять сразу Integer?


 
Defunct ©   (2006-02-18 06:37) [23]

> Не под Виндос, а под x86.
ну пусть будет так, под x86 для Windows или для Linux..
Delphi не приспособлен для создания кода под голую систему без операционки...

> Что такое Arm - я не знаю
Advanced Risc Machine (arm) - семейство 32х разрядных МК, которые в мобильных телефонах применяются.


 
Джо ©   (2006-02-18 06:40) [24]

> [23] Defunct ©   (18.02.06 06:37)
> > Что такое Arm - я не знаю
> Advanced Risc Machine (arm)

Продолжу расшифровку аббревиатуры (эдакая матрешка): RISC - Reduced instruction set (computer), а то дословно выходило бы: Машина продвинутого риска :)


 
Оптим   (2006-02-18 07:49) [25]

> Defunct ©   (18.02.06 06:37) [23]
Ну dll-ки то можно писать?
Начать с переписываня всех dll, и проект с откртым кодом. Чтобы кто хочет мог поучаствовать. Плюс оптимизации всякие, поиск ошибок.


 
Virgo_Style ©   (2006-02-18 08:54) [26]

Оптим   (18.02.06 7:49) [25]
Бог в помощь! (с)

P.S. А собственно, зачем?


 
Anatoly Podgoretsky ©   (2006-02-18 09:45) [27]

Да он просто про IF на слышал, и кроме того, что CASE это особая форма IF


 
Оптим   (2006-02-19 01:39) [28]

> Бог в помощь! (с)
Тебе.

> P.S. А собственно, зачем?
Бесплатная операционная система. Которую можно дополнять/развивать независимо от М$.

На Linux программы от Виндос не запускаются.


 
Галинка ©   (2006-02-19 03:58) [29]

Оптим   (19.02.06 01:39) [28]

Оптим. хорошо что сюда  Билли не ходит. Ему бы ваша идея понравилась бы...)))

А разве не любая программа (ну утрировано конечно), тем более операционка, "это большей частью библиотечки Dll со всякими функциями"... Ведь когда вы на дельфи пишите, вы же тоже используете "библиотечки Dll со всякими функциями" от Виндовоза?


 
Оптим   (2006-02-19 04:08) [30]

Загрузчик - это похоже не dll. Что он из себя представляет я не знаю.


 
Галинка ©   (2006-02-19 05:29) [31]

Оптим   (19.02.06 04:08) [30]

И он даже не использует никакую ДЛЛ, ну вообще ничего?


 
Оптим   (2006-02-19 05:38) [32]

BIOS использует.


 
Virgo_Style ©   (2006-02-19 07:53) [33]

Хорошо, черт с ней, с целью, потом придумаем... А переписывать-то как? -)


 
Оптим   (2006-02-20 02:47) [34]

Реверсэнжинирингом. К сожалению я в нём слаб.


 
CMOS ©   (2006-02-20 06:22) [35]

Я бы так сделал. Вот набросок (не на Pascal):
for n:= 0 to 3
  i:= i + ord(s[n+1])+2^(3-n) //Всмысле в степень возвести



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

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

Наверх





Память: 0.53 MB
Время: 0.013 c
2-1139976703
Триггер
2006-02-15 07:11
2006.03.05
Вопрос по SQL


10-1114854261
zafar
2005-04-30 13:44
2006.03.05
Как выделить часть или весь документ....


15-1139811873
Некто
2006-02-13 09:24
2006.03.05
Линзы DVD/CD-приводов


15-1139675986
vidiv
2006-02-11 19:39
2006.03.05
Parser Лебедева


1-1138612938
alsov
2006-01-30 12:22
2006.03.05
нестандартный StringGrid





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