2016-05-02 9 views
0

Ich programmiere einen Geschwindigkeitskomparator zwischen C++ und GoLang, um Daten für eine statistische Analyse zu erhalten, und ich erstellte ein Python-Skript, um alle Daten zu übernehmen und auszuführen beide Programme. Mit C++ Ich habe keine Probleme und die Ausführung funktioniert, aber in go bekomme ich diesen Fehler:Fehler beim Versuch, ein Golang-Programm von einem Python-Skript auszuführen

panic: runtime error: index out of range 

goroutine 1 [running]: 
runtime.panic(0x44d600, 0x4b9897) 
    /usr/lib/go/src/pkg/runtime/panic.c:266 +0xb6 
main.merge(0xc210047000, 0x9, 0x10, 0x8, 0x8, ...) 
    /windows/DATA/FIB/PE/B7_PLSpeed/nlogn.go:13 +0x22c 
main.mergesort(0xc210047000, 0x9, 0x10, 0x8, 0x9) 
    /windows/DATA/FIB/PE/B7_PLSpeed/nlogn.go:43 +0xec 
main.mergesort(0xc210047000, 0x9, 0x10, 0x5, 0x9) 
    /windows/DATA/FIB/PE/B7_PLSpeed/nlogn.go:42 +0xac 
main.mergesort(0xc210047000, 0x9, 0x10, 0x0, 0x9) 
    /windows/DATA/FIB/PE/B7_PLSpeed/nlogn.go:42 +0xac 
main.main() 
    /windows/DATA/FIB/PE/B7_PLSpeed/nlogn.go:54 +0x1c1 

Wenn mir jemand helfen kann, würde ich mich sehr freuen! Ich werde hier mein Python-Skript und Go-Quellcode hinterlassen.

Python:

import time 
import random 
from subprocess import call 
from sys import argv 


def usage(): 
    print("Usage: " + argv[0] + " <Binary1> <Binary2> <n elements> <#executions>") 

if __name__ == '__main__': 
    if len(argv) != 5: 
     usage() 
    else: 
     program1 = argv[1] 
     program2 = argv[2] 
     n = int(argv[3]) 
     executions = int(argv[4]) 

     for x in range(0, executions): 
      command = [''] 
      # 32-bit range vector(n) random generator 
      for y in range(0, n-1): 
       command.append(str(random.randint(-2147473648, 2147473647))) 

      if(random.choice((True, False))): 
       program1, program2 = program2, program1 

      # Program1 
      command[0] = './' + program1 
      pre = time.time() 
      call(command) 
      post = time.time() 
      f = open(program1 + ' - ' + str(n), 'a') 
      f.write(str(post-pre) + "ms\n") 
      f.close 

      # Program2 
      command[0] = './' + program2 
      pre = time.time() 
      call(command) 
      post = time.time() 
      f = open(program2 + ' - ' + str(n), 'a') 
      f.write(str(post-pre) + "ms\n") 
      f.close 

Go:

package main 

import "strconv" 
import "os" 

func merge(v []int, e int, m int, d int) { 
    size := d-e+1 
    B := make([]int, size) 
    i := e 
    j := m + 1 
    k := 0 
    for i <= m && j <= d { 
     if v[i] <= v[j] { 
      B[k] = v[i] 
      k++ 
      i++ 
     } else { 
      B[k] = v[j] 
      k++ 
      j++ 
     } 
    } 
    for i <= m { 
     B[k] = v[i] 
     k++ 
     i++ 
    } 
    for j <= d { 
     B[k] = v[j] 
     k++ 
     j++ 
    } 
    for k := 0; k <= d-e; k++ { 
     v[e+k] = B[k] 
    } 
} 

func mergesort(v []int, e int, d int) { 
    if e < d { 
     m := (e+d)/2 
     mergesort(v, e, m) 
     mergesort(v, m+1, d) 
     merge(v, e, m, d) 
    } 
} 

func main() { 
    v := make([]int, 0) 
    args := os.Args 
    for i := 1; i < len(args); i++ { 
     f,_ := strconv.Atoi(os.Args[i]) 
     v = append(v, f) 
    } 
    mergesort(v, 0, len(args) - 1) 
} 
+0

Willkommen bei SO ... immer die richtige Antwort markieren, um die Mühe, die sie Renderer –

Antwort

3

Die pr Oblem ist nicht in Python, weil das Go-Programm den gleichen Fehler erhält, ohne von Python aufgerufen zu werden. In Ihrem main func, erstellen Sie eine Scheibe v, ausgehend von Argumente Position 1, so ohne den Namen des Programms genannt:

for i := 1; i < len(args); i++ { 
    f,_ := strconv.Atoi(os.Args[i]) 
    v = append(v, f) 
} 

Aber dann bist du mergesort die Länge args geben, nicht die Länge v, so ist es ein Aus-durch-ein-Fehler, wie es gesagt wurde v hat 1 mehr Element als es tatsächlich tut. Auf der ganzen Linie versucht das Programm ein Element der v zuzugreifen, die über das Ende der Scheibe ist:

mergesort(v, 0, len(args) - 1) 

Versuchen mergesort(v, 0, len(v) - 1) in Ihre Hauptfunktion, statt.

+0

Vielen Dank! Funktioniert perfekt! Was für ein dummer Fehler hahaha – JosepRivaille

-3

Versuchen verändert sich:

call(command) 

zu

call(command, shell=True) 
+1

zu belohnen Das Go-Programm hat einen Fehler, ob es von Python aufgerufen wird, oder nicht, so kann dies nicht das Problem sein. 'command' ist eine Liste im Python-Skript und' call' nimmt ein Listenargument ohne 'shell = True' –

Verwandte Themen