Euphoria Trouble-Shooting Guide

 
If you get stuck, here are some things you can do:

1. - Type: guru
followed by some keywords associated with your problem.

For example,
guru declare global include

2. - Check the list of common problems (below).
3. - Read the relevant parts of the documentation, i.e. refman.doc or library.doc.
4. - Try running your program with the statements:
        with trace
        trace(1)
at the top of your main .ex file so you can see what's going on.
5. - The Euphoria mailing list has a search facility. You can search the archive of all previous messages. There's a good chance that your question has already been discussed.
6. - Post a message on the mailing list.

 
Here are some commonly reported problems ( P: ) and their solutions ( S: ).

P: I ran my program with exw and the console window disappeared before I could read the output.
S: The console window will only appear if required, and will disappear immediately when your program finishes execution. Perhaps you should code something like:
        puts(1, "\nPress Enter\n")
        if getc(0) then
        end if
at the end of your program.

P: At the end of execution of my program, I see "Press Enter" and I have to hit the Enter key. How do I get rid of that?
S: Call free_console() just before your program terminates.
        include dll.e
        
        free_console()

P: I would like to change the properties of the console window.
S: Right click on c:\windows\system\conagent.exe and select "properties". You can change the font and several other items.

P: When I run ex.exe in a DOS Window, it makes my small DOS window go to full screen.
S: This will only happen the first time you run ex.exe after creating a new small DOS window. You can make the window small again by pressing Alt-Enter. It will stay small after that. Your Euphoria program can keep the window small by executing:
        if graphics_mode(-1) then
        end if
at the start of execution. This may cause some brief screen flicker. Your program can force a text window to be full-screen by executing:
        if graphics_mode(3) then
        end if

P: My Euphoria CGI program hangs or has no output
S: Look for an ex.err file in your cgi-bin directory. Turn on with trace / trace(3) to see what statements are executed (see ctrace.out in your cgi-bin). Insert without warning at the top of your program. On Windows, when there are warnings, Euphoria will issue a prompt before terminating, causing your program to hang. On Windows you should always use exwc.exe to run CGI programs, or you may have problems with standard output. With Apache Web Server, you can have a first line in your program of: #!.\exwc.exe to run your program using exwc.exe in the current (cgi-bin) directory. On Linux/FreeBSD, be careful that your first line ends in LF, not CR-LF, or the #! won't be handled correctly. On Linux you must also set the execute permissions on your program correctly, and ex.err and ctrace.out must be writable by the server process or they won't be updated. See cgi.htm for more

P: How do I read/write ports?
S: Get Jacques Deschenes' collection of machine-level and DOS system routines from the Euphoria Web page. See his file ports.e.

P: I'm having trouble running a DOS32 graphics program. I hit control-Break and now my system seems to be dead.
S: Some graphics programs will not run unless you start them from DOS or from a full-screen DOS window under Windows. Sometimes you have to edit the program source to use a lower resolution graphics mode, such as mode 18. Some SVGA graphics modes might not work for you under a DOS window, but will work when you restart your machine in MS-DOS mode. A better driver for your video card might fix this.

You should stop a program using the method that the program documentation recommends. If you abort a program with control-c or control-Break you may find that your screen is left in a funny graphics mode using funny colors. When you type something, it may be difficult or even impossible to read what you are typing. The system may even appear dead, when in fact it is not.

Try the following DOS commands, in the following order, until you clear things up:

1. type: Alt-Enter to get a normal (non-full-screen) window again.

2. type: cls
Even when you can't see any keystrokes echoed on the screen this may clear the screen for you.

3. type: ex
The Euphoria interpreter will try to restore a normal text mode screen for you.

4. type: exit
If you are running under Windows, this will terminate the DOS session for you.

5. type: Control-Alt-Delete
This will let you kill the current DOS session under Windows, or will soft-reboot your computer if you are running under DOS.

6. If all else fails, reset or power your computer off and back on. You should immediately run scandisk when the system comes back up.

P: When I run Euphoria programs in SVGA, the output on the screen is crammed into the top part of the screen.
S: Try: use_vesa(1) in machine.e.

Try downloading the latest driver for your video card from the Internet. ATI's site is:

http://www.atitech.com

Others have had their video problems clear up after installing the latest version of DirectX.

P: My program leaves the DOS window in a messy state. I want it to leave me with a normal text window.
S: When your program is finished, it should call the function graphics_mode(-1) to set the DOS window back to normal. e.g.
        if graphics_mode(-1) then
        end if

P: When I run my program from the editor and I hit control-c, the program dies with an operating system error.
S: This is a known problem. Run your program from the command-line, outside the editor, if you might have to hit control-c or control-Break.

P: When I run my program there are no errors but nothing happens.
S: You probably forgot to call your main procedure. You need a top-level statement that comes after your main procedure to call the main procedure and start execution.

P: I'm trying to call a routine documented in library.doc, but it keeps saying the routine has not been declared.
S: Did you remember to include the necessary .e file from the euphoria\include directory? If the syntax of the routine says for example, "include graphics.e", then your program must have "include graphics.e" (without the quotes) before the place where you first call the routine.

