Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从给定数组实现位向量_C_Arrays_Vector_Bits - Fatal编程技术网

C 从给定数组实现位向量

C 从给定数组实现位向量,c,arrays,vector,bits,C,Arrays,Vector,Bits,我试图从给定的数组中创建一个位向量集。不知道怎么开始。例如,给定数组:int rows[]={1,2,5}我需要生成一个函数unsigned short MakeBitVectorint values[],int nValues允许您假设数组中元素的范围为1-9。以下是我目前掌握的情况: unsigned short MakeBitVector(int values[], int nValues) { (55)unsigned short int set = calloc(nValues,

我试图从给定的数组中创建一个位向量集。不知道怎么开始。例如,给定数组:int rows[]={1,2,5}我需要生成一个函数unsigned short MakeBitVectorint values[],int nValues允许您假设数组中元素的范围为1-9。以下是我目前掌握的情况:

unsigned short MakeBitVector(int values[], int nValues)
{
  (55)unsigned short int set = calloc(nValues, sizeof(unsigned short));
  for(int i = 0; i < nValues; i++){
    (57)set[i] = values[i];
  }
  return set;
}
我不断收到警告和错误:

bits.c:55:警告:初始化从指针生成整数而不进行强制转换

位c:57:错误:下标值既不是数组也不是指针

有没有办法解决这个问题?

集合不是指针。将其改为指针。您还需要返回指针。

set不是指针。将其改为指针。您还需要返回指针。

您肯定需要将集合设置为指针:

unsigned short int* set = calloc(nValues, sizeof(unsigned short));
您还必须将函数的返回类型更改为指针

编辑:如果要将所有内容打包为一个int,可以采用更简单的方式:

unsigned short MakeBitVector(int values[], int nValues)
{
    unsigned short int set = 0;
    for (int i = 0; i < nValues; i++)
        set |= 1 << values[i];
    return set;
}
您不需要分配单个int,返回副本就可以了。

您肯定需要将集合设置为指针:

unsigned short int* set = calloc(nValues, sizeof(unsigned short));
您还必须将函数的返回类型更改为指针

编辑:如果要将所有内容打包为一个int,可以采用更简单的方式:

unsigned short MakeBitVector(int values[], int nValues)
{
    unsigned short int set = 0;
    for (int i = 0; i < nValues; i++)
        set |= 1 << values[i];
    return set;
}

您不需要分配一个int,返回副本就可以了。

我认为您根本不需要动态分配;calloc只是把事情弄糊涂了。此外,您还需要在代码当前不存在的地方对单个位进行操作。那么这个呢:

unsigned short MakeBitVector(int values[], int nValues) {
  unsigned short int set = 0;
  for(int i = 0; i < nValues; i++){
    set |= 1 << values[i];
  }
  return set;
}

很明显,如果输入包含大于等于16的索引,那么输出是未定义的,但是您说这应该不是问题,您可以轻松地将其扩展到32。

我认为您根本不需要动态分配;calloc只是把事情弄糊涂了。此外,您还需要在代码当前不存在的地方对单个位进行操作。那么这个呢:

unsigned short MakeBitVector(int values[], int nValues) {
  unsigned short int set = 0;
  for(int i = 0; i < nValues; i++){
    set |= 1 << values[i];
  }
  return set;
}

很明显,如果输入包含大于等于16的索引,那么输出是未定义的,但是您说这应该不是问题,您可以轻松地将其扩展到32。

这是有效的。但是有什么方法可以分配内存而不必将所有内容都更改为指针。我不想将返回类型更改为指针。@Vlad:那是我-位向量是由二进制字符串表示的一组值,例如{1,2,5}表示为11001}。如果已知数组只包含范围为1-9的元素,则不需要动态分配来生成其中一个,而这个答案本身将导致其余代码索引到集合中,每次按一个短的顺序,而不是一次按一个小的顺序。@Mankarse:我猜不出值的语义,它也可能是位向量的副本。对于位向量,我不会只停留在一个int,因为这将设置容量限制为最大64。所以位向量的底层结构必须是一种数组。@Vlad:从问题中,你可以假设数组中元素的范围是1-9。所以限制容量不是问题。@用户:那么,您的数据布局是什么?您计划如何处理向量中超过64位的数据?你打算把向量保持在一个整数还是几个整数?这很有效。但是有什么方法可以分配内存而不必将所有内容都更改为指针。我不想将返回类型更改为指针。@Vlad:那是我-位向量是由二进制字符串表示的一组值,例如{1,2,5}表示为11001}。如果已知数组只包含范围为1-9的元素,则不需要动态分配来生成其中一个,而这个答案本身将导致其余代码索引到集合中,每次按一个短的顺序,而不是一次按一个小的顺序。@Mankarse:我猜不出值的语义,它也可能是位向量的副本。对于位向量,我不会只停留在一个int,因为这将设置容量限制为最大64。所以位向量的底层结构必须是一种数组。@Vlad:从问题中,你可以假设数组中元素的范围是1-9。所以限制容量不是问题。@用户:那么,您的数据布局是什么?您计划如何处理向量中超过64位的数据?你打算把向量保持在一个整数还是几个整数?