Videlenie pamiati dlea mnogomernogo massiva
От: Аноним  
Дата: 03.06.03 09:01
Оценка:
Privet.

Kak pravilino videliti pamiati dlea mnogomernogo massiva odnim vizovom malloc?
Naprimer: 2-mernii massiv 3 x 5

U menia polucilosi toliko takim sposobom:

int **m;
m=malloc(sizeof(int)*3);
for (i=0;i<5;i++) m[i]=malloc(sizeof(int)*5);

Esti li bolee effectivinii sposob?

m=malloc(sizeof(int (*) [5])*); // ne rabotaet
m=malloc(sizeof(int)*15); // toje ne pravilino

Spasibo.
Serg
Re: Videlenie pamiati dlea mnogomernogo massiva
От: Аноним  
Дата: 03.06.03 09:07
Оценка:
А>m=malloc(sizeof(int (*) [5])*); // ne rabotaet

Propustil 3:

m=malloc(sizeof(int (*) [5]) * 3);
Re: Videlenie pamiati dlea mnogomernogo massiva
От: kly Россия  
Дата: 03.06.03 09:07
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Privet.


А>Kak pravilino videliti pamiati dlea mnogomernogo massiva odnim vizovom malloc?

А>Naprimer: 2-mernii massiv 3 x 5

А>U menia polucilosi toliko takim sposobom:


А>int **m;

А>m=malloc(sizeof(int)*3);
А>for (i=0;i<5;i++) m[i]=malloc(sizeof(int)*5);

А>Esti li bolee effectivinii sposob?


А>m=malloc(sizeof(int (*) [5])*); // ne rabotaet

А>m=malloc(sizeof(int)*15); // toje ne pravilino

А>Spasibo.

А>Serg

А почему, последнее не-правильно? Открою секрет int A[3][5], тоже хранится в виде линейного массива из 15 элементов. Просто индексироваться надо правильно!
Классическая ошибка, которую совершают проектировщики абсолютно надежных систем, — недооценка изобретательности клинических идиотов.

http://www.inconteam.com
Re[2]: Videlenie pamiati dlea mnogomernogo massiva
От: Аноним  
Дата: 03.06.03 09:13
Оценка:
kly>А почему, последнее не-правильно? Открою секрет int A[3][5], тоже хранится в виде линейного массива из 15 элементов. Просто индексироваться надо правильно!

V poslednem slucae nevozmojno obrasenie k elementam massiva tima m[1][2].
T.e.
m=malloc(sizeof(int)*15); <- sozdaet odnomernii massiv iz 15 pointer-ov k odnomernomu massivu int.

Esli ispolizovati odnomernii masssiv obrasatisea k elementam nado budet cerez m[i*elements_in_row + j], mne je nado obrasenie m[i][j].
Re: Videlenie pamiati dlea mnogomernogo massiva
От: Bell Россия  
Дата: 03.06.03 09:14
Оценка:
Здравствуйте, Аноним, Вы писали:

2 выделения:

int main()
{
   int nRows = 3, nColumns = 5;
   int* pData = new int [nRows*nColumns];
   int** p2d_arr = new int* [nRows];
   for(int i = 0; i < nRows; ++i)
      p2d_arr[i] = pData + i*nColumns;

   p2d_arr[0][0] = 0;
   //...
   p2d_arr[2][4] = 0;
   delete [] p2d_arr;
   delete [] pData;

   return 0;
}
Любите книгу — источник знаний (с) М.Горький
Re[2]: Videlenie pamiati dlea mnogomernogo massiva
От: Аноним  
Дата: 03.06.03 09:19
Оценка:
Bell,

Zabil skazati — pishu na C.
C++ ne podhodit.

No esli suditi po otvetu, moi pervii sposob edinstvennii. Odnim vizovom malloc ne polucitisea.

Spasibo.
Re: Videlenie pamiati dlea mnogomernogo massiva
От: Анатолий Широков СССР  
Дата: 03.06.03 09:24
Оценка:
int** m = (int**) malloc(sizeof(int)*3*5);
...
free(m);
Re[2]: Videlenie pamiati dlea mnogomernogo massiva
От: Аноним  
Дата: 03.06.03 09:29
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

Spasibo!
Vsio genialinoe — prosto.
Serg

АШ>
АШ>int** m = (int**) malloc(sizeof(int)*3*5);
АШ>...
АШ>free(m);
АШ>
Re[2]: Videlenie pamiati dlea mnogomernogo massiva
От: Bell Россия  
Дата: 03.06.03 09:29
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:



АШ>
АШ>int** m = (int**) malloc(sizeof(int)*3*5);
АШ>...
АШ>free(m);
АШ>


Остальсь только написать
m[2][4] = 123;

и радоваться результатам
Любите книгу — источник знаний (с) М.Горький
Re[3]: Videlenie pamiati dlea mnogomernogo massiva
От: Bell Россия  
Дата: 03.06.03 09:29
Оценка: :))
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Анатолий Широков, Вы писали:


А>Spasibo!

