Въпрос за оператора new в C++
10 отговора
531 прегледа
Въпрос за оператора new в C++
Може ли някой да ми каже как да заделям динамично многомерни (тримерни) масиви с оператор new в C++, като и трите размерности се заделят динамично? Нещо от сорта на:
double *p = new mas [x][y][z] - така не може.
Обикновено първите две са константи, а динамично се заделя само третата.
Например:
double *p = new mas [2][3][x]
Май трябва да се предефинира [] или new.
double *p = new mas [x][y][z] - така не може.
Обикновено първите две са константи, а динамично се заделя само третата.
Например:
double *p = new mas [2][3][x]
Май трябва да се предефинира [] или new.
Re: Въпрос за оператора new в C++
ne mozesh li da napravish
p = (typecast) new whatever_array_element_type_is [x*y*z];
no typa na masiva kam koito kastvash, vse pak triabva da e s fiksirani parvi razmernosti, ako iskash vsichko da e dinamichno prosto shte triabva da rabotish s ednomeren masiv
Пламен
p = (typecast) new whatever_array_element_type_is [x*y*z];
no typa na masiva kam koito kastvash, vse pak triabva da e s fiksirani parvi razmernosti, ako iskash vsichko da e dinamichno prosto shte triabva da rabotish s ednomeren masiv
Пламен
Редактирано от Плaмeн на
Re: Въпрос за оператора new в C++
Teoretichno nevyzmojno e. V C++ masivite ne sa obekti => ne si pomnyat razmernostta => ako imash poveche ot 1 nefiksirana razmernost, kompilatoryt nyama da moje da generira mashinen kod, koyto da izchislyava adresa na dadena kletka.
Izpolzvay predlojenieto na Plamen (sam da si (de)linealizirash masiva).
Izpolzvay predlojenieto na Plamen (sam da si (de)linealizirash masiva).
Re: Въпрос за оператора new в C++
Ето така става, но не знам дали ще успееш да го разбереш...
int ***Alloc_3DArray(int x, int y, int z)
{
int ***ppp3DArray;
int n, n1;
ppp3DArray = new int**[x];
for(n=0; n<x; n++)
{
ppp3DArray[n] = new int*[y];
for(n1=0; n1<y; n1++)
{
ppp3DArray[n][n1] = new int[z];
}
}
return ppp3DArray;
}
void Free_3DArray(int ***pppArr, int x, int y, int z)
{
int n, n1;
for (n=0; n<x; n++)
{
for(n1=0; n1<y; n1++)
{
delete [] pppArr[n][n1];
}
delete [] pppArr[n];
}
delete [] pppArr;
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
int ***ppp3DArray = Alloc_3DArray(10, 1, 2);
ppp3DArray[9][0][1] = 42;
Free_3DArray(ppp3DArray, 10, 1, 2);
return 0;
}
Я вышел им наперерез...
int ***Alloc_3DArray(int x, int y, int z)
{
int ***ppp3DArray;
int n, n1;
ppp3DArray = new int**[x];
for(n=0; n<x; n++)
{
ppp3DArray[n] = new int*[y];
for(n1=0; n1<y; n1++)
{
ppp3DArray[n][n1] = new int[z];
}
}
return ppp3DArray;
}
void Free_3DArray(int ***pppArr, int x, int y, int z)
{
int n, n1;
for (n=0; n<x; n++)
{
for(n1=0; n1<y; n1++)
{
delete [] pppArr[n][n1];
}
delete [] pppArr[n];
}
delete [] pppArr;
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
int ***ppp3DArray = Alloc_3DArray(10, 1, 2);
ppp3DArray[9][0][1] = 42;
Free_3DArray(ppp3DArray, 10, 1, 2);
return 0;
}
Я вышел им наперерез...
Re: Въпрос за оператора new в C++
Между другото, тая хуйня що ми разкарва табулациите?
Много е грозно така и ме дразни....
Я вышел им наперерез...
Много е грозно така и ме дразни....
Я вышел им наперерез...
Re: Въпрос за оператора new в C++
Ами така както го искаш не става (или поне според мене не става).
Най-добре ще е да си направиш твой си клас (или още по-добре template), който да приема 3-те размерности в конструктора си и после - както ти писаха останалите - има много начини да си заделиш паметта.
Най-добре ще е да си направиш твой си клас (или още по-добре template), който да приема 3-те размерности в конструктора си и после - както ти писаха останалите - има много начини да си заделиш паметта.
Re: Въпрос за оператора new в C++
Ako *naistina* si siguren, che dve ot razmernostite sa fiksirani - zaebi klasovete. S tjah samo shte imash masa izlishen C++ overhead.
Ako ne si siguren, shte trjabva da polzvash post-natite po-rano reshenija - te shte rabotjat vinagi.
typedef int DVE_NA_TRI[2][3];
int main()
{
int n = 7;
DVE_NA_TRI* p = new DVE_NA_TRI[n];
for(int i = 0; i < n; i ++)
for(int j = 0; j < 2; j ++)
for(int k = 0; k < 3; k ++)
p[ i ][ j ][ k ] = i + j*10 + k*100;
Ako ne si siguren, shte trjabva da polzvash post-natite po-rano reshenija - te shte rabotjat vinagi.
typedef int DVE_NA_TRI[2][3];
int main()
{
int n = 7;
DVE_NA_TRI* p = new DVE_NA_TRI[n];
for(int i = 0; i < n; i ++)
for(int j = 0; j < 2; j ++)
for(int k = 0; k < 3; k ++)
p[ i ][ j ][ k ] = i + j*10 + k*100;
Re: Въпрос за оператора new в C++
int dim_a, dim_b, dim_c; //размерност на масива
int ind_a, ind_b, ind_c; //променливи за индекс в масива
type v, *p = new type[dim_a * dim_b * dim_c]
v = *(p + (dim_a * dim_b * ind_c) + (dim_a * ind_b) + (ind_a));
int ind_a, ind_b, ind_c; //променливи за индекс в масива
type v, *p = new type[dim_a * dim_b * dim_c]
v = *(p + (dim_a * dim_b * ind_c) + (dim_a * ind_b) + (ind_a));
Re: Въпрос за оператора new в C++
Ако за горното използваш и препроцесора, става така:
#define ARRAY(a,b,c) *(p + (dim_a * dim_b * (c)) + (dim_a * (b)) + (a))
v = ARRAY (3,5,7);
И това става най-чисто с един клас, няма никакъв овърхеад, всичко е inline.
#define ARRAY(a,b,c) *(p + (dim_a * dim_b * (c)) + (dim_a * (b)) + (a))
v = ARRAY (3,5,7);
И това става най-чисто с един клас, няма никакъв овърхеад, всичко е inline.