Руководство по устранению отказов Euphoria

 
Если вы застряли, здесь вы найдёте некоторые подсказки, что можно сделать:

1. - Введите команду: guru,
вслед за которой идут некоторые слова, ассоциирующиеся с вашей проблемой.

Например,
guru declare global include

2. - Обратитесь к списку общих проблем, расположенному ниже.
3. - Прочтите подходящие к проблеме разделы документации, т.е. refman.doc или library.doc.
4. - Попытайтесь запустить вашу программу, добавив в неё команды:
        with trace
        trace(1)
в самом начале вашего главного .ex-файла, чтобы вы могли видеть, как ваша программа движется.
5. - Архив почтового списка Euphoria имеет средства поиска. Вы можете поискать свою проблему в старых сообщениях. Имеются неплохие шансы, что ваш вопрос уже когда-то обсуждался.
6. - Обратитесь к действующему форуму Euphoria.

 
Здесь вы найдёте часто возникающие проблемы ( П: ) и их решения ( Р: ).

П: Я запускаю мою программу с exw, и консольное окно исчезает прежде, чем я успеваю прочитать вывод.
Р: Консольное окно появляется только в случае необходимости, и закрывается немедленно по окончании вашей программы. Возможно, вам следует добавить такой код:
        puts(1, "\nPress Enter\n")
        if getc(0) then
        end if
в конце вашей программы.

П: В конце исполнения моей программы я вижу требование "Press Enter" и вынужден нажимать на клавишу Enter. Как я могу избавиться от этого?
Р: Вызовите подпрограмму free_console() непосредственно перед концом вашей программы.
        include dll.e

        free_console()

П: Я хотел бы изменить свойства консольного окна, размеры и т.п.
Р: Запустите программу c:\windows\system\conagent.exe и выберите "Свойства" ("properties"). Вы сможете изменить шрифт и повлиять на несколько других параметров.

П: Когда я запускаю ex.exe в окне DOS под Windows, маленькое окно DOS открывается во весь экран.
Р: Это случается только первый раз, когда вы запускаете ex.exe после создания нового маленького окна DOS. Вы можете вернуться к малому размеру окна, нажав Alt-Enter. После этого окно будет оставаться маленьким. Ваша программа Euphoria может поддерживать малый размер окна, выполнив команды:
        if graphics_mode(-1) then
        end if
в самом начале прогона. При этом может возникнуть короткое мерцание экрана. Но ваша программа может включить и полноэкранный текстовый режим, выполнив команды:
        if graphics_mode(3) then
        end if

П: Моя программа Euphoria CGI зависает или не даёт никакого вывода
Р: Найдите файл ex.err в вашем каталоге cgi-bin. Включите опцию with trace / trace(3), чтобы видеть, какие команды выполняются (см. файл ctrace.out в вашем каталоге cgi-bin). Вставьте without warning в начале вашей программы. Под Windows, при наличии предупреждений, Euphoria будет выводить приглашение перед завершением, заставляя вашу программу висеть. Под Windows вам следует всегда использовать exwc.exe для исполнения программ CGI, или вас могут ждать проблемы со стандартным выходом. На web-сервере Apache возможно использование в вашей программе первой строки вида #!.\exwc.exe, чтобы ваша программа запускалась именно с exwc.exe в текущем каталоге (cgi-bin). Под Linux/FreeBSD, будьте внимательны с окончанием строк программы, первая строка должна заканчиваться на LF, а не на CR-LF, иначе команда #! не будет обработана корректно. Под Linux вы также должны правильно установить разрешения на исполнение вашей программы, а файлы ex.err и ctrace.out должны иметь разрешение на запись, иначе они не будут обновляться сервером. Прочтите документ cgi_r.htm, чтобы вникнуть в детали.

П: Как я могу читать из портов и записывать в них?
Р: Получите набор машинных подпрограмм и системных вызовов DOS Жака Дешена на Web-узле Euphoria. Обратитесь к его файлу ports.e.

П: У меня проблемы с запуском графических программ DOS32. Я нажал control-Break, и теперь моя машина кажется умершей.
Р: Некоторые графические программы не будут работать, если вы не запустите их из DOS или из полноэкранного окна DOS под Windows. Иногда вы должны будете отредактировать ваш исходный код, чтобы использовать графический режим с меньшим разрешением, такой как режим 18. Некоторые режимы графики SVGA могут не работать для вас в окне DOS, но всё будет в порядке, если вы перезагрузите свою машину, запустив сеанс чистой MS-DOS. Иногда может помочь обновление драйвера вашей видеоплаты.

Останавливать свою программу следует тем методом, который в ней предусмотрен и рекомендован документацией. Если вы прерываете программу нажатием на клавиши Ctrl-c или Ctrl-Break, может оказаться так, что ваш экран останется в забавном графическом режиме с неописуемыми цветами. И когда вы начинаете пытаться что-то ввести с клавиатуры, может быть трудно или даже невозможно прочитать, что вы вводите. Система может показаться мёртвой, хотя фактически она ещё жива.

