for(int i = 0; i < my; i++)
for(int j = 0; j < mx; j++)
{
mas[i * mymx + j] = (float) ((float) rand() / RAND_MAX + 0);
sum = sum + mas[i * mymx + j];
}
PS любой многомерный массив в памяти представляется как одномерный, потому что в памяти других измерений нет. Поэтому все абсолютно правильно, кроме индексации массива.
Другие языки программирования и технологии
Помогите найти ошибку в программе С++
cout << *mas << endl
А что, собственно, ты тут выводишь? Указатель?
Я в С не то чтобы спец, мягко говоря, но так точно нельзя.
А что, собственно, ты тут выводишь? Указатель?
Я в С не то чтобы спец, мягко говоря, но так точно нельзя.
В какой? :D
Ты неправильно выделяешь память под двумерный массив. Смысл таков. Двумерный массив в памяти нужно представить как массив массивов (строк). У каждого внутреннего массива (строки) есть первый элемент. Его имя является указателем на строку. По-этому нам нужно создать сначала массив указателей на строки, а затем уже выделить память для каждой строки. Указатель на массив указателей обозначается двумя звёздочками. Пишем так
float **mas;
выделяем память под этот массив указателей на строки
if (mas = new float *[my]) //это количество строк
{
cout < < "Good!" < < endl;
}
Далее выделяем память под каждую строку
for(int i =0;i < my; i ++)
{
mas[ i ]=new float[mx];//выделили память под массив размером mx(одна строка)
for(int j=0;j < mx;j++)
{
mas[ i ][ j ] = (float) ((float) rand() / RAND_MAX + 0); //инициализировали элементы каждой строки
sum = sum + mas[ i ][ j ];
}
}
Когда массив более не нужен освобождаем кучу
for(int i =0; i < my; i ++)
{
delete [] mas[ i ]; //освободили указатели на строки
}
delete [] mas; //освободили указатель на массив указателей на строки
Так нужно динамически выделять и освобождать память для двумерных (многомерных) массивов.
Ты же пытаешься двумерный массив представить одномерным, выделяя память, а потом работать с ним как с двумерным. Так нельзя. Выделил память как под одномерный, тогда не используй индексацию двумерного массива.
float **mas;
выделяем память под этот массив указателей на строки
if (mas = new float *[my]) //это количество строк
{
cout < < "Good!" < < endl;
}
Далее выделяем память под каждую строку
for(int i =0;i < my; i ++)
{
mas[ i ]=new float[mx];//выделили память под массив размером mx(одна строка)
for(int j=0;j < mx;j++)
{
mas[ i ][ j ] = (float) ((float) rand() / RAND_MAX + 0); //инициализировали элементы каждой строки
sum = sum + mas[ i ][ j ];
}
}
Когда массив более не нужен освобождаем кучу
for(int i =0; i < my; i ++)
{
delete [] mas[ i ]; //освободили указатели на строки
}
delete [] mas; //освободили указатель на массив указателей на строки
Так нужно динамически выделять и освобождать память для двумерных (многомерных) массивов.
Ты же пытаешься двумерный массив представить одномерным, выделяя память, а потом работать с ним как с двумерным. Так нельзя. Выделил память как под одномерный, тогда не используй индексацию двумерного массива.
Похожие вопросы
- помогите найти ошибка в программе на PASCAL тема: "файлы".
- Помогите найти ошибку в программе. C++
- Помогите найти ошибку в программе и исправить ее.
- Помогите найти ошибки в программе!
- Помогите найти ошибку в программе Паскаль!
- Всем добрый вечер) пожалуйста,помогите найти ошибку в программе-->
- Помогите найти ошибку в программе (паскаль)
- КТО знает програмирование по QBASIC Описание темы: ПОМОГИТЕ НАЙТИ ОШИБКИ В ПРОГРАММЕ
- Помогите найти ошибку в программе.
- Помогите найти ошибку в программе, заранее спасибо)