Другие языки программирования и технологии

Помогите найти ошибку в программе С++

DL
Diamant Leonov
2 591
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 любой многомерный массив в памяти представляется как одномерный, потому что в памяти других измерений нет. Поэтому все абсолютно правильно, кроме индексации массива.
БА
Берик Айтказин
21 360
Лучший ответ
cout << *mas << endl
А что, собственно, ты тут выводишь? Указатель?
Я в С не то чтобы спец, мягко говоря, но так точно нельзя.
UD
Usmon Djalilov
51 801
В какой? :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; //освободили указатель на массив указателей на строки
Так нужно динамически выделять и освобождать память для двумерных (многомерных) массивов.

Ты же пытаешься двумерный массив представить одномерным, выделяя память, а потом работать с ним как с двумерным. Так нельзя. Выделил память как под одномерный, тогда не используй индексацию двумерного массива.
Вова Свиридов
Вова Свиридов
9 759