MSYS2 Vala без консольного выхода - PullRequest
0 голосов
/ 06 января 2019

Если я создаю простую программу, состоящую из одного отпечатка, то все работает нормально, и вывод есть, но в этом примере кода по какой-то причине вывод пуст. Это пример оптимизации по векторизации:

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 ~

Даже не обычная печать («ТЕСТ»); Я попробовал стандартный пример таймера , и он работает:

gavr@DESKTOP-B57MHT8 MINGW64 ~
$ ./timer.exe
1.1: 0.00014100000000000001, 141
1.2: 0.0011130000000000001, 1113
2.1: 0.00052999999999999998, 530

что не так с моим кодом?

1 Ответ

0 голосов
/ 06 января 2019

Это может быть связано с буферизацией терминала в MSYS2. Вы можете попробовать stdout.flush (); в конце программы.

Другой вариант - компиляция приложений Windows. Существует опция компилятора -mconsole для компиляции программ с поддержкой консоли. Чтобы передать это из компилятора Vala, вы должны использовать valac -X -mconsole myprogram.vala.

...