Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

"сплескване" на многомерен индекс
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=16273
Страница 1 от 1

Автор:  Н'бабане Гт'муан'га [ Пет Дек 21, 2018 12:40 pm ]
Заглавие:  "сплескване" на многомерен индекс

Нещо съм зациклил предпразнично а се опитвам да реша тоя проблем...
Каква е формулата за конверсия? Двумерен е лесно, обаче като станат повече, особено ако са с различни размери?

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

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

Автор:  ps66 [ Пет Дек 21, 2018 12:58 pm ]
Заглавие:  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 1:09 pm ]
Заглавие:  Re: "сплескване" на многомерен индекс

За ANSI ли питаш или твое конвертиране?

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

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

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

Автор:  iss [ Пет Дек 21, 2018 1:18 pm ]
Заглавие:  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 беше млад..."

Автор:  slav4o.com [ Пет Дек 21, 2018 3:31 pm ]
Заглавие:  Re: "сплескване" на многомерен индекс

Ами според логиката на изписване числото в квадратните трябва да указва броят на нещата написани пред него:
Код:
char A;     // символ
char B[10]; // 10 броя символ един след друг.
char C[10][2]; // 2 броя по 10 броя символи един след друг.


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

Автор:  MYXATA [ Пет Дек 21, 2018 4:32 pm ]
Заглавие:  Re: "сплескване" на многомерен индекс

...
arr[3][3][3]

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

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/