P: I have an include file with a routine in it that I want to call, but when I try to call the routine it says the routine has not been declared. But it has been declared.
S: Did you remember to define the routine with "global" in front of it in the include file? Without "global" the routine is not visible outside of its own file.

P: How do I input a line of text from the user?
S: See gets() in library.doc. gets(0) will read a line from standard input, which is normally the keyboard. The line will always have \n on the end. To remove the trailing \n character do:
        line = line[1..length(line)-1]
Also see prompt_string() in get.e.

P: After inputting a string from the user with gets(), the next line that comes out on the screen does not start at the left margin.
S: Your program should output a new-line character e.g. puts(SCREEN, '\n') after you do a gets(). It does not happen automatically.

P: Why aren't my floating-point calculations coming out exact?
S: Intel CPU's, and most other CPU's, use binary numbers to represent fractions. Decimal fractions such as 0.1, 0.01 and similar numbers can't be represented precisely. For example, 0.1 might be stored internally as 0.0999999999999999. That means that 10 * 0.1 might come out as 0.999999999999999, and floor(10 * 0.1) might be 0, not 1 as you'd expect. This can be a nuisance when you are dealing with money calculations, but it's not a Euphoria problem. It's a general problem that you must face in most programming languages. Always remember: floating-point numbers are just an approximation to the "real" numbers in mathematics. Assume that any floating-point calculation might have a tiny bit of error in the result. Sometimes you can solve the problem by rounding, e.g. x = floor(x + 0.5) would round x off to the nearest integer. Storing money values as an integer number of pennies, rather than a fractional number of dollars (or similar currency) will help, but some calculations could still cause problems.

P: How do I convert a number to a string?
S: Use sprintf() in library.doc. e.g.
        string = sprintf("%d", number)
Besides %d, you can also try other formats, such as %x (Hex) or %f (floating-point).

P: How do I convert a string to a number?
S: Use value() in library.doc, or, if you are reading from a file or the keyboard, use get().

P: It says I'm attempting to redefine my for-loop variable.
S: For-loop variables are declared automatically. Apparently you already have a declaration with the same name earlier in your routine or your program. Remove that earlier declaration or change the name of your loop variable.

P: I get the message "unknown escape character" on a line where I am trying to specify a file name.
S: Do not say "C:\TMP\MYFILE". You need to say "C:\\TMP\\MYFILE". Backslash is used for escape characters such as \n or \t. To specify a single backslash in a string you need to type \\.

P: I'm trying to use mouse input in a SVGA graphics mode but it just doesn't work.
S: DOS does not support mouse input in modes beyond graphics mode 18 (640x480 16 color). DOS 7.0 (part of Windows 95/98) does seem to let you at least read the x-y coordinate and the buttons in high resolution modes, but you may have to draw your own mouse pointer in the high-res modes. Graeme Burke, Peter Blue and others have good solutions to this problem. See their files on the Euphoria Archive Web page.

P: I'm trying to print a string using printf() but only the first character comes out.
S: See the printf() description in library.doc. You may need to put braces around your string so it is seen as a single value to be printed, e.g. you wrote:
        printf(1, "Hello %s", mystring)
where you should have said:
        printf(1, "Hello %s", {mystring})

P: When I print numbers using print() or ?, only 10 significant digits are displayed.
S: Euphoria normally only shows about 10 digits. Internally, all calculations are performed using at least 15 significant digits. To see more digits you have to use printf(). For example,
        printf(1, "%.15f", 1/3)
This will display 15 digits.

P: It complains about my routine declaration, saying "a type is expected here".
S: When declaring subroutine parameters, Euphoria requires you to provide an explicit type for each individual parameter. e.g.
        procedure foo(integer x, y)         -- WRONG
        procedure foo(integer x, integer y) -- RIGHT
In all other contexts it is ok to make a list:
        atom a, b, c, d, e

P: I'm declaring some variables in the middle of a routine and it gives me a syntax error.
S: All of your private variable declarations must come at the beginning of your subroutine, before any executable statements. (At the top-level of a program, outside of any routine, it is ok to declare variables anywhere.)

P: It says:
Syntax Error - expected to see possibly 'xxx', not 'yyy'
S: At this point in your program you have typed a variable, keyword, number or punctuation symbol, yyy, that does not fit syntactically with what has come before it. The compiler is offering you one example, xxx, of something that would be accepted at this point in place of yyy. Note that there may be many other legal (and much better) possibilities at this point than xxx, but xxx might at least give you a clue as to what the compiler is "thinking".

P: I'm having problems running Euphoria with DR-DOS.
S: Your config.sys should have just HIMEM.SYS but not EMM386.EXE in it.

P: I try to run a program with exw and it says "this is a Windows NT character-mode executable".
S: exw.exe is a 32-bit Windows program. It must be run under Windows or in a DOS Window. It will not work under plain DOS in an old system. ex.exe will work under plain DOS.