Forth
http://fforum.winglion.ru/

Добавить цифру в строку
http://fforum.winglion.ru/viewtopic.php?f=23&t=2839
Страница 1 из 3

Автор:  incubus370 [ Сб апр 14, 2012 13:58 ]
Заголовок сообщения:  Добавить цифру в строку

Нужно создавать файлы в цикле с именамим File-1.txt File-2.txt и т.д.
Посему получается, что нужно в строку с именем файла добавить индекс цикла I.

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

Автор:  Hishnik [ Сб апр 14, 2012 14:11 ]
Заголовок сообщения:  Re: Добавить цифру в строку

Строка - это массив символов. Символ нуля - 48 (0x30). Берем I 0x30 + и пишем это через C! в нужную позицию массива.

Автор:  incubus370 [ Сб апр 14, 2012 14:34 ]
Заголовок сообщения:  Re: Добавить цифру в строку

В том то и дело что индекс массива больше 1 разряда? например I=88. Поэтому встает вопрос? как быть?

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

Автор:  WingLion [ Сб апр 14, 2012 14:53 ]
Заголовок сообщения:  Re: Добавить цифру в строку

Начать с того, что строка с именем файла должна содержать file-XX.txt
а затем в цикле писать в позиции XX нужные символы и использовать строку...
Строку, разумеется надо в буфер положить, чтобы ее кто-нибудь не съел, пока она в воздухе болтается...

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


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

Автор:  incubus370 [ Сб апр 14, 2012 15:08 ]
Заголовок сообщения:  Re: Добавить цифру в строку

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 и т.д.

Автор:  Hishnik [ Сб апр 14, 2012 15:12 ]
Заголовок сообщения:  Re: Добавить цифру в строку

incubus370 писал(а):
В том то и дело что индекс массива больше 1 разряда? например I=88. Поэтому встает вопрос? как быть?

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

Автор:  WingLion [ Сб апр 14, 2012 15:19 ]
Заголовок сообщения:  Re: Добавить цифру в строку

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


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

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

Автор:  incubus370 [ Сб апр 14, 2012 15:41 ]
Заголовок сообщения:  Re: Добавить цифру в строку

Какое коичество файлов будет не известно. Все зависит от того когда пользователь прервет вычисления. Поэтому точно знать сколько разрядов будет увы не могу

Автор:  Hishnik [ Сб апр 14, 2012 16:01 ]
Заголовок сообщения:  Re: Добавить цифру в строку

Есть такой прием. В кварке 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 в виде символов окажется в массиве.

Автор:  incubus370 [ Сб апр 14, 2012 16:24 ]
Заголовок сообщения:  Re: Добавить цифру в строку

Хищник писал(а):
Есть такой прием. В кварке 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

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

Автор:  Hishnik [ Сб апр 14, 2012 16:36 ]
Заголовок сообщения:  Re: Добавить цифру в строку

incubus370 писал(а):
FROM EMIT

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

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

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

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

Автор:  incubus370 [ Сб апр 14, 2012 17:04 ]
Заголовок сообщения:  Re: Добавить цифру в строку

Хищник писал(а):
Есть такой прием. В кварке 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 в виде символов окажется в массиве.


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

Автор:  incubus370 [ Сб апр 14, 2012 17:59 ]
Заголовок сообщения:  Re: Добавить цифру в строку

Почему конструкция


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


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

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

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



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

Автор:  Hishnik [ Сб апр 14, 2012 18:08 ]
Заголовок сообщения:  Re: Добавить цифру в строку

Переменная ?.SPACE отвечает за вывод пробела после числа. ?.SPACE OFF отключает пробел. По умолчанию оно включено.

Автор:  incubus370 [ Сб апр 14, 2012 19:26 ]
Заголовок сообщения:  Re: Добавить цифру в строку

модифицировав код Хищника, получил код как для преобразования чисел встроку, так и для объединения строк

Код:
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 и закрываем его

Страница 1 из 3 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/