Войти
NeoBooker.ru
Добро пожаловать к нам в гости!
Наш сайт посвящён программе NeoBook, с помощью которой вы легко сможете создавать собственные мультимедиа-приложения без необходимости изучать сложные языки программирования! Зарегистрируйтесь, чтобы стать членом нашего сообщества.
  • Страница 1 из 1
  • 1
Модератор форума: Peter, DEMBEL, YURIY  
Разбор строки на отдельные символы или глюк NB?
UserDeadДата: Сб, 15 Февраля 2014, 21:11 | Сообщение # 1
Любопытный
Снова привет и приветственный поклон)
Я наступил на грабли и незнаю что с этим делать.
Я занялся программой для генерации алгоритмов шифрования (пока что подстановочных) и собсно их использования.
И я столкнулся спроблемой:
Для зашифрования строки мне нужно разобрать ее на буковки, и каждой букве я присваиваю свой код по таблице, и это дело записывается в одну строку.
Проблема состоит в том что в случае попадания одинаковых букв в разных местах они какогото */*/* сортируются!
К примеру входная строка TEST по буквам понятно T E S T допустим буквам присвоен код T=000 E=111 S=222
Так вот по идее у нас должно быть 000111222000 Но сценарий стакует последнюю повторяющуюся букву после первой и у меня на выходе
000000111222
T T E S
Спрашивается где косяк у НБ или у меня? Я то понимаю что выполняется то что напишет программист но тут чтото нетак, взгляните на сценарий:
Код

.меряем длинну входной строки
StrLen "[deco_output]" "[encd_length]"
.задаем значение отсчета
SetVar "[encd_strt]" "0"
.цикл от одного до длинны символов<------ПРОБЛЕМА
Loop "1" "[encd_length]" "[encd_cou]"
.копируем один символ из входной строки и помещаем в динамическую переменнную
SubStr "[deco_output]" "[encd_strt]" "1" "[encd_char_[encd_cou]]"
.приплюсовуем счетчик для чтения сл. символа
Math "[encd_strt]+1" "0" "[encd_strt]"
.конец цикла
EndLoop
.начинаем цикл с одного до кол-ва символов в входной строке
Loop "1" "[encd_length]" "[encd_cou]"
.читаем из файла соотвествие кода символу
hpwIniRead "[prfl_file]" "chars_code" "[encd_char_[encd_cou]]" "[err]" "[encd_cd_[encd_cou]]"
.записываем текузее содержимое в запасную переменную
SetVar "[deco_subencode]" "[deco_encode]"
.прибавляем к основной переменнной запасную строку и новые значения
SetVar "[deco_encode]" "[deco_subencode][encd_cd_[encd_cou]]"
.конец цикла
EndLoop

В ini файле прописаны соответствия буква-код типа A=856 и так далее
По идее начиначя с loop с меткой "проблема" мы копируем буквы с нулевой позиции (это мы задали в
Код
Math "[encd_strt]+1" "0" "[encd_strt]"

комманде) и потом в
Код

Math "[encd_strt]+1" "0" "[encd_strt]"

Прибавляем уровень с которого мы посимвольно копируем строку в случае с TEST следующая буква на позиции 1 это E но он копирует T которая последняя
Помогите а? redface


I will alive before dead

Сообщение отредактировано
UserDead - Сб, 15 Февраля 2014, 21:13
 
СообщениеСнова привет и приветственный поклон)
Я наступил на грабли и незнаю что с этим делать.
Я занялся программой для генерации алгоритмов шифрования (пока что подстановочных) и собсно их использования.
И я столкнулся спроблемой:
Для зашифрования строки мне нужно разобрать ее на буковки, и каждой букве я присваиваю свой код по таблице, и это дело записывается в одну строку.
Проблема состоит в том что в случае попадания одинаковых букв в разных местах они какогото */*/* сортируются!
К примеру входная строка TEST по буквам понятно T E S T допустим буквам присвоен код T=000 E=111 S=222
Так вот по идее у нас должно быть 000111222000 Но сценарий стакует последнюю повторяющуюся букву после первой и у меня на выходе
000000111222
T T E S
Спрашивается где косяк у НБ или у меня? Я то понимаю что выполняется то что напишет программист но тут чтото нетак, взгляните на сценарий:
Код

.меряем длинну входной строки
StrLen "[deco_output]" "[encd_length]"
.задаем значение отсчета
SetVar "[encd_strt]" "0"
.цикл от одного до длинны символов<------ПРОБЛЕМА
Loop "1" "[encd_length]" "[encd_cou]"
.копируем один символ из входной строки и помещаем в динамическую переменнную
SubStr "[deco_output]" "[encd_strt]" "1" "[encd_char_[encd_cou]]"
.приплюсовуем счетчик для чтения сл. символа
Math "[encd_strt]+1" "0" "[encd_strt]"
.конец цикла
EndLoop
.начинаем цикл с одного до кол-ва символов в входной строке
Loop "1" "[encd_length]" "[encd_cou]"
.читаем из файла соотвествие кода символу
hpwIniRead "[prfl_file]" "chars_code" "[encd_char_[encd_cou]]" "[err]" "[encd_cd_[encd_cou]]"
.записываем текузее содержимое в запасную переменную
SetVar "[deco_subencode]" "[deco_encode]"
.прибавляем к основной переменнной запасную строку и новые значения
SetVar "[deco_encode]" "[deco_subencode][encd_cd_[encd_cou]]"
.конец цикла
EndLoop

В ini файле прописаны соответствия буква-код типа A=856 и так далее
По идее начиначя с loop с меткой "проблема" мы копируем буквы с нулевой позиции (это мы задали в
Код
Math "[encd_strt]+1" "0" "[encd_strt]"

комманде) и потом в
Код

Math "[encd_strt]+1" "0" "[encd_strt]"

Прибавляем уровень с которого мы посимвольно копируем строку в случае с TEST следующая буква на позиции 1 это E но он копирует T которая последняя
Помогите а? redface

Автор - UserDead
Дата добавления - 15 Февраля 2014 в 21:11
PeterДата: Сб, 15 Февраля 2014, 21:29 | Сообщение # 2
Админ NeoBook
Вот здесь первая ошибка (см.выделенное):
Цитата UserDead ()

SetVar "[encd_strt]" "0"
.цикл от одного до длинны символов<------ПРОБЛЕМА
Loop "1" "[encd_length]" "[encd_cou]"
.копируем один символ из входной строки и помещаем в динамическую переменнную
SubStr "[deco_output]" "[encd_strt]" "1" "[encd_char_[encd_cou]]"
.приплюсовуем счетчик для чтения сл. символа
Math "[encd_strt]+1" "0" "[encd_strt]"
.конец цикла
EndLoop

Команда SubStr начинает отсчет позиций копирования с первого символа, а не с нуля, т.е. если нужно скопировать один символ с позиции первого символа, то должно быть
SubStr "[deco_output]" "1" "1" "[encd_char_[encd_cou]]"

с позиции пятого символа от начала строки:
SubStr "[deco_output]" "5" "1" "[encd_char_[encd_cou]]"
и т.д.

А вот команда плагина hpwIniRead может начинать отсчет и с нуля, т.к. в Delphi все отсчеты начинаются с нуля, а, насколько мне извкестно, HPW (автор плагина) не утруждался приведением "систем отсчета" плагинов к стилю NB, и делал все по образу и подобию Delphi.

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


- А вам какую операционку поставить - экспи, семерку или висту?
- Это ты сейчас о чем?
- Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный?
- Ну, конечно, надежный!
- Вот, значит - экспи, без вопросов! Сейчас сделаем...

(Улицы разбитых фонарей, сезон 10, серия 17)

Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!


При модном втюхе модоподдающимся начинает нравиться
 
СообщениеВот здесь первая ошибка (см.выделенное):
Цитата UserDead ()

SetVar "[encd_strt]" "0"
.цикл от одного до длинны символов<------ПРОБЛЕМА
Loop "1" "[encd_length]" "[encd_cou]"
.копируем один символ из входной строки и помещаем в динамическую переменнную
SubStr "[deco_output]" "[encd_strt]" "1" "[encd_char_[encd_cou]]"
.приплюсовуем счетчик для чтения сл. символа
Math "[encd_strt]+1" "0" "[encd_strt]"
.конец цикла
EndLoop

Команда SubStr начинает отсчет позиций копирования с первого символа, а не с нуля, т.е. если нужно скопировать один символ с позиции первого символа, то должно быть
SubStr "[deco_output]" "1" "1" "[encd_char_[encd_cou]]"

с позиции пятого символа от начала строки:
SubStr "[deco_output]" "5" "1" "[encd_char_[encd_cou]]"
и т.д.

А вот команда плагина hpwIniRead может начинать отсчет и с нуля, т.к. в Delphi все отсчеты начинаются с нуля, а, насколько мне извкестно, HPW (автор плагина) не утруждался приведением "систем отсчета" плагинов к стилю NB, и делал все по образу и подобию Delphi.

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

Автор - Peter
Дата добавления - 15 Февраля 2014 в 21:29
UserDeadДата: Сб, 15 Февраля 2014, 22:23 | Сообщение # 3
Любопытный
Спасибо огромное Peter!
Вот где собака зарылась)
Мне казалось что отсчет идет с нуля когда ранее сталкивался с подобным, тоесть я думал что нулевая позиция это самое начало строки перед первым символом, вот когдато я сделал этот вывод и тут об него споткнулся.
------------
А вот hpwIniRead нужен только для считывания соответствия буква-соответствующий код.
Поправил стартовое значение на 1 и все заработало как надо.. Вот я тюфяк хоть бы догадался попробовать -__-
Еще раз благодарю!


I will alive before dead
 
СообщениеСпасибо огромное Peter!
Вот где собака зарылась)
Мне казалось что отсчет идет с нуля когда ранее сталкивался с подобным, тоесть я думал что нулевая позиция это самое начало строки перед первым символом, вот когдато я сделал этот вывод и тут об него споткнулся.
------------
А вот hpwIniRead нужен только для считывания соответствия буква-соответствующий код.
Поправил стартовое значение на 1 и все заработало как надо.. Вот я тюфяк хоть бы догадался попробовать -__-
Еще раз благодарю!

Автор - UserDead
Дата добавления - 15 Февраля 2014 в 22:23
  • Страница 1 из 1
  • 1
Поиск: