Отговори на тема  [ 6 мнения ] 
"сплескване" на многомерен индекс 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 25, 2012 8:14 am
Мнения: 4574
Местоположение: Новата земя на племето Мутум'ба
Мнение "сплескване" на многомерен индекс
Нещо съм зациклил предпразнично а се опитвам да реша тоя проблем...
Каква е формулата за конверсия? Двумерен е лесно, обаче като станат повече, особено ако са с различни размери?

Примерно имам многомерен масив [10,20,5,8] елемента. Общия брой на елементите очевидно е 10*20*5*8=8000, обаче как да го конвертирам в едномерен индекс? Примерно елемент [7,3,4,6] кой поред е сред тия 8000?

Приемам че всички индекси ми започват от 0. Има ли обща формула за тоя сорт калкулации?

_________________
'просто' е технически синоним на 'красиво'


Пет Дек 21, 2018 11:40 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Яну 19, 2007 8:16 am
Мнения: 1063
Местоположение: путинофили: "иди н***й"
Мнение Re: "сплескване" на многомерен индекс
array [A,B,C,D]

index[a,b,c,d] = a*(B*C*D)+b*(C*D) + c*(D) + d

array[10,20,5,8]
index[7,3,4,6] = 7*(20*5*8)+3*(5*8)+4*(8)+6 = 5758

организацията зависи:
от теб - ако индексираш многомерния масив с един индекс.
от компилатора/архитектурата - ако го индексираш многомерно.


Пет Дек 21, 2018 11:58 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 8:22 am
Мнения: 15501
Местоположение: София
Мнение Re: "сплескване" на многомерен индекс
За ANSI ли питаш или твое конвертиране?

Ако е по стандарт, най-просто е да си ги представиш като отделни едномерни масиви. В твоя случай ще имаш:

10 броя последователно наредени тримерни масиви, всеки елемент от тях съдържа 20 броя двумерни масиви, всеки елемент от които пък съдържа 5 броя едномерни масиви с 8 елемента. Всъщност дали е просто да си го представиш??? :) :) :)

Иначе аз си признавам без бой, четиримерен масив в живота си не съм разписвал. С мигалки, толкоз :)

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Пет Дек 21, 2018 12:09 pm
Профил ICQ
Ранг: Новодошъл
Ранг: Новодошъл
Аватар

Регистриран на: Съб Фев 06, 2016 7:29 pm
Мнения: 167
Мнение Re: "сплескване" на многомерен индекс
Код:
#include <stdio.h>
#include <string.h>

int main(int argc, char* argv[])
{
  char ar[10][20][5][8];
 
  printf("10*20*5*8 = %d, sizeof(ar[10][20][5][8]) = %d\n", 10*20*5*8 , sizeof(ar));
 
  memset((char*)ar, 0, sizeof(ar));
 
  printf("ar[7][3][4][6] = %d, ((char*)ar)[7*(20*5*8)+3*(5*8)+4*(8)+6] = %d\n", ar[7][3][4][6], ((char*)ar)[7*(20*5*8)+3*(5*8)+4*(8)+6]);
 
  ((char*)ar)[7*(20*5*8)+3*(5*8)+4*(8)+6] = 1;

  printf("ar[7][3][4][6] = %d, ((char*)ar)[7*(20*5*8)+3*(5*8)+4*(8)+6] = %d\n", ar[7][3][4][6], ((char*)ar)[7*(20*5*8)+3*(5*8)+4*(8)+6]);
 
  return 0;
}


Резултат:
Код:
10*20*5*8 = 8000, sizeof(ar[10][20][5][8]) = 8000
ar[7][3][4][6] = 0, ((char*)ar)[7*(20*5*8)+3*(5*8)+4*(8)+6] = 0
ar[7][3][4][6] = 1, ((char*)ar)[7*(20*5*8)+3*(5*8)+4*(8)+6] = 1


Извод:
При array[A][B][C][D] елементът array[a][b][c][d] ще има index = a*(B*C*D) + b*(C*D) + c*(D) + d :).

Забележка: Примера е тестван с GCC и това би трябвало да е истина винаги, но реално зависи как компилатора подрежда елементите в паметта. Обикновено се започва с най-десния вектор, обаче имам детски спомени, че съм настъпвал мотиката и с друго подреждане, но това е било "преди години, когато DOS-a беше млад..."


Пет Дек 21, 2018 12:18 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Яну 01, 2012 7:04 pm
Мнения: 2581
Местоположение: Велико Търново / София
Мнение Re: "сплескване" на многомерен индекс
Ами според логиката на изписване числото в квадратните трябва да указва броят на нещата написани пред него:
Код:
char A;     // символ
char B[10]; // 10 броя символ един след друг.
char C[10][2]; // 2 броя по 10 броя символи един след друг.


Правих един път триизмерен масив за C18 за PIC18F4550 , оказа се, че не е така, а както са ти писали по-горе, реди ги обратно, най-дясната част се реди последователно, по-лявата ти ги реди тези части и така. При мен това беше масив char[10][10][10] представляваше една страница от 3D лед кубче (мигалка - залъглалка) . Паметта се индексираше със указател и това съм го проверил. Но и аз смятам, че при различните компилатори вероятно е различно.

_________________
https://github.com/slav4ocom/


Пет Дек 21, 2018 2:31 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Юни 05, 2006 12:48 pm
Мнения: 4393
Местоположение: където небето среща земята, ракията е Jameson, а бирата Guinness
Мнение Re: "сплескване" на многомерен индекс
...
arr[3][3][3]


Прикачени файлове:
arrmem.jpg
arrmem.jpg [ 37.3 KiB | Прегледано 2203 пъти ]
arr.jpg
arr.jpg [ 18.38 KiB | Прегледано 2203 пъти ]

_________________
... ако трети ден не ти се работи... това означава, че е сряда !
Пет Дек 21, 2018 3:32 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 6 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 2 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни