Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 29.10.2010, 23:25
birrrma birrrma вне форума
Прохожий
 
Регистрация: 29.10.2010
Сообщения: 9
Репутация: 10
Восклицание char как отличить входящий параметр например #33 от !

Доброй ночи...
Пытаюсь разобрать BLOB поле посимвольно на составляющие...
ВLOB-поле залил в string...
в цикле по стрингу обращаюсь к каждому символу string[i]... но попадаются варианты когда string[i] = '!' или может быть равен string[i] = #33...
собственно вопрос... как мне отличить '!' от #33 (в char() - это одно и тоже)... Спасибо за помощь...

Последний раз редактировалось birrrma, 29.10.2010 в 23:38.
Ответить с цитированием
  #2  
Старый 29.10.2010, 23:39
Аватар для eXplorer
eXplorer eXplorer вне форума
Активный
 
Регистрация: 06.08.2010
Адрес: Ярославль
Сообщения: 264
Версия Delphi: 7
Репутация: 14
По умолчанию

что то я сейчас не то сморожу мне кажется потихоньку засыпаю... может неправильно понял, так что заранее извеняюсь ...
Код:
var
  result:Integer;
begin
  // Сравнение некоторых строк
  result:= AnsiCompareStr(')', '#33');
  if result <0 then showmessage('разнае');
  if result = 0 then ShowMessage('одинаковые');
  if result > 0 then ShowMessage('разнае');
end;
__________________
Ответить с цитированием
  #3  
Старый 29.10.2010, 23:57
birrrma birrrma вне форума
Прохожий
 
Регистрация: 29.10.2010
Сообщения: 9
Репутация: 10
По умолчанию

Цитата:
Сообщение от eXplorer
что то я сейчас не то сморожу мне кажется потихоньку засыпаю... может неправильно понял, так что заранее извеняюсь ...
Код:
var
  result:Integer;
begin
  // Сравнение некоторых строк
  result:= AnsiCompareStr(')', '#33');
  if result <0 then showmessage('разнае');
  if result = 0 then ShowMessage('одинаковые');
  if result > 0 then ShowMessage('разнае');
end;