Попытайтесь ввести следующие команды DOS в нижеследующем порядке, пока завалы не расчистятся:

1. введите: Alt-Enter, чтобы получить нормальное (не-полноэкранное) окно.

2. введите: cls
Даже если вы не можете видеть нажатия на клавиши выводимыми на экран, этот приём может расчистить ваш экран.

3. введите: ex
Интерпретатор Euphoria попытается восстановить нормальный экран в текстовом режиме для вас.

4. введите: exit
Если вы работаете под Windows, команда прервёт сессию DOS для вас.

5. введите: Control-Alt-Delete
Эта комбинация клавиш даст вам возможность прекратить текущую сессию DOS под Windows или перезагрузит ваш компьютер, если вы работаете под DOS.

6. Если до сих пор результата нет, остаётся нажать кнопку Reset, если она ещё есть на вашей машине, или нажать и удерживать кнопку включения питания, чтобы затем включить компьютер снова. Вам следует немедленно запустить scandisk, когда система перезагрузится.

П: Когда я запускаю программы Euphoria в режимах SVGA, вывод на экран оказывается свёрнутым в верхней половине экрана.
Р: Попробуйте use_vesa(1) из библиотеки machine.e.

Попытайтесь получить самый свежий драйвер для вашей видеоплаты через Интернет. Например, на сайте ATI, если у вас их плата:

http://www.atitech.com

Иногда видеопроблемы исчезают после установки новейшей версии DirectX.

П: Моя программа оставляет окно DOS в беспорядочном состоянии. Я хотел бы получать нормальное текстовое окно.
Р: Когда ваша программа заканчивается, следует вызвать функцию graphics_mode(-1), чтобы установить окно DOS в обычный текстовый режим, например:
        if graphics_mode(-1) then
        end if

П: Когда я запускаю свою программу из редактора, а затем нажимаю клавиши Ctrl-c, программа умирает с сообщением об ошибке от операционной системы.
Р: Это известная проблема. Запускайте свою программу из командной строки, вне редактора, если думаете, что вам придётся нажать Ctrl-c или Ctrl-Break.

П: Когда я запускаю программу, она не выдаёт сообщения об ошибке, но и ничего другого не происходит.
Р: Вы, вероятно, забыли вызвать свою главную подпрограмму. В программе должна быть команда высшего уровня, которая следует за объявлением главной подпрограммы и вызывает эту главную подпрограмму на исполнение.

П: Я пытаюсь вызвать подпрограмму, описанную в документе library.doc, но получаю сообщение об ошибке, что эта подпрограмма не объявлена.
Р: Не забываете ли вы включить в вашу программу необходимый .e-файл из каталога euphoria\include? Если синтаксисом подпрограммы предусмотрена, например, команда "include graphics.e", то и в вашей программе должна быть строчка "include graphics.e" (без кавычек), которая предваряет первый вызов подпрограммы.

П: У меня есть библиотека и в ней подпрограмма, которую я хочу вызвать, но когда я пытаюсь вызвать эту подпрограмму, выдаётся сообщение об ошибке, что подапрограмма не объявлена. Но она была объявлена.
Р: Похоже, вы забыли поставить слово "global" перед этой подпрограммой в своей библиотеке. Без слова "global" подпрограмма невидима вне своего собственного файла.

П: Как я могу получить строку текста от пользователя моей программы?
Р: Просмотрите определение функции gets() в library.doc. Функция gets(0) будет читать строку со стандартного входа, каковым обычно является клавиатура. Строчка всегда будет оканчиваться автоматически символом \n. Чтобы удалить этот символ (\n), воспользуйтесь командой:
        line = line[1..length(line)-1]
Найдите также функцию prompt_string() в библиотеке get.e.

П: После ввода строки от пользователя с помощью gets(), следующая строка, которая выводится на экран, не начинается у левого поля.
Р: Ваша программа должна вывести символ новой строки, например, puts(SCREEN, '\n') после того, как выполнено gets(). Этот вывод не происходит автоматически.

П: Почему мои вычисления с плавающей точкой не выходят точными?
Р: Процессоры Intel, и большинство других процессоров, для представления дробей используют двоичные числа. Десятичные дроби, такие как 0.1, 0.01 и другие похожие числа не могут быть представлены точно. Например, 0.1 может быть внутренне представлена как 0.0999999999999999. Это означает, что 10 * 0.1 может оказаться 0.999999999999999, а floor(10 * 0.1) может быть 0, а не 1, как вы могли ожидать. Подобное положение может быть весьма неприятным, когда выполняются денежные вычисления, но это не является проблемой Euphoria. Это общая проблема, с которой вы обязательно столкнётесь в большинстве языков программирования. Всегда помните: числа с плавающей точкой - это просто некоторое приближение к "реальным" числам в математике. Предполагается, что любые расчёты с плавающей точкой могут содержать в результате небольшую ошибку. Иногда вы можете решить проблему, воспользовавшись округлением, например, x = floor(x + 0.5) будет округлять x до ближайшего целого. Денежные счета можно выражать целым числом центов, а не дробным числом долларов (или другой валюты), но некоторые расчёты всё ещё могут вызывать трудности этого рода.

