Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пт апр 19, 2024 20:25

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: Непонятки при отладке
СообщениеДобавлено: Вс авг 10, 2008 23:52 
Не в сети

Зарегистрирован: Сб май 19, 2007 18:05
Сообщения: 18
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
Собственно фабула: начал писать прогу, отлаживая по словам. И наткнулся на непонятную ошибку.
ВОт полный текст проги:
Код:
CREATE BUF1 10240 ALLOT
CREATE BUF2 10240 ALLOT
CREATE BUF 20 ALLOT
VARIABLE R_FILE
VARIABLE W_FILE
VARIABLE 0EndLine0
VARIABLE 0EndFile0
VARIABLE  0u1
VARIABLE  0u2
VARIABLE  0adr2

: INIT0
S" D:\TXT\1.txt"  R/O OPEN-FILE

0 = IF
        R_FILE !
    ELSE
        BYE
    THEN

S" D:\TXT\rez_txt.txt" W/O CREATE-FILE
0 = IF
         W_FILE !
    ELSE
        BYE
    THEN
;
: FIND_POS
BUF1  0u1 @ S" >" SEARCH DROP
1 - SWAP 1 + SWAP
;
: CLOSE_FILES
R_FILE @ CLOSE-FILE DROP
W_FILE @ CLOSE-FILE DROP
;

: END_QUIT
  CLOSE_FILES
  BYE
;

: R_LINE
BUF1 10240 R_FILE @ READ-LINE
1 - AND IF
       0u1 ! 0 0EndFile0 !
          ELSE
      -1 0EndFile0 ! END_QUIT
          THEN   
;
: FIND_STR
BEGIN
R_LINE
BUF1 0u1 @ S" <DIV align=justify xmlns" SEARCH
SWAP DROP SWAP DROP
UNTIL
;

: T
INIT0
FIND_STR
;


После запуска слова T, попытка с консоли вызвать адрес BUF2 вызывает ошибку:
Код:
SP-FORTH - ANS FORTH 94 for Win95/98/ME/NT/2000/XP
Open source project at http://spf.sf.net
Russian FIG at http://www.forth.org.ru ; Started by A.Cherezov
Version 4.18 Build 003 at 28.Mar.2008

T
Ok
BUF2
EXCEPTION!  CODE:C000001D  ADDRESS:5520A5  WORD:?BR-OPT-RULES  REGISTERS:
12EDA8   94 1E 32 00  85 B8 55 00  04 00 00 00  A5 20 55 00 Ф.2.Е╕U.....е U.
12EDB8   A5 20 55 00  4F 6D 81 7C  C8 FF 12 00  A5 20 55 00 е U.OmБ|╚ ..е U.
12EDC8   1B 00 00 00  86 02 01 00  D8 EF 12 00  23 00 00 00 ....Ж...╪я..#...
USER DATA: 321E94 THREAD ID: BB0 HANDLER: 12EFE8 RETURN STACK:
12EFD8 :  555383 INTERPRET_
12EFDC :  55540A INTERPRET
12EFE0 :  55565C MAIN1
12EFE4 :  544FDC CATCH
12EFE8 :  12EFF8 <not found>
END OF EXCEPTION REPORT
BUF2
  ^ 0xC000001DL ILLEGAL_INSTRUCTION

Где у меня в программе косяк - никак не могу понять, подскажите плииз...


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
marc_2006 писал(а):
CREATE BUF1 10240 ALLOT
CREATE BUF2 10240 ALLOT

ошибка в том, что слишком много памяти выделено из базовой памяти системы.
вы вышли за предельно адресуемый верхний адрес.
Лечится это использованием буферов в Хипе:
Код:

: InitBuffers ( --> )
                  10240 ALLOCATE THROW TO BUF1
                  10240 ALLOCATE THROW TO BUF2 ;


возможно что-то еще, но дальше этого я не смотрел


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
дальше советы по-мелочам (то что бросилось в глаза)
marc_2006 писал(а):
: INIT0
S" D:\TXT\1.txt"  R/O OPEN-FILE
0 = IF
        R_FILE !
    ELSE
        BYE
    THEN
S" D:\TXT\rez_txt.txt" W/O CREATE-FILE
 0 = IF
         W_FILE !
    ELSE
        BYE
    THEN
;


нет никакой необходимости ставить 0 = , так как флаг уже лежит на вершине стека, удобнее либо поменять код внутри ветвлений местами, либо пользовать сразу IFNOT .

но можно было обойтись значительно проще:
Код:
: (INTO)
          S" D:\TXT\1.txt"  R/O OPEN-FILE THROW R_FILE !
          S" D:\TXT\rez_txt.txt" W/O CREATE-FILE THROW W_FILE !

: INTO ['] (INTO) CATCH IF BYE THEN ;


Кстати, интересный момент, почему советуют при выходе из программы закрывать открытые файлы?
ведь в практически всех современных системах это производится автоматически!


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн авг 11, 2008 03:18 
CREATE BUF1 10240 ALLOT
BUF1 10240 R_FILE @ READ-LINE

Для READ-LINE передается максимальная длина строки, а буфер требуется на два символа больше указанного счетчика.

Надо:
BUF1 10240 2 CHARS - R_FILE @ READ-LINE


Вернуться к началу
  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

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


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

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


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

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