В том то и дело... я не знаю что за параметр входит в char...
массив String у меня это выглядит так ['в','ц','в','_','ц','ы','у',#0,#7,'a','!','2','@', #0,#ad,'a','s','d','1','+']
мне нужно каким-то образом отличить char(string[i]) - это символьное значение char('!') или целочисленное char(#33)

Последний раз редактировалось birrrma, 30.10.2010 в 00:02.
Ответить с цитированием
  #4  
Старый 30.10.2010, 00:02
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Визуально-то они может и одинаковы, но вот код у них разный. Поэтому с ним и надо работать:
Код:
Ord(s[i])
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #5  
Старый 30.10.2010, 00:11
birrrma birrrma вне форума
Прохожий
 
Регистрация: 29.10.2010
Сообщения: 9
Репутация: 10
По умолчанию

наверное не так изъясняюсь... мне нужно знать наверняка...
как представлен string[i]... как символ '!' или как код #13 ... если параметр представлен как #13, то мне надо обработать #13 не как значение string[i] равное "восклицательтному знаку" а как "число тринадцать"
Ответить с цитированием
  #6  
Старый 30.10.2010, 00:19
Аватар для eXplorer
eXplorer eXplorer вне форума
Активный
 
Регистрация: 06.08.2010
Адрес: Ярославль
Сообщения: 264
Версия Delphi: 7
Репутация: 14
По умолчанию

а string[i] может быть представлен как код...? теперь я чего то не понимаю...
__________________
Ответить с цитированием
  #7  
Старый 30.10.2010, 00:41
birrrma birrrma вне форума
Прохожий
 
Регистрация: 29.10.2010
Сообщения: 9
Репутация: 10
По умолчанию

есть string равный 'вцв_цыу'#0#7'a!2@'#0#33'asd1+'


string[3] будет явно равен _
А вот string[14] хоть фактически и равен #33 , но вернет значение !
вот я о том и говорю.... как мне узнать чем представлен I-й член стрингового массива... символьным или значением типа #33...
если символьным... то у меня идет одна ветка алгоритма... если значение с "решеткой"... то идет другая ветка алгоритма
Ответить с цитированием
  #8  
Старый 30.10.2010, 01:33
gjtrd gjtrd вне форума
Прохожий
 
Регистрация: 29.10.2010
Сообщения: 14
Репутация: 10
По умолчанию

В 4 посте ответ, насколько я понимаю. Ord возвращает число, под которым символ находится в таблице.
Ответить с цитированием
  #9  
Старый 30.10.2010, 03:40
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Кажется я понял в чем непонятка. Вас смущает, что в строке символы представлены, то буквой, а то комбинацией решетка и цифра?
Это просто символьное представление и не более того, Дело в том, что часть символов используются как служебные, и что-бы можно было все-же их в строку вставлять в Борланд придумали такую запись.
Например комбинация символов #13#10 в исходном своем представлении обычно используется как перенос строки, #8 - это уже символ табуляции и т.д.
Скажем, если я хочу вывести сообщение в 2 строки я буду писать так:
Код:
ShowMessage('Hello'#13#10'world!');
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 30.10.2010 в 03:43.
Ответить с цитированием
  #10  
Старый 30.10.2010, 11:48
birrrma birrrma вне форума
Прохожий
 
Регистрация: 29.10.2010
Сообщения: 9
Репутация: 10
По умолчанию

To Страдалецъ
Вы уже близки к тому ответу что мне нужен...

Если развить Ваш пример - ShowMessage('Hello'#13#10'world!');
то может быть и такой вариант ShowMessage('Hello'#13#10'world'#33);

Где Ваш "восклицательный знак" представлен группой #33... И то и то сообщение на экране будут абсолютно одинаковыми...
но мне нужно знать представлен символ в стринге (это может быть не только восклицательный знак) явно или с помощью комбинации...

Последний раз редактировалось birrrma, 30.10.2010 в 12:01.
Ответить с цитированием
  #11  
Старый 30.10.2010, 17:08
Аватар для KOOL
KOOL KOOL вне форума
Активный
 
Регистрация: 06.01.2008
Адрес: Рязань
Сообщения: 306
Версия Delphi: 2009
Репутация: 6150
По умолчанию

никак это нельзя узнать, в памяти компов ВСЕ хранится в числах. как ни напиши, '!' или #33, в памяти все это будет выглядеть как 33 (а точнее как 00100001) и никак иначе. и самому компу плевать, текст это, звук или что-либо еще.
З.Ы. зачем вообще BLOB-поле читать как строку? это же бинарные данные
__________________
РГРТУ - ФВТ - Системы Автоматизированного ПРоектирования. ت
Ответить с цитированием
  #12  
Старый 30.10.2010, 17:34
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Как уже сказали, узнать это по скомпилированному коду нельзя. Такое представление сделано только для пользователя в процессе разработки и для корректной сборки линкером приложения. В памяти выделяется блок данных под строковую переменную, где она и хранится в окончательном виде. Никаких кавычек и решеток там уже нет, там просто непрерывный набор байт.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #13  
Старый 30.10.2010, 19:47
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Как уже сказали, для компьютера оба представления одинаковы. Запись вида #nn говорит компилятору, что это символ (char) с кодом nn. Они равнозначны.
Теперь откуда получаются такие символы (когда смотришь в отладчике). В такой записи обычно представлены "непечатаемые" символы (с кодом < 32), т.к. отобразить напрямую их нельзя.
В исходном коде обычно такая запись так же применяется для ввода тех же "непечатаемых" символов. Хотя никто не мешает ее применять и для печатаемых.

Код:
var
  c1, c2 : char;
begin
  c1 := 'A';
  c2 := #65;
  If c1 = c2 then showmessage('matched') else showmessage('not matched');
end;
Этот код всегда будет давать сообщение matched, т.к. по сути для программы указаны 2 одинаковых значения, но в разной записи. Можно считать, что # это такаой вызов функции Chr для константы.
Ответить с цитированием
  #14  
Старый 31.10.2010, 15:25
birrrma birrrma вне форума
Прохожий
 
Регистрация: 29.10.2010
Сообщения: 9
Репутация: 10
По умолчанию

Ошибочка однако...

Последний раз редактировалось birrrma, 31.10.2010 в 15:38.
Ответить с цитированием
  #15  
Старый 31.10.2010, 15:37
birrrma birrrma вне форума
Прохожий
 
Регистрация: 29.10.2010
Сообщения: 9
Репутация: 10
По умолчанию

Цитата:
Сообщение от KOOL
никак это нельзя узнать, в памяти компов ВСЕ хранится в числах. как ни напиши, '!' или #33, в памяти все это будет выглядеть как 33 (а точнее как 00100001) и никак иначе. и самому компу плевать, текст это, звук или что-либо еще.
З.Ы. зачем вообще BLOB-поле читать как строку? это же бинарные данные
Да потому что там лежит список показателей со значениями...
Чего их нельзя было в нормальной табличной форме в базе разместить я не знаю...

Короче таки разобрать строку получилось... спасибо за ответы...
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:39.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025