int rows, cols;
cin >> rows >> cols;
int **pArray = new int*[rows];
for(int i = 0; i < rows; i++)
pArray = new int[cols];
Как объявить двумерный массив с переменной в размере.
С одномерным массивом все получается просто:
int size1;
cin>>size1;
int* p_mas;
p_mas=new int[size1];
Все нормально компилируется и работает (пример проверял в Visual Studio.Net 2005). Теперь слегка видоизменяю программу:
int size1, size2;
cin>>size1>>size2;
int* p_mas;
p_mas=new int[size1][size2];
При компиляции выдается такая ошибка:
Error 1 error C2540: non-constant expression as array bound c:\programming\visual studio 2005 projects\probe\probe\probe.cpp
Error 2 error C2440: '=' : cannot convert from 'int (*)[1]' to 'int *' c:\programming\visual studio 2005 projects\probe\probe\probe.cpp
обе ошибки относятся к строке:
p_mas=new int[size1][size2];
Почему это происходит? В чем отличие этой строки от первоначального варианта с одномерным массивом?
Заранее благодарен за помощь!
Код:
Код:
int rows, cols;
cin >> rows >> cols;
int **pArray = new int*[rows];
for(int i = 0; i < rows; i++)
pArray = new int[cols];
cin >> rows >> cols;
int **pArray = new int*[rows];
for(int i = 0; i < rows; i++)
pArray = new int[cols];
То есть, как я понял, надо создавать одномерный массив одномерных массивов. Видимо и с другими многомерными массивами надо поступать точно так же?
Код:
pArray[j]
Такая вот тестовая программа
Код:
#include<iostream>
#include<iomanip>
using namespace std;
int main() {
cout<<"Enter two num >";
int sizerow, sizecol;
cin>>sizerow>>sizecol;
int** p_mas;
p_mas=new int*[sizecol];
for(int i=0; i<sizecol; i++) p_mas=new int[sizerow];
for(int j=0; j<sizecol; j++) {
for(int i=0; i<sizerow; i++) p_mas[j]=i*j;
}
for(int j=0; j<sizecol; j++) {
for(int i=0; i<sizerow; i++) {
cout<<setw(8)<<"mas["<<i<<","<<j<<"]= ";
cout<<setw(5)<<p_mas[j]<<" | "; }
cout<<endl;
}
cout<<" Enter Y >";
char y;
cin>>y;
return 0;
}
#include<iomanip>
using namespace std;
int main() {
cout<<"Enter two num >";
int sizerow, sizecol;
cin>>sizerow>>sizecol;
int** p_mas;
p_mas=new int*[sizecol];
for(int i=0; i<sizecol; i++) p_mas=new int[sizerow];
for(int j=0; j<sizecol; j++) {
for(int i=0; i<sizerow; i++) p_mas[j]=i*j;
}
for(int j=0; j<sizecol; j++) {
for(int i=0; i<sizerow; i++) {
cout<<setw(8)<<"mas["<<i<<","<<j<<"]= ";
cout<<setw(5)<<p_mas[j]<<" | "; }
cout<<endl;
}
cout<<" Enter Y >";
char y;
cin>>y;
return 0;
}
вроде работает, но при вводе некоторых размеров, например 4 10 зависает, выведя только такую строку:
mas[
и все. Виснем напрочь. Но если ввести меньшие значения, например 4 8 (если 9, то уже виснем), то все работает нормально. Более того, под отладчиком программа работает без проблем, нигде не виснет. Если поставить брейкпойнт на эту строчку, то все там как и должно быть при нормальной работе программы. Да и без брейкпойнта, но под отладчиком все ОК. В чем может быть проблема?
Код:
#include<iostream>
#include<iomanip>
using namespace std;
int main() {
cout<<"Enter two num >";
int sizerow, sizecol;
cin>>sizerow>>sizecol;
int** p_mas;
p_mas=new int*[sizecol];
for(int i=0; i<sizecol; i++) p_mas=new int[sizerow];
for(int j=0; j<sizecol; j++) {
for(int i=0; i<sizerow; i++) p_mas[j]=i*j;
}
for(int j=0; j<sizecol; j++) {
for(int i=0; i<sizerow; i++) {
cout<<setw(8)<<"mas["<<i<<","<<j<<"]= ";
cout<<setw(5)<<p_mas[j]<<" | "; }
cout<<endl;
}
cout<<" Enter Y >";
char y;
cin>>y;
return 0;
}
#include<iomanip>
using namespace std;
int main() {
cout<<"Enter two num >";
int sizerow, sizecol;
cin>>sizerow>>sizecol;
int** p_mas;
p_mas=new int*[sizecol];
for(int i=0; i<sizecol; i++) p_mas=new int[sizerow];
for(int j=0; j<sizecol; j++) {
for(int i=0; i<sizerow; i++) p_mas[j]=i*j;
}
for(int j=0; j<sizecol; j++) {
for(int i=0; i<sizerow; i++) {
cout<<setw(8)<<"mas["<<i<<","<<j<<"]= ";
cout<<setw(5)<<p_mas[j]<<" | "; }
cout<<endl;
}
cout<<" Enter Y >";
char y;
cin>>y;
return 0;
}
вроде работает, но при вводе некоторых размеров, например 4 10 зависает...[/QUOTE]
Брат, а ты случаем с измерениями не напутал? Первое измерение меняется от 0 до sizecol, второе - от 0 до sizerow (по крайней мере, так у тебя происходит выделение памяти). А вот в этом блоке:
Код:
for(int j=0; j<sizecol; j++) {
for(int i=0; i<sizerow; i++) p_mas[j]=i*j;
}
for(int i=0; i<sizerow; i++) p_mas[j]=i*j;
}
у тебя как-то всё наоборот. Замени на p_mas[j]. И дальше, при выводе на экран, то же самое.
И кстати, почему бы тебе циклы присвоения и вывода на экран не объединить?
Не проще ли тогда воспользоваться стандартными контейнерами, например, std::vector?
Тогда пример создания двумерного массива будет выглядеть так:
Код:
vector< vector<int> > mas( sizecol, vector<int>(sizerow) );
Код:
for(int j=0; j<sizecol; j++) {
for(int i=0; i<sizerow; i++) p_mas[j]=i*j;
}
for(int i=0; i<sizerow; i++) p_mas[j]=i*j;
}
у тебя как-то всё наоборот. Замени на p_mas[j]. И дальше, при выводе на экран, то же самое.
И кстати, почему бы тебе циклы присвоения и вывода на экран не объединить?[/QUOTE]
Спасибо! Дело действительно именно в неверном обозначении измерений!
Вот только второй вопрос все-таки висит - почему программа совершенно нормально работала под отладчиком?!! Из-за этого, собственно, я и не смог понять причину ошибки - ведь при отладке никаких ошибок не было!!! Более того, непонятно, почему программа висла, выведя mas[ - переменные i, j да и вообще всю первую строку она должна была выдать на гора - к моменту вывода на экран как минимум элемент массива mas[j] был полностью определен!
Не проще ли тогда воспользоваться стандартными контейнерами, например, std::vector?
Тогда пример создания двумерного массива будет выглядеть так:
Код:
vector< vector<int> > mas( sizecol, vector<int>(sizerow) );
Вопрос действительно скорее академический - это тестовая программка для функции к заданию из учебника. Хотя, меня еще и другая сторона вопроса интересует - какой код будет меньше и быстрее работать - с определенным вручную динамическим массивом, или с массивом определенным посредством вектора?
double *myarray;
myarray = new double[rows * cols];
И считать его массивом m строк по n колонок (как матрица).
Чтобы адресовать элемент (9, 6), к примеру (9 строка 6 колонка):
*(myarray + 8 * cols + 5) = 14.32;
Чтобы определить адрес элемента i:
int col = i % cols;
int row = i / cols;
Так как в Си отсчет начинается с нуля, а в математике матрицы принято индексировать с единицы, то при выводе на печать следует прибавлять 1:
printf("row %d, column %d", i / cols + 1, i % cols + 1);
Работать будет одинаково, а размер кода сравни сам:
Код:
int **pArray = new int*[rows];
for(int i = 0; i < rows; i++)
pArray = new int[cols];
for(int i = 0; i < rows; i++)
pArray = new int[cols];
Код:
vector< vector<int> > mas( sizecol, vector<int>(sizerow) );