2017-01-14 11 views
-1

したがって、私は、入力としてバイトコードファイルを読み込むgolangで単純なAOT仮想マシンを作ろうとしています。私は非常に基本的に、バイトをファイルに書き込んで、次にioutilでそれらを読み取ろうとしていますが、nullの参照解除エラーが発生しています。は、書き込み後にgoでファイルからバイトを読み取ることができません

これは、ファイルへの書き込みに使用する私のpythonのコードです:

btest = open("test.thief", "w") 
bytes_to_write = bytearray([1, 44, 56, 55, 55, 0]) 

btest.write(bytes_to_write) 

btest.close() 

は、これは私がバイトに

package main 

import (
    "fmt" 
    "io/ioutil" 
    "os" 
) 

func main() { 
    //gets command line args 
    userArgs := os.Args[1:] 

    bytes, err := ioutil.ReadFile(userArgs[0]) // just pass the file name 
    if err != nil { 
     fmt.Print(err) 
    } 

    fmt.Println(bytes) 
    machine := NewEnv() 
    ReadBytes(machine, bytes) 

} 

を読み取るために使用しています私の行くファイル内のコードであり、これはありますエラーが発生しています:

Joshuas-MacBook-Pro-3:thief Josh$ ./bin/Thief test.thief 
panic: runtime error: invalid memory address or nil pointer dereference 
[signal 0xb code=0x1 addr=0x0 pc=0x2af3] 

goroutine 1 [running]: 
main.ReadBytes(0xc82000e390, 0xc82000c480, 0x6, 0x206) 
    /Users/Josh/thief/src/Thief/read.go:26 +0x353 
main.main() 
    /Users/Josh/thief/src/Thief/Main.go:18 +0x1f2 

私はまた、バイナリモードでファイルを開こうとしましたが、pythonコード同じエラーが発生します。基本的には、バイトの配列を抽出できるようにしたいだけでなく、テーマを書き込む方法も必要です。

バイトを間違って書き込んでいますか?ここで

はhexdumpがある:

012c 3837 3700

EDIT:

これは私の行く残りのファイル

package main 


//file for machine functions and operations 

//prints string format of some bytes 
func print(env Env, data []byte) { 
    fmt.Println(string(data)) 
} 


var OPERS map[byte]func(Env, []byte) 

//0 is reserved as the null terminator 
func init(){ 
    OPERS = map[byte]func(Env, []byte){ 
     1:print, 
    } 
} 

env.go

opfuncs.goです
package main 


//file for the env struct 



type Env struct { 
    items map[string]interface{} 
} 

func NewEnv() Env { 
    return Env{make(map[string]interface{})} 
} 

//general getter 
func (self *Env) get(key string) interface{} { 
    val, has := self.items[key] 
    if has { 
     return val 
    } else { 
     return nil 
    } 
} 

//general setter 
func (self *Env) set(key string, value interface{}) { 
    self.items[key] = value 
} 

func (self *Env) contains(key string) bool { 
    _, has := self.items[key] 
    return has 
} 

func (self *Env) declare(key string) { 
    self.items[key] = Null{} 
} 

func (self *Env) is_null(key string) bool { 
    _, ok := self.items[key].(Null) 
    return ok 
} 

//deletes an item from storage 
func (self *Env) del(key string) { 
    delete(self.items, key) 
} 

read.goあなたがPythonコード内のファイルへの書き込みをしていないように見えます

package main 

//file that contains the reading function for the VM 

func ReadBytes(env Env, in []byte) { 
    bytes := make([]byte, 1) 
    fn := byte(0) 
    mode := 0 
    for i:=0;i<len(in);i++ { 
     switch mode { 
     case 0: 
      fn = byte(i) 
      mode = 1 
     case 1: 
      if i != len(in)-1 { 
       if in[i+1] == 0 { 
        bytes = append(bytes, in[i]) 
        mode = 2 
       } else { 
        bytes = append(bytes, in[i]) 
       } 
      } else { 
       bytes = append(bytes, in[i]) 
      } 
     case 2: 
      OPERS[fn](env, bytes) 
      mode = 0 
      fn = byte(0) 
      bytes = make([]byte, 1) 
     } 
    } 
} 
+0

あなたが内容を確認するために、ファイルをhexdumpに対してすることができますか? – Sairam

+0

'012c 3837 3700' –

+0

六角ダンプ –

答えて

2

あなたは、Python 3を使用している場合は、ファイルはバイナリモードで開かれている必要があります

btest = open("test.thief", "wb") 
0

私はgolangは、ファイルの内容を見つけることができない理由を説明するだろうあなたの三行目の後

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: write() argument must be str, not bytearray 

を取得します。

また、bytesを使用していないので、ゴコードはコンパイルされません。代わりにこれを行います。

package main 

import (
    "fmt" 
    "io/ioutil" 
    "os" 
) 

func main() { 
    //gets command line args 
    userArgs := os.Args[1:] 

    _, err := ioutil.ReadFile(userArgs[0]) // just pass the file name 
    if err != nil { 
     fmt.Print(err) 
    } 

} 
+0

Im on python3、多分thatsなぜ?私はいくつかの他のコードでバイトを使用していますが、エラーを引き起こさず、関連性がないので削除しました。 –

+0

これはファイルの六角ダンプです –

+0

'012c 3837 3700' –

関連する問題