Portál AbcLinuxu, 17. července 2025 12:23
Řešení dotazu:
Dělal bych to asi tak to:
int len_a;
int len_b;
int len_c;
int ***p;
p=malloc(len_a*sizeof(**int));
for(int i=0;i<len_a;i++){
p[i]=malloc(len_b*sizeof(*int));
for(int j=0;j<len_b;j++)
p[i][j]=malloc(len_c*sizeof(int));
}
int len_a; int len_b; int len_c; int *p2; p2=malloc(len_a*len_b*len_c*sizeof(int));a potom k prvku a,b,c se přistupuje
p2[a*len_b*len_c+b*len_c+c]
má to tu výhodu, že jsou data kompaktně naalokována. A alokace paměťového bloku od systému je obecně dost pomalá operace. Na druhou stranu v případě, že se intenzívně pracuje přes indexy a a b může mít výhodu ten standardní přístup, protože k prvku pole se přistupuje přes dvakrát pointer a 3x sčítání a není tam násobení. Ten standardní přístup se sem přídá tím, že naalokuji ještě.
int ***p, **p1; p=malloc(len_a*sizeof(**int)); p1=malloc(len_a*len_b*sizeof(*int)); for(int i=0;i<len_a;i++){ p[i]=p1+i*len_b; for(int j=0;j<len_b;j++){ p1[j+i*len_b]=p2+(i*len_b+j)*len_c; } }A pak je p2 pole dat, poskládané tak, že c prvek je nejrychlejší, p1 pole pointrů na data, každý pointr ukazuje na prvek s nulovým c indexem, p pole pointrů do pole pointrů, každý pointr ukazuje na pointr, který směřuje na prvek s nulovou hodnotou indexu b.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.