Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт сен 20, 2018 18:58

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 33 ]  На страницу 1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Добавить цифру в строку
СообщениеДобавлено: Сб апр 14, 2012 13:58 
Не в сети

Зарегистрирован: Вс апр 17, 2011 12:28
Сообщения: 34
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Нужно создавать файлы в цикле с именамим File-1.txt File-2.txt и т.д.
Посему получается, что нужно в строку с именем файла добавить индекс цикла I.

Как это можно сделать?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Добавить цифру в строку
СообщениеДобавлено: Сб апр 14, 2012 14:11 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6403
Благодарил (а): 14 раз.
Поблагодарили: 100 раз.
Строка - это массив символов. Символ нуля - 48 (0x30). Берем I 0x30 + и пишем это через C! в нужную позицию массива.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Добавить цифру в строку
СообщениеДобавлено: Сб апр 14, 2012 14:34 
Не в сети

Зарегистрирован: Вс апр 17, 2011 12:28
Сообщения: 34
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
В том то и дело что индекс массива больше 1 разряда? например I=88. Поэтому встает вопрос? как быть?

например где лежит строка "File-" известно, то теперь нужно расширить память выделенную для этой строки, каким то образом организовать преобразование числа в строку, и добавить к строке. Затем к новой строке еще дополнительно добавить расширение ".txt"


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Добавить цифру в строку
СообщениеДобавлено: Сб апр 14, 2012 14:53 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Начать с того, что строка с именем файла должна содержать file-XX.txt
а затем в цикле писать в позиции XX нужные символы и использовать строку...
Строку, разумеется надо в буфер положить, чтобы ее кто-нибудь не съел, пока она в воздухе болтается...

Для двузначных номеров - можно либо два цикла вложенных использовать или прямо номер преобразовывать.
Код:
100 0 DO I 10 / ->1st-symbol \ положить в позицию первого X
I I 10 / 10 * - ->2nd-symbol \ положить в позицию второго X
\ тут делать свои дела с именем файла
LOOP ;


А для односимвольных номеров сдвинуть .txt влево на одну позицию.

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Добавить цифру в строку
СообщениеДобавлено: Сб апр 14, 2012 15:08 
Не в сети

Зарегистрирован: Вс апр 17, 2011 12:28
Сообщения: 34
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
WingLion писал(а):
Начать с того, что строка с именем файла должна содержать file-XX.txt
а затем в цикле писать в позиции XX нужные символы и использовать строку...
Строку, разумеется надо в буфер положить, чтобы ее кто-нибудь не съел, пока она в воздухе болтается...

Для двузначных номеров - можно либо два цикла вложенных использовать или прямо номер преобразовывать.
Код:
100 0 DO I 10 / ->1st-symbol \ положить в позицию первого X
I I 10 / 10 * - ->2nd-symbol \ положить в позицию второго X
\ тут делать свои дела с именем файла
LOOP ;


А для односимвольных номеров сдвинуть .txt влево на одну позицию.


Количество итераций этого цикла не заканчивается двумя разрядами, а может доходить до нескольких разрядов 3,4,5 и т.д.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Добавить цифру в строку
СообщениеДобавлено: Сб апр 14, 2012 15:12 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6403
Благодарил (а): 14 раз.
Поблагодарили: 100 раз.
incubus370 писал(а):
В том то и дело что индекс массива больше 1 разряда? например I=88. Поэтому встает вопрос? как быть?

File-01, File-02... File-10.. File-99


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Добавить цифру в строку
СообщениеДобавлено: Сб апр 14, 2012 15:19 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
incubus370 писал(а):
Количество итераций этого цикла не заканчивается двумя разрядами, а может доходить до нескольких разрядов 3,4,5 и т.д.


Ох... жизнь не удалась... (с)...

По аналогии трудно сделать?
Или нужен ликбез по преобразованию чисел в десятичное представление?

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Добавить цифру в строку
СообщениеДобавлено: Сб апр 14, 2012 15:41 
Не в сети

Зарегистрирован: Вс апр 17, 2011 12:28
Сообщения: 34
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Какое коичество файлов будет не известно. Все зависит от того когда пользователь прервет вычисления. Поэтому точно знать сколько разрядов будет увы не могу


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Добавить цифру в строку
СообщениеДобавлено: Сб апр 14, 2012 16:01 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6403
Благодарил (а): 14 раз.
Поблагодарили: 100 раз.
Есть такой прием. В кварке EMIT - векторное слово. Печать числа использует EMIT. Делаем так

Код:
VARIABLE SYM-COUNTER

CREATE NAME[] 256 ALLOT

: EMIT-TO-NAME  // пишем символ в буфер
  NAME[] SYM-COUNTER @ + C!
  1 SYM-COUNTER +!
