如果我创建了一个由一张纸组成的简单程序,那么一切正常,输出就在那里,但是在此示例代码中,由于某种原因,输出为空。这是通过向量化进行优化的示例:
void ink(int[] arr,int a){
for (int i=0;i<arr.length-8;i+=8) {
arr[i]+=a; arr[i+1]+=a; arr[i+2]+=a; arr[i+3]+=a;
arr[i+4]+=a; arr[i+5]+=a; arr[i+6]+=a; arr[i+7]+=a;
//print(@"$i , $(i+1), $(i+2), $(i+3)\n");
//print(@"$(arr[i]) , $(arr[i+1]), $(arr[i+2]), $(arr[i+3])\n\n");
}
int idx = arr.length - (arr.length %8);
for (int k = idx;k<arr.length;k++) {
arr[k]+=a;
}
// for (int i=0;i<arr.length;i++) {
// arr[i]+=a;
// }
}
void printMass(int[] arr){
stdout.printf("\nAfter ink\n");
foreach (int a in arr) {
print(a.to_string() + "\n");
}
}
int main(string[] args) {
int arr [999999];
for (int i=0;i<arr.length;i++) {
arr[i]=Random.int_range(0,100);
//print(arr[i].to_string() + "\n");
}
stdout.printf(@"ink of $(arr.length) elements\n");
Timer tmr = new Timer();
ink(arr,5);
tmr.stop();
ulong mcSec=0;tmr.elapsed(out mcSec);
stdout.printf(@"microseconds have passed $mcSec");
stdout.printf("TEST");
//printMass(arr);
return 0;
}
在Linux上,我得到:
ink of 999999 elements
microseconds have passed 2462TEST⏎
在Windows MSYS2控制台上:
gavr@DESKTOP-B57MHT8 MINGW64 ~
$ ./console.exe
gavr@DESKTOP-B57MHT8 MINGW64 ~
甚至不是常规打印(“ TEST”); 我尝试了timer的标准示例,并且可以正常工作:
gavr@DESKTOP-B57MHT8 MINGW64 ~
$ ./timer.exe
1.1: 0.00014100000000000001, 141
1.2: 0.0011130000000000001, 1113
2.1: 0.00052999999999999998, 530
我的代码有什么问题?
答案 0 :(得分:0)
这可能与MSYS2的终端缓冲有关。您可以在程序结尾尝试stdout.flush ();
。
另一个选择是Windows应用程序的编译方式。有-mconsole
编译器选项可用来编译具有控制台支持的程序。要将其从Vala编译器传递出去,可以使用valac -X -mconsole myprogram.vala
。