Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.01.2009, 05:35   #1
elsin
Пользователь
 
Регистрация: 10.05.2008
Сообщений: 36
Восклицание String - странность или кривые руки

Доброго времени суток!
Есть у меня функция, работает нормально, результат дает корректный, но вместе со второй частью работает некорректно, подскажите, пожалуйста, где грабли, а то полночи бьюсь уже.

В memo1 у меня текст, 22 строчки из файла. Не меньше 1000 символов короче.

Функция:
Код:
function Affinna_Crypt(s:String;a:integer;b:integer):string;
const
  SizeA = 93; //Размер алфавита
  RusA = ' !%()*+,-./0123456789:;<=>?^№абвгдежзийклмнопрстуфхцчшщъыьэюяАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ'; //Алфавит
var i, P,t,m:integer;
    temp:String;
begin
m:=93;
temp:='';
//удаление символов сообщения, не входящих в алфавит
for i := 1 to length(s) do
if pos(s[i],RusA)<>0 then temp:=temp+s[i];
s:=temp;
for i:=1 to length(s) do
  begin
  P:=pos(s[i],RusA);       //ok

   t:=((P*a+b) mod m);
   s[i]:=RusA[t];

   end;
   Result:=s;
end;
А вот собственно кусок процедуры, использующий данную функцию:
Код:
var
s1:string;
...
s1:=Affinna_Crypt(Memo1.Text,11,19);
memo2.text:=s1;
Функцию тестировал пошагово много раз, result устраивает. Поэтому считаю что дело не в ней. Но тогда в чем?

СпасибО!
elsin вне форума Ответить с цитированием
Старый 28.01.2009, 05:46   #2
capta1n
Форумчанин
 
Аватар для capta1n
 
Регистрация: 06.12.2008
Сообщений: 613
По умолчанию

Цитата:
RusA = ' !%()*+,-./0123456789:;<=>?^№абвгдежзийклмнопр стуфхцчшщъыьэюяАБВГДЕЖЗИЙКЛМНОПРСТУ ФХЦЧШЩЪЫЬЭЮЯ'
почему бы вот это просто не заменить на:
begin
...
if not (s[i] in ['A'..'Z','a'..'z']) then temp:=temp+s[i];
...

проверка на входимость в множество латиницы - обратное действие вашему, и мне кажется намного проще - мне не пришлось писать такую строчку в константе

PS: - а вот понял, что вы хотите сделать - мое предложение отпадает

Последний раз редактировалось capta1n; 28.01.2009 в 05:49.
capta1n вне форума Ответить с цитированием
Старый 28.01.2009, 05:57   #3
capta1n
Форумчанин
 
Аватар для capta1n
 
Регистрация: 06.12.2008
Сообщений: 613
По умолчанию

да и ваша проблема заключается в том, что вы пишите в конце Result:=s, а такой переменной нет, да она и не нужна - надо результат возвращать как значение самой функции - это значит надо писать Affinna_Crypt:=s

Цитата:
В memo1 у меня текст, 22 строчки из файла. Не меньше 1000 символов короче.
Да и больше 255 символов строка не поддерживает, поэтому надо разбивать вашу БОЛЬШУЮ строку на несколько подстрок, чтобы функция могла работать с ней - и выводить поочередно

PS: elsin - а вы случайно не играете в игру Total Annihilation Kingdoms? Там просто герой есть Elsin

Последний раз редактировалось capta1n; 28.01.2009 в 06:01.
capta1n вне форума Ответить с цитированием
Старый 28.01.2009, 06:36   #4
elsin
Пользователь
 
Регистрация: 10.05.2008
Сообщений: 36
По умолчанию

Дело в том, что у меня есть другая функция, система там примерно таже. Там все работает на "ура". Тут еще такая вещь происходит при работе: с одними ключами а и б все нормально, с другими криво, т.е. результат функции нормальный в любом случае, а вот присвоение s1:=affinna_crypt(memo1.text,a,b) уже присваивает только маленький кусок результата функции. Начал грешить на функцию, но требования простоты чисел соблюдены, все условия выполняются. P.S.: хорошая гейма была, да? Но мало кто о ней помнит. У всех ник ассоциировался с Ельциным :-)
elsin вне форума Ответить с цитированием
Старый 28.01.2009, 10:02   #5
NOOB
Пользователь
 
