From: Rudolf Polzer Date: 2003-04-02T00:46:58+09:00 Subject: SIGSEGV and crash in $std***.print The following program creates a segfault or interpreter crash extremly fast - but seemingly only on my computer: rpolzer@katsuragi ruby $ ruby putpixel.rb 1>/dev/null putpixel.rb:17: [BUG] Segmentation fault ruby 1.6.8 (2002-12-24) [i686-linux-gnu] Aborted rpolzer@katsuragi ruby $ ruby putpixel.rb 1>/dev/null putpixel.rb:22:in `write': method call on terminated object (NotImplementedError) from putpixel.rb:22:in `print' from putpixel.rb:22:in `setbg' from putpixel.rb:26:in `setfgbg' from putpixel.rb:53:in `printcolors' from putpixel.rb:71:in `redraw_range' from putpixel.rb:68:in `each' from putpixel.rb:68:in `redraw_range' from putpixel.rb:66:in `each' from putpixel.rb:66:in `redraw_range' from putpixel.rb:82:in `put' from putpixel.rb:102 from putpixel.rb:99:in `loop' from putpixel.rb:99 Any idea what could be causing the problem? class Screen def initialize(w, h, f) @w = w @h = 2 * h @f = f @a = Array.new(@h).collect!() do Array.new(@w, 0) end @last_fg = -1 @last_bg = -1 @f.print "\e[11m" end attr_reader :w attr_reader :h def setfg(f) return if @last_fg == f @f.print "\033[3#{f}m" @last_fg = f end def setbg(b) return if @last_bg == b @f.print "\033[4#{b}m" # <---------- @last_bg = b end def setfgbg(f, b) return setbg(b) if @last_fg == f return setfg(f) if @last_bg == b @f.print "\033[3#{f};4#{b}m" @last_fg = f @last_bg = b end def printcolors(a, b) if a == b then if @last_fg == a then @f.print "\333" elsif @last_fg == b then @f.print "\040" elsif rand(2) == 0 then setfg(a) @f.print "\333" else setbg(a) @f.print "\040" end else fb = 0 fb += 2 if a == @last_fg fb += 2 if b == @last_bg fb -= 2 if b == @last_fg fb -= 2 if a == @last_bg fb += 1 - 2 * rand(2) if fb > 0 then setfgbg(a, b) @f.print "\337" else setfgbg(b, a) @f.print "\334" end end end def redraw_range(x, y, w, h) firstline = y / 2 lastline = (y + h - 1)/2 firstcol = x lastcol = x + w - 1 (firstline..lastline).each() do |row| @f.print "\e[#{row + 1};#{firstcol + 1}H" (firstcol..lastcol).each() do |col| color_1 = @a[2*row][col] color_2 = @a[2*row+1][col] printcolors color_1, color_2 end end end def redraw() @f.print "\e[2J" redraw_range(0, 0, @w, @h) end def put(x, y, c) raise "x too small" if x < 0 @a[y][x] = c % 8 redraw_range(x, y, 1, 1) end def get(x, y) @a[y][x] end def destruct() @f.print "\e[10m" end end s = Screen.new(80, 24, $stdout) x = 0 y = 0 dx = 1 dy = 1 loop do x = rand(s.w) y = rand(s.h) c = rand(8) s.put(x, y, c) end