;

FROM EMIT
  ' EMIT-TO-NAME TO EMIT
  123 .
TO EMIT


Теперь 123 в виде символов окажется в массиве.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Добавить цифру в строку
СообщениеДобавлено: Сб апр 14, 2012 16:24 
Не в сети

Зарегистрирован: Вс апр 17, 2011 12:28
Сообщения: 34
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Хищник писал(а):
Есть такой прием. В кварке EMIT - векторное слово. Печать числа использует EMIT. Делаем так

Код:
VARIABLE SYM-COUNTER

CREATE NAME[] 256 ALLOT

: EMIT-TO-NAME  // пишем символ в буфер
  NAME[] SYM-COUNTER @ + C!
  1 SYM-COUNTER +!
;

FROM EMIT
  ' EMIT-TO-NAME TO EMIT
  123 .
TO EMIT


Теперь 123 в виде символов окажется в массиве.


кусочек кода
Код:
FROM EMIT
  ' EMIT-TO-NAME TO EMIT
  123 .
TO EMIT

мне не совсем понятен?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Добавить цифру в строку
СообщениеДобавлено: Сб апр 14, 2012 16:36 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6403
Благодарил (а): 14 раз.
Поблагодарили: 100 раз.
incubus370 писал(а):
FROM EMIT

Слово FROM позволяет прочитать текущее состояние векторного слова.
incubus370 писал(а):
TO EMIT

Тут мы его восстанавливаем.

incubus370 писал(а):
' EMIT-TO-NAME TO EMIT
123 .

Назначаем наш обработчик на EMIT, и теперь 123 будет "печататься" в память, а не на экран.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Добавить цифру в строку
СообщениеДобавлено: Сб апр 14, 2012 17:04 
Не в сети

Зарегистрирован: Вс апр 17, 2011 12:28
Сообщения: 34
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Хищник писал(а):
Есть такой прием. В кварке EMIT - векторное слово. Печать числа использует EMIT. Делаем так

Код:
VARIABLE SYM-COUNTER

CREATE NAME[] 256 ALLOT

: EMIT-TO-NAME  // пишем символ в буфер
  NAME[] SYM-COUNTER @ + C!
  1 SYM-COUNTER +!
;

FROM EMIT
  ' EMIT-TO-NAME TO EMIT
  123 .
TO EMIT


Теперь 123 в виде символов окажется в массиве.


таким образом можно получить не только преобразование чисел в текст но и конкатенацию строк. сейчас попытаюсь это организовать


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Добавить цифру в строку
СообщениеДобавлено: Сб апр 14, 2012 17:59 
Не в сети

Зарегистрирован: Вс апр 17, 2011 12:28
Сообщения: 34
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Почему конструкция


Код:
" .txt" 9 " File-" PRINT . PRINT


на экран выводит File-9 .txt

попробовав без пробела перед txt

Код:
".txt" 9 " File-" PRINT . PRINT



выдает ошибку.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Добавить цифру в строку
СообщениеДобавлено: Сб апр 14, 2012 18:08 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6403
Благодарил (а): 14 раз.
Поблагодарили: 100 раз.
Переменная ?.SPACE отвечает за вывод пробела после числа. ?.SPACE OFF отключает пробел. По умолчанию оно включено.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Добавить цифру в строку
СообщениеДобавлено: Сб апр 14, 2012 19:26 
Не в сети

Зарегистрирован: Вс апр 17, 2011 12:28
Сообщения: 34
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
модифицировав код Хищника, получил код как для преобразования чисел встроку, так и для объединения строк

Код:
0 ?.SPACE !  // отключаем пробел после чисел извлеченных со стека

VARIABLE STEP   // переменная что будет пресутствовать в имени файла

VARIABLE SYM-COUNTER
CREATE FILENAME[] 256 ALLOT

: EMIT-TO-NAME  // пишем символ в буфер
  FILENAME[] SYM-COUNTER @ + C!
  1 SYM-COUNTER +!
;

FROM EMIT
  ' EMIT-TO-NAME TO EMIT // теперь весь вывод последовательно перенаправляется в буфер
" File-" PRINT STEP @ . " .txt" PRINT //напечатать File- значение переменной Step (у нас по умолчанию 0) и .txt теперь FILENAME[] содержит следующую строку но без завершающего нуля "File-0.txt".
TO EMIT
FILENAME[] SYM-COUNTER @ + C! 0 помещаем в конце буфера 0 и заканчиваем строку.

FILENAME[] NEWFILE CLOSE //создаем файл с именем File-0.txt и закрываем его


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 33 ]  На страницу 1, 2, 3  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB