Problem with mydata.ex
- Posted by davidmosley Feb 21, 2010
- 1103 views
Hi I have a problem with mydata.ex,When i changed the fields and then i ran the program,i add a record,then i tried to list all records i get a error in the show procedure see below: I can not firure out why,can you help thanks David Mosley davidpmosley@gmail.com
error file:
C:\euphoria\DEMO\mydata.ex:86 in procedure show() subscript value 4 is out of bounds, reading from a sequence of length 3 f = 1 key = {53'5',48'0',53'5',51'3',50'2',53'5',53'5',53'5',56'8',53'5'} data = { {77'M',111'o',115's',108'l',101'e',121'y'}, {68'D',97'a',118'v',105'i',100'd'}, {80'P'} } i = 5 ... called from C:\euphoria\DEMO\mydata.ex:162 in procedure list() f = 1 rec = 2 ... called from C:\euphoria\DEMO\mydata.ex:205 in procedure main() command = {76'L'} printer = <no value> ... called from C:\euphoria\DEMO\mydata.ex:222 Global & Local Variables c:\euphoria\include\machine.e: mem = 46013088 check_calls = 1 c:\euphoria\include\misc.e: pretty_end_col = <no value> pretty_chars = <no value> pretty_start_col = <no value> pretty_level = <no value> pretty_file = <no value> pretty_ascii = <no value> pretty_indent = <no value> pretty_ascii_min = <no value> pretty_ascii_max = <no value> pretty_line_count = <no value> pretty_line_max = <no value> pretty_dots = <no value> pretty_fp_format = <no value> pretty_int_format = <no value> pretty_line = <no value> c:\euphoria\include\file.e: SLASH = 92'\' my_dir = -2 c:\euphoria\include\get.e: input_file = <no value> input_string = <no value> string_next = <no value> ch = <no value> c:\euphoria\include\database.e: current_db = 3 current_table = 23 db_names = { {109'm',121'y',100'd',97'a',116't',97'a',46'.',101'e',100'd', 98'b'} } db_file_nums = {3} db_lock_methods = {0} current_lock = 0 SLASH_CHAR = {92'\',47'/'} key_pointers = {620,481} db_fatal_id = 0 mem0 = 46013104 mem1 = 46013105 mem2 = 46013106 mem3 = 46013107 memseq = {46013104,4}
Mydata.ex
----------------------- Simple Customizable Database ----------------------- -- This program uses the Euphoria Database System (EDS) to create and -- maintain a simple database. You can customize this program by modifying -- the FIELDS variable (below). You'll have to delete or rename the -- "mydata.edb" database file if you change the number of fields. constant FIELDS = { -- The first field is the "key" value used for lookups, -- and it must only occur in one record. We used the phone number -- (like our local dry cleaner does). -- You might want to use the surname, or invent a "person number" -- as an artificial but unique key. "Phone number", -- The other fields can be whatever you like. Feel free to change -- or add more fields... "Last Name", "First name", "Middle Initial", "Address", "City", "State", "Zip", "Email", "Web Site" } -- file to store the database in: constant MYNAME = "mydata.edb" include database.e -- Euphoria Database System include get.e include sort.e include wildcard.e constant KEYBOARD = 0, SCREEN = 1, ERROR = 2 constant TRUE = 1 constant WHITE_SPACE = " \t\n" constant FORM_FEED = 12 type file_number(integer x) -- document which vars are used as file numbers return x >= 0 end type procedure myfatal(sequence msg) -- fatal error puts(ERROR, '\n' & "An unexpected error occurred: " & msg & '\n') ? 1/0 -- too see call stack end procedure function user_input() -- get user input from keyboard object line while TRUE do line = gets(KEYBOARD) if sequence(line) then -- delete any leading whitespace while find(line[1], WHITE_SPACE) do line = line[2..length(line)] if length(line) = 0 then exit end if end while if length(line) > 0 then exit end if end if puts(SCREEN, "\n? ") end while -- delete trailing whitespace while find(line[length(line)], WHITE_SPACE) do line = line[1..length(line)-1] end while return line end function procedure show(file_number f, object key, object data) puts(f, "\n" & key & '\n') -- changed for i = 2 to 1 for i = 2 to length(FIELDS) do puts(f, '\t' & data[i-1] & '\n') end for end procedure procedure add() -- add a new record to the database sequence key, data integer f puts(SCREEN, "\n\t" & FIELDS[1] & ": ") key = user_input() f = db_find_key(key) if f >= 1 then show(SCREEN, db_record_key(f), db_record_data(f)) puts(SCREEN, "Do you want to update this record? (y/n) ") if find('n', gets(0)) then return end if end if data = {} for i = 2 to length(FIELDS) do puts(SCREEN, "\n\t" & FIELDS[i] & ": ") data = append(data, user_input()) end for puts(SCREEN, '\n') if f >= 1 then -- update data part of record db_replace_data(f, data) else -- insert new record if db_insert(key, data) != DB_OK then myfatal("insert failed!\n") end if end if end procedure procedure delete() -- delete a record, given first field sequence name integer d puts(SCREEN, "\n\t" & FIELDS[1] & ": ") name = user_input() d = db_find_key(name) if d < 0 then puts(SCREEN, "\n\tnot found\n") return end if show(SCREEN, db_record_key(d), db_record_data(d)) puts(SCREEN, "Delete? (y/n) ") if find('n', gets(0)) then return end if db_delete_record(d) end procedure procedure find_name() -- find the record that matches the surname sequence name integer f puts(SCREEN, "\n\t" & FIELDS[1] & ": ") name = user_input() f = db_find_key(name) if f < 0 then puts(SCREEN, "\n\tnot found\n") return end if show(SCREEN, db_record_key(f), db_record_data(f)) end procedure procedure list(file_number f) -- list the entire database to a device puts(f, '\n') for rec = 1 to db_table_size() do -- changed f to screen show(f, db_record_key(rec), db_record_data(rec)) end for end procedure procedure main() sequence command file_number printer -- open or create the database if db_open(MYNAME, DB_LOCK_NO) != DB_OK then if db_create(MYNAME, DB_LOCK_NO) != DB_OK then myfatal("Couldn't create database") end if if db_create_table("phone numbers") != DB_OK then myfatal("couldn't create table") end if end if -- select the (only) table in the database if db_select_table("phone numbers") != DB_OK then myfatal("couldn't select table\n") end if -- prompt the user for his command clear_screen() puts(SCREEN, "\t\tSimple Database\n") while TRUE do puts(SCREEN, "\n(a)dd, (d)elete, (f)ind, (l)ist, (p)rint, (q)uit: ") command = upper(user_input()) if 'A' = command[1] then add() elsif 'D' = command[1] then delete() elsif 'F' = command[1] then find_name() elsif 'Q' = command[1] then exit elsif 'L' = command[1] then list(SCREEN) elsif 'P' = command[1] then printer = open("PRN", "w") if printer = -1 then puts(SCREEN, "Can't open printer device\n") else list(printer) puts(printer, FORM_FEED) close(printer) end if else puts(SCREEN, "\nsay what?\n") end if end while end procedure main()
[reformatted with console and eucode tags..matt]