П: Как я могу превратить число в строку?
Р: Используйте sprintf() в library.doc. Например,
        string = sprintf("%d", number)
Кроме %d, вы можете опробовать другие форматы вывода, такие как %x (шестнадцатеричный) или %f (плавающей точки).

П: Как я могу превратить строку в число?
Р: Используйте функцию value(), как описано в library.doc, или, если вы читаете из файла или с клавиатуры, используйте get().

П: Интерпретатор говорит, что я пытаюсь переопределить мою переменную for-loop.
Р: Переменные в цикле for-loop определяются автоматически. Очевидно, вы уже сделали объявление с тем же самым именем ранее в своей программе или подпрограмме. Удалите то раннее объявление или измените имя переменной вашего цикла.

П: Я получаю сообщение "unknown escape character" в строке, где я пытаюсь задать имя файла.
Р: Не говорите "C:\TMP\MYFILE", а скажите "C:\\TMP\\MYFILE". Обратная косая черта используется для esc-символов, таких как \n или \t. Чтобы задать одну эту черту в строке, вы должны набрать её дважды, вот так: \\.

П: Я пытаюсь использовать мышь в графике режима SVGA, но она просто не работает.
Р: DOS не поддерживает ввод от мыши в графических режимах выше режима 18 (640x480 16 цветов). DOS 7.0 (часть Windows 95/98), судя по всему, даёт вам возможность, по крайней мере, читать координаты x-y и состояние кнопок в режимах с более высоким разрешением, но там вы должны рисовать свой собственный курсор мыши. Грэм Барки, Питер Блю и другие имеют хорошие решения этой проблемы. Поищите их файлы на Web-странице Архива Euphoria.

П: Я пытаюсь печатать строку, используя printf(), но отображается только первый символ.
Р: Прочтите описание printf() в library.doc. Там всё дело в скобках, в которые вы должны забрать свою строку, чтобы она выглядела как единственный объект для печати, например, вы пишете:
        printf(1, "Hello %s", mystring)
но должны были бы сказать:
        printf(1, "Hello %s", {mystring})

П: Когда я печатаю числа, используя print() или ?, отображается только 10 значащих цифр.
Р: Euphoria обычно и показывает около 10 цифр. Во внутреннем представлении все вычисления производятся, по крайней мере, с 15-ю значащими цифрами. Чтобы вывести на отображение больше цифр, вы должны использовать printf(). Например,
        printf(1, "%.15f", 1/3)
Здесь будет выведено 15 цифр.

П: Интерпретатор жалуется на моё определение подпрограммы, говоря "a type is expected here" ("здесь ожидается тип").
Р: Euphoria требует от вас явного указания типа для каждого отдельно взятого параметра подпрограммы. Например,
        procedure foo(integer x, y)         -- НЕПРАВИЛЬНО
        procedure foo(integer x, integer y) -- ПРАВИЛЬНО
Во всех остальных случаях можно составлять список:
        atom a, b, c, d, e

П: Я объявляю некоторые переменные в середине подпрограммы, и это даёт мне синтаксическую ошибку.
Р: Все объявления ваших частных переменных должны находиться в самом начале вашей подпрограммы перед любыми выполняемыми командами. (На высшем уровне программы, вне любых подпрограмм, вы можете объявлять переменные везде, где это вам удобно.)

П: Интерпретатор говорит:
Syntax Error - expected to see possibly 'xxx', not 'yyy'
("Синтаксическая ошибка - ожидается возможно 'xxx', а не 'yyy'")
Р: В этой точке вашей программы вы напечатали переменную, ключевое слово, число или символ пунктуации, yyy, который синтаксически здесь неуместен и не вяжется с тем, что идёт перед ним. Компилятор предлагает вам один пример, xxx, из тех вариантов, которые подходили бы в этой точке вместо yyy. Имейте в виду, что может быть много других законных (и значительно лучших) возможностей в этой точке, чем xxx, но xxx просто наводит вас на мысль, что компилятор что-то себе тоже "думает".

П: У меня проблемы с запуском Euphoria под DR-DOS.
Р: В вашем файле config.sys нужно оставить только HIMEM.SYS, но исключить в нём EMM386.EXE.

П: Я пытаюсь запустить программу с exw, но он говорит:
"this is a Windows NT character-mode executable"
"это исполняемый файл текстового режима Windows NT".
Р: Интерпретатор exw.exe является 32-х разрядно программой Windows. Он должен запускаться под Windows или в окне DOS. Он не будет работать под чистой DOS на старой системе. Интерпретатор ex.exe будет работать под чистой DOS.