如何在C中对数组元素进行分类

时间:2017-03-21 08:11:28

标签: c arrays

我有关于数组的问题。

所以,我有一个大小为255的数组(我们称之为array(255))。我还有一个名为integer的{​​{1}}。

我想对这些数组进行分类(我希望这个术语是对的)。

我想要的是:

如果所选的数组元素是

block

我知道在这种情况下我可以使用if语句。但是,如果我将数组大小扩展到数千?

我不能使用If语句行。

是否有更简单,更有效的解决方案?

4 个答案:

答案 0 :(得分:1)

您只需使用整数除法即可:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdint.h>
#include <inttypes.h>

int main(void)
{
    uint8_t array[255] = {0};

    srand(time(NULL));   

    for(size_t i=0; i<sizeof(array)/sizeof(array[0]); i++)
    {
        array[i] = rand() % 256;

        printf("Array[%zu]= %"PRIu8"\tblock= %"PRIu8"\n", i, array[i], array[i] / 64 );
    }
}

答案 1 :(得分:0)

您应该执行以下操作:

int array[255];

...

int getArrayItemByCateg(int category, int index) {
    return array[category * 64 + index];
}

答案 2 :(得分:0)

如果您的代码中只有指向元素的指针,则可以使用以下函数:

int getBlock(void* array, void* arrayElement, size_t size)
{
    return (int)((arrayElement - array) / (size * 64)); 
}

此函数可用于不同的数组类型,但在调用此函数时必须知道原始数组。请参阅以下示例:

uint32_t array_u32[256];
uint16_t array_u16[256];

printf("array u32 index 32 is block %d\n", getBlock(array_u32, &array_u32[32], sizeof(array_u32[0])));
printf("array u32 index 129 is block %d\n", getBlock(array_u32, &array_u32[129], sizeof(array_u32[0])));

printf("array u16 index 32 is block %d\n", getBlock(array_u16, &array_u16[32], sizeof(array_u16[0])));
printf("array u16 index 129 is block %d\n", getBlock(array_u16, &array_u16[129], sizeof(array_u16[0])));

将打印以下结果:

array u32 index 32 is block 0
array u32 index 129 is block 2
array u16 index 32 is block 0
array u16 index 129 is block 2

另请参阅IDEONE上的代码。

答案 3 :(得分:0)

多维数组怎么样?信息:Tutorials Point - Multidimensional Arrays

这可能不是一个优雅的解决方案,但它非常简单。对于较大规模的数据,这可能不是理想的,但是使用二进制或四叉树的大规模数据可能是最好的。

多维数组:

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

const int COLUMN_SIZE = 64;
const int ROW_SIZE = 4;

// Access index of row using the labels below
const int BLOCK_ONE = 0;
const int BLOCK_TWO = 1;
const int BLOCK_THREE = 2;
const int BLOCK_FOUR = 3;

int main(int argc, char* argv[]) {

  int array[ROW_SIZE][COLUMN_SIZE] = {0};

  srand(time(NULL));

  /* Initialise array */
  for(int x = 0; x < ROW_SIZE; x++) {
    for(int i = 0; i < COLUMN_SIZE; i++) {
      array[x][i] = rand() % (ROW_SIZE * COLUMN_SIZE);
    }
  }

  /* Test */
  for(int x = 0; x < ROW_SIZE; x++) {
    for(int i = 0; i < COLUMN_SIZE; i++) {
      printf("Array[%d][%d]: %d\n", x, i, array[x][i]);
    }
    printf("\n");
  }

  return 0;
}
相关问题