1

Тема: Заповнення матриці, проблема з компілятором VS2012

Даний код працює для парних чисел, для непарних - після вводу значення припиняє робот.
Інша людина пробувала в себе запустити в Builder XE3, то в неї все працює.
Не розумію, що в мене з компілятором тоді?!

#include <iostream>
#include <conio.h>
#include <stdlib.h>
 
using namespace std;
 
void func (int** arr, int n);
 
int main()
{
    cout << "Vvedit rozmirnist matrici: ";
    int n;
    cin >> n;
 
    int **matrix = new int*[n];
    for(int i = 0; i < n; ++i)
    matrix[i] = new int[n];
 
    for(int i = 0; i < n; ++i)
    for(int j = 0; j < n; ++j)
    matrix[i][j] = 1;
 
    func(matrix, n);
 
    for(int i = 0; i < n; ++i)
    {
        for(int j = 0; j < n; ++j)
        cout << matrix[i][j] << ' ';
        cout << endl;
    }
 
    for(int i = 0; i < n; ++i)
    delete [] matrix[i];
    delete [] matrix;
   
    _getch();

    system("pause");
}
 
void func(int** arr, int n)
{
    for(int i = 0; i < n/2+1; ++i)
        for(int j = i; j < n-i; ++j)
        {
            arr[(n/2)-i-1][j] = 0;
            arr[i+(n/2)][j] = 0;
        }
}
Post's attachments

Image 1.png 89.45 kb, 337 downloads since 2015-03-13 

2

Re: Заповнення матриці, проблема з компілятором VS2012

Думаю причина тут:

Daveper написав:
void func(int** arr, int n)
{
    for(int i = 0; i < n/2+1; ++i)
        for(int j = i; j < n-i; ++j)
        {
            arr[(n/2)-i-1][j] = 0;
            arr[i+(n/2)][j] = 0;
        }
}

i змінюється від 0 до n/2 включно
у виразі arr[(n/2)-i-1][j] = 0; настає момент, коли і = n/2,
=> arr[(n/2)-(n/2)-1][j] = 0;
=> arr[-1][j] = 0;
Дивно, як програма взагалі працювала.

Подякували: Daveper1

3

Re: Заповнення матриці, проблема з компілятором VS2012

Daveper написав:

для непарних

Ну, власне, ви вже майже відповіли на питання "чому припиняє роботу". Єдине місце, де можливі проблеми з адресацією непарних - це

  for(int i = 0; i < n/2+1; ++i)
  ...
            arr[(n/2)-i-1][j] = 0;
            arr[i+(n/2)][j] = 0;

Давайте подивимося: якщо n = 4, то i змінюється від 0 до 2 включно, а перший параметр масиву - від (2-0-1)=1 до (2-2-1)=-1 і від (0+2)=2 до (2+2)=4, тобто виходить за межі масиву. Якщо n=5, то i від 0 до 2, і параметри ті самі. А вихід за межі масиву - не помилка. а UB - невизначена поведінка. Це означає, що може статися що завгодно - зокрема, виникне повідомлення про помилку або програма закінчить працювати або відформатує вам диск (добре, ймовірність цього вкрай мала) абощо. Причому це залежить від компілятора. І це проблема не компілятора, а вашої програми.

Подякували: Daveper1

4

Re: Заповнення матриці, проблема з компілятором VS2012

Як тоді правильно написати програму?
Ось моє завдання:
Задано квадратну матрицю, всі елементи якої рівні одиниці.
Написати функцію void func (int** arr, int n),
котра заповняє заштриховану область матриці (згідно варіанту) нулями.
Розмір масиву вводиться з клавіатури.

Post's attachments

Image 2.png, 597 b, 46 x 45
Image 2.png 597 b, 530 downloads since 2015-03-14 

5

Re: Заповнення матриці, проблема з компілятором VS2012

Приблизно так, як у вас, і треба, тільки обережно перевірте умови для парних і непарних. Помилка в ±1.

6 Востаннє редагувалося leofun01 (15.03.2015 04:16:21)

Re: Заповнення матриці, проблема з компілятором VS2012

Daveper, ви б якось уточнили ...
Матриці (масиви) - дискретні структури.

Варіанти заповнення

https://replace.org.ua/misc.php?action=pun_attachment&amp;item=783&amp;download=0

Post's attachments

sqrdiam.png 2.68 kb, 295 downloads since 2015-03-15