В современном состоянии языка с++ использовать в прикладных целях голые указатели - моветон!
В данном случае нужно использовать std::vector
Твою программу можно переписать например так:
Код:
#include <conio.h>
#include <iostream>
#include <iomanip>
#include <vector>
int _tmain(int argc, _TCHAR* argv[])
{
std::vector<std::vector<int>> mas;
int n, m;
std::cout << "Enter array size - n m : " << std::endl;
std::cin >> n >> m;
srand((unsigned int)time(NULL));
for (int i = 0; i < n; i++) {
std::vector<int> tmp;
for(int j = 0; j < m; j++)
tmp.push_back(40 - rand() % 31);
mas.push_back(tmp);
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++)
std::cout << std::setw(4) << mas[i][j];
std::cout << std::endl;
}
_getch();
return 0;
}
Или такой вариант заполнения матрицы без использования временных переменных:
Код:
srand((unsigned int)time(NULL));
mas.resize(n);
for (int i = 0; i < n; i++) {
mas[i].resize(m);
for (int j = 0; j < m; j++)
mas[i][j] = 40 - rand() % 31;
}
А по поводу твоей программы - это просто тихий ужас!
Ошибка №1
Код:
int** mas = new int*[n];
for (int i = 0; i < m; i++)
mas[i] = new int[m];
У тебя выделен массив длиной n, а заполняешь его ты в цикле по m !
Ошибка №2
Код:
mas[i,j] = (int*)(40 - (std::rand() % 31));
Обращение к двумерным массивам в с++ пишеттся как mas[i][j].
То что написал ты - это вызов оператора запятая.
Собственно этот код эквивалентен следующему:
Код:
mas[j] = (int*)(40 - (std::rand() % 31));
Потом, тут само присвоение неправильно, ты на место указателя записываешь число.
Ошибка №3
Код:
for (int i = 0; i < m; i++)
delete mas[i]; // вот тут ошибка
Ты выделял память под массив, а удаляешь как одну переменную.
Надо писать delete[] mas[i];
Ну и как уже заметили, цикл идет по m, хотя массив длиной n.
Ну с учетом всех косяком, исправил твою прогу:
Код:
int main()
{
srand((unsigned int)(time(NULL)));
setlocale(LC_ALL, "rus");
int m,n;
printf("Введите размерность массива:\nКол-во строк = ");
scanf_s("%d",&n);
printf("Кол-во столбцов = ");
scanf_s("%d",&m);
int** mas = new int*[n];
for (int i = 0; i < n; i++)
mas[i] = new int[m];
for (int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
mas[i][j] = 40 - rand() % 31;
for (int i = 0; i < n; i++) {
for(int j = 0; j < m; j++)
printf("%d ", mas[i][j]);
printf("\n");
}
for (int i = 0; i < n; i++)
delete[] mas[i];
delete[] mas;
return 0;
}
Все работает как и ожидается.
И напоследок, у тебя в программе смесь языков С и С++, все этим пережитки прошлого в виде printf и scanf... У С++ есть iostream для ввода вывода