redis 如何使用和传递一个三维字符数组?

dgiusagp  于 2023-01-04  发布在  Redis
关注(0)|答案(3)|浏览(186)

我试图建立一个字符数组来存储一个函数的返回值。在下面的函数中,数据存储在***valv中。如何建立一个外部变量来访问数据?

int credis_lrange(REDIS rhnd, const char *key, 
                   int start, int end, char ***valv) 
{
  int rc;

  if ((rc = cr_sendfandreceive(rhnd, CR_MULTIBULK, "LRANGE %s %d %d\r\n", 
                                key, start, end)) == 0) 
  {
    *valv = rhnd->reply.multibulk.bulks;
    rc = rhnd->reply.multibulk.len;
  }

  return rc;
}
    • 解决方案:**
char **elements;

int size = credis_lrange(this->redis,"object_2",600,603,&elements);

for (int i=0; i<size;i++) {
    cout << "element: " << elements[i] << endl; 
}

感谢所有人!

elcex8rz

elcex8rz1#

char ***element[size];

不完全是一个三维数组,而是size元素的数组,这些元素的指针指向char
请使用以下任意一种方法:

char e[ D1 ][ D2 ][ D3 ]; /* D1, D2, D3 are integral constants */
char *e[ D2 ][ D3 ];
char e[][ D2 ][ D3 ];

此外,您可以通过指定e作为函数的参数来传递它。
进一步阅读后,发现该参数实际上不是一个3D数组,而是一个指向C样式字符串数组的指针。注意,语法可能相同,但意图不同。
在这种情况下,您需要做两件事:

  • 指定要存储在数组中的字符串数
  • 对于每个字符串
  • 分配内存
  • 将字符串数据复制到char数组

最后,将这个字符串数组的地址传递给credis_lrange函数。

3pvhb19x

3pvhb19x2#

我在Google上只找到了一个匹配项,但看起来cr_sendfandreceive函数分配了它的rhnd-〉reply.multibulk.bulks成员,所以实际上不必将它传递回去(因为首先向您传递了rhnd)。
如果你想复制它,那么你可以将元素声明为char**并传递它的地址(或者使用引用),然后在方法内部你可以克隆bulks成员以及数组中的每个字符串(在循环中)。

fsi0uk1n

fsi0uk1n3#

在Arduino Studio环境中,对于使用PSRAM的ST或ESP 32等MCU编程,可以为char数组的3D多数组(大小为255)分配动态内存,如下所示:

char*** 3d_array = (char***) heap_caps_malloc( sizeof(char)*255*(size_x*size_y*size_z), MALLOC_CAP_SPIRAM);

对于X86/ X64体系结构,可以如下声明大小为255的字符数组的3D多数组:

char*** 3d_array = (char***) malloc( sizeof(char)*255*(size_x*size_y*size_z));

相关问题