Аватар для NOOB
 
Регистрация: 01.11.2007
Сообщений: 45
По умолчанию

У тебя, при вычислениях в функции, в string попадает символ "#0", символ "#0" означает конец строки и все что после него в memo.text не записывается
NOOB вне форума Ответить с цитированием
Старый 28.01.2009, 10:17   #6
capta1n
Форумчанин
 
Аватар для capta1n
 
Регистрация: 06.12.2008
Сообщений: 613
По умолчанию

не могли бы вы цитаткой выделить - мне даже интересно о чем вы говорите
capta1n вне форума Ответить с цитированием
Старый 28.01.2009, 10:58   #7
NOOB
Пользователь
 
Аватар для NOOB
 
Регистрация: 01.11.2007
Сообщений: 45
По умолчанию

Ну вот смотрите:
в memo записываем строку "5н9)июуИЮЪ/"
Код:

var
  s : string;
begin
 s:=Affinna_Crypt(Memo1.Text,11,19);
 Memo1.Text:=s; //поставь breakepoint и смотри что будет после присваивания
 Memo1.Text:=s;
поставивь брекпоинт мы видим:
s = 8?ВМГ^'#0'п,ыс
как мы видим, у нас в строке появился символ #0 (напомню что он означает конец строки);
далее смотрим что у нас записалось в Memo1.Text:
Memo1.Text = 8?ВМГ^

Теперь как у нас получается этот символ конца строки:
P:=pos('e',RusA);
P = 49
(49*11+19) mod 93 = 0

RusA[0] = #0

"Ключевое слово Mod дает остаток от деления делимого на делитель."
http://www.delphibasics.ru/

Последний раз редактировалось NOOB; 28.01.2009 в 11:11.
NOOB вне форума Ответить с цитированием
Старый 28.01.2009, 12:35   #8
crc83
Пользователь
 
Аватар для crc83
 
Регистрация: 24.01.2009
Сообщений: 38
По умолчанию

Переменная Result существует. Я сам ее видел

NOOB ноль тут нипричем, но идея хорошая. Он же берет символы из масива... Srting есть масив где первым елементом есть его длинна.
Пусть будет так
Код:
s[i]:=RusA[t+1];
crc83 вне форума Ответить с цитированием
Старый 28.01.2009, 12:55   #9
NOOB
Пользователь
 
Аватар для NOOB
 
Регистрация: 01.11.2007
Сообщений: 45
По умолчанию

Цитата:
Сообщение от crc83 Посмотреть сообщение
NOOB ноль тут нипричем
Еще как при чем и не "ноль", а символ конца строки. В функции же массив RusA [1..93], а получается обращаешься к 0-ой ячейке. Я же все подробно расписал.

Цитата:
Пусть будет так
Код:
s[i]:=RusA[t+1];
Тогда за рамки массива не вылезь, чтоб не получилось RusA[94].
NOOB вне форума Ответить с цитированием
Старый 28.01.2009, 13:07   #10
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

Цитата:
Сообщение от capta1n Посмотреть сообщение
да и ваша проблема заключается в том, что вы пишите в конце Result:=s, а такой переменной нет, да она и не нужна - надо результат возвращать как значение самой функции - это значит надо писать Affinna_Crypt:=s
То, что красным, в delphi НЕ актуально. Она актуальна только для паскаля.
То, что зелённым, служит для возвращения значиения любым типам функций. Почитайте на досуге: http://www.delphibasics.ru/Result.php
Alter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как получить чужой комп в свои руки zetrix Безопасность, Шифрование 7 13.11.2008 16:32
это вирус или кривые руки? AngelOfDeath Безопасность, Шифрование 4 03.06.2008 14:04
C# + Access + кривые руки pu4koff Общие вопросы .NET 2 15.04.2008 14:42
как узнать string или Real Влажимир Общие вопросы Delphi 2 11.04.2008 17:06