А>Vsio genialinoe — prosto.
А>Serg
Поробуй сначала
Любите книгу — источник знаний (с) М.Горький
Re[2]: Videlenie pamiati dlea mnogomernogo massiva
От: Аноним  
Дата: 03.06.03 09:36
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

Anatolii,

Odnako code ne rabotaet — vidaet oshibku "memory couldn't be "written" pro popitke prisvoti znacenia elementam m[i][j]....

V cem problema?

АШ>
АШ>int** m = (int**) malloc(sizeof(int)*3*5);
АШ>...
АШ>free(m);
АШ>
Re[2]: Videlenie pamiati dlea mnogomernogo massiva
От: Анатолий Широков СССР  
Дата: 03.06.03 09:36
Оценка: +1
прогнал я, братцы.
Re[4]: Videlenie pamiati dlea mnogomernogo massiva
От: Аноним  
Дата: 03.06.03 09:38
Оценка:
B>Поробуй сначала

Pospeshil radovatisea, ti prav
Re[5]: Videlenie pamiati dlea mnogomernogo massiva
От: Bell Россия  
Дата: 03.06.03 09:43
Оценка:
Здравствуйте, Аноним, Вы писали:


B>>Поробуй сначала


А>Pospeshil radovatisea, ti prav


Если первая размерность известна на этапе компиляции, то можно так:

int main()
{
const int nRows = 3;
int nColumns = 5;
int* pData = (int*)malloc(sizeof(int)*nRows*nColumns);
int (*p2d_arr)[nRows] = (int (*)[nRows])&pData;

p2d_arr[0][0] = 0;
p2d_arr[2][4] = 0;
free(pData);

return 0;
}
Любите книгу — источник знаний (с) М.Горький
Re[6]: Videlenie pamiati dlea mnogomernogo massiva
От: Аноним  
Дата: 03.06.03 09:49
Оценка:
K sojeleniu razmernosti ne izvestna. No code interesnii — ne vstrecal takoi initializatsii -> int (*p2d_arr)[nRows] = (int (*)[nRows])&pData;



B>int main()

B>{
B> const int nRows = 3;
B> int nColumns = 5;
B> int* pData = (int*)malloc(sizeof(int)*nRows*nColumns);
B>
B> p2d_arr[0][0] = 0;
B> p2d_arr[2][4] = 0;
B> free(pData);

B> return 0;

B>}
Re[7]: Videlenie pamiati dlea mnogomernogo massiva
От: Bell Россия  
Дата: 03.06.03 10:02
Оценка:
Здравствуйте, Аноним, Вы писали:

А>K sojeleniu razmernosti ne izvestna. No code interesnii — ne vstrecal takoi initializatsii -> int (*p2d_arr)[nRows] = (int (*)[nRows])&pData;


Забудь — это все неправильно
Любите книгу — источник знаний (с) М.Горький
Re[7]: Videlenie pamiati dlea mnogomernogo massiva
От: Аноним  
Дата: 03.06.03 10:11
Оценка:
Аноним

тем не менее, если жестко требуется, чтобы массив занимал непрерывную область
в памяти, то можно поступить так:


int x=3, y=5;

/*------------ создание ------------------*/
int**array=(int**)malloc(sizeof(int*) * y);
array[0]=(int*)malloc(sizeof(int) * x * y);

for(int i=1; i<y; ++i){
  array[i]=array[i-1]+x;
}

...

array[i][j]=k;

...

/*------------ удаление ------------------*/
free(array[0]);
free(array);
Re[8]: Videlenie pamiati dlea mnogomernogo massiva
От: Аноним  
Дата: 03.06.03 10:18
Оценка:
Ne forum, a iumorina.

B>Забудь — это все неправильно
Re[8]: Videlenie pamiati dlea mnogomernogo massiva
От: Bell Россия  
Дата: 03.06.03 10:26
Оценка:
Здравствуйте, Аноним, Вы писали:

Да, этот вариант я уже предлагал. А всякие танцы с одним блоком возможны, когда все размерности известны, и при этом создавать массив на стэке по каким-то причинам нельзя.


int main()
{
   const int nRows = 3, nColumns = 5;
   int* pData = (int*)malloc(sizeof(int)*nRows*nColumns);
   int (&p2d_arr)[nRows][nColumns] = (((int (&)[nRows][nColumns])pData));

   p2d_arr[0][0] = 0;
   p2d_arr[2][4] = 0;

   for(int i = 0; i < nRows; ++i)
      for(int j = 0; j < nColumns; ++j)
         cerr << (&p2d_arr[i][j]) << endl;
   free(pData);

   return 0;
}
Любите книгу — источник знаний (с) М.Горький
Re[3]: Videlenie pamiati dlea mnogomernogo massiva
От: mp63k6  
Дата: 03.06.03 10:30
Оценка:
Здравствуйте, Bell, Вы писали:


B>Остальсь только написать

B>
B>m[2][4] = 123;
B>

B>и радоваться результатам

почему тогда не m[4][2] = 123;
гон всё это
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.