Программа на C ++, не выходящая из Cygwin при отсутствии свободного - PullRequest
0 голосов
/ 22 мая 2018

Я написал небольшую программу на C ++, чтобы проиллюстрировать что-то другу, и заметил любопытное поведение: программа не завершает работу или не реагирует на CTRL + C после второй печати при запуске в cygwin, но работает, как и ожидалось, при запуске из powershellили перекомпилировать и запустить на Linux.
Когда я раскомментирую строку //free(map);, программа завершается нормально.

Я хотел бы знать , почему cygwin зависает, так что я должен закрытьмятное окно - и если это проблема с моей машиной, как ее исправить.

#include<iostream> // for std::cout
#include<cstdlib> // for atoi, uses input 0 for invalid numbers
#include<stdio.h> // for printf

// typedef for clearer code
typedef int matrixcontent; // change 'int' to whatever kind of elements there are in the matrix

// declarations first, so I can write main whereever I want to
void printMatrix(matrixcontent* map, size_t dimX, size_t dimY) ;
void fillMatrix(matrixcontent* map, size_t dimX, size_t dimY) ;

int main(int argc, char** argv){
    if(argc!=3){
        printf("%s", "please give exactly two arguments.");
        return 1;
    }

    // arg to int
    int y = atoi(argv[1]);
    int x = atoi(argv[2]);

    // create matrix
        // allocate memory space
        matrixcontent* map = (matrixcontent*) malloc(sizeof(matrixcontent)*x*y);
        if(map==NULL){
            printf("%s", "Not enough memory");
        }

    // print current (random) content
    printMatrix(map, x, y);
    // fill matrix
    fillMatrix(map, x, y);
    // print the modified matrix again
    printMatrix(map, x, y);

    //free(map);
    return 0;
}

void printMatrix(matrixcontent* map, size_t dimX, size_t dimY) {
    for(size_t row=0; row<dimY; row++){
        for(size_t col=0; col<dimX; col++){
            std::cout << map[row*dimY+col] << ",\t";
        }
        std::cout << std::endl;
    }
    std::cout << std::endl << std::endl;
}

void fillMatrix(matrixcontent* map, size_t dimX, size_t dimY) {
    for(size_t row=0; row<dimY; row++){
        for(size_t col=0; col<dimX; col++){
            map[row*dimY+col] = col+row; // fill with something
        }
    }
}

Я скомпилировал ее с g++ --std=c++11 -Wall -Wextra -O0 -g example.cpp -o example в cygwin x64 на win10.

Что я пробовал

Debian, работает как задумано
Win10, cygwin x64, настольный ПК, странное поведение, как описано
Win10, cygwin x64, ноутбук, любопытное поведение, как описано с ./example 10 5, но не с ./example 10 20.
Win10, powershell, Laptop, работает как предназначено для ./example 10 5 и ./example 10 20.

1 Ответ

0 голосов
/ 23 мая 2018

Это был не материал Cygwin.Это было переполнение индекса.

[row*dimY+col] делает индекс вне диапазона x * y.

Я думаю, вам лучше использовать

[row*dimX+col] для доступа к map.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...