Показать сообщение отдельно
Старый 28.12.2012, 12:41   #4
Йоха
Умный
 
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
Йоха Скоро придёт к известности
По умолчанию

В современном состоянии языка с++ использовать в прикладных целях голые указатели - моветон!

В данном случае нужно использовать 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 для ввода вывода

Последний раз редактировалось Йоха; 28.12.2012 в 14:27.
Йоха вне форума   Ответить с цитированием