c++ - 返回并转换数组指针(错误 : invalid types . .. 数组下标)

标签 c++ arrays sqlite void-pointers

我发现了很多与此相关的话题,但似乎没有一个有效。这可能只是一个指针困惑,我需要在正确的位置放置正确数量的星星,但我无法弄清楚。

我想从 SQLITE 数据库中读取一个 blob,它最初是一个 3 维数组。 Sqlite 返回一个“const void*”,我需要将其转换为一个临时表指针,以便我可以将数据传输到真实表中。但是我得到一个:

error: invalid types ‘unsigned char[int]’ for array subscript

尝试将值从一个表传输到另一个表时。这是代码示例。

注意:以 SQL... 为前缀的函数是 SQLITE 的个人包装器,它们应该可以完美地工作。

void Map::load ( void )
{
   int i, j, k;
   int errorsql;
   unsigned char *tmpmap; //[ Map_MAXDEPTH ] [ Map_MAXWIDTH ] [ Map_BYTE_WIDTH ];

   SQLactivate_errormsg();

   errorsql = SQLprepare ( "SELECT * FROM handmap;");

   if ( errorsql == SQLITE_OK)
   {
      errorsql = SQLstep ();

      if ( errorsql == SQLITE_ROW )
      {
         tmpmap = (unsigned char*) SQLcolumn_blob (1); // return the pointer to the blob

         for ( k = 0 ; k < Map_MAXDEPTH; k++ )
            for ( j = 0 ; j < Map_MAXWIDTH; j++)
               for ( i = 0; i < Map_BYTE_WIDTH; i++)
               {
                  p_map [ k ][ j ][ i ] = *tmpmap [ k ] [ j ] [ i ]; // try to copy from a table to another. Compiler fails here.
               }
      }
      else
         printf ("Map.load: Cannot step into the DB\n");

      SQLfinalize();
   }
   else
      printf ("Map.load: Cannot Prepare statement to save map into the DB\n");

   SQLdeactivate_errormsg();
}

代码非常简单,它尝试从表中的第一个条目(只有一个条目)读取第 1 列。目标数组是 p_map,它是“unsigned char”的 3D 数组。但是 SQLcolumn_blob 返回一个 const void*。

所以我的想法是创建一个指向“unsigned char”的指针。然后将“const void*”转换为“unsigned char*”。然后使用 unsigned char 指针作为数组。但似乎:

*tmpmap [ k ] [ j ] [ i ];

是非法的。我不能使用指针并将其重新解释为数组。这就是 though 部分,因为数组是指针但声明不同。

感谢您的帮助。

最佳答案

您没有显示 p_map 的分配位置,但您说它是无符号字符的“3D”数组。如果是这样,它应该这样声明:

unsigned char p_map[Map_MAXDEPTH][Map_MAXWIDTH][Map_BYTE_WIDTH];

从您的代码的其他部分来看,它看起来像是一个 char * 数组,但这里肯定存在一些混淆:

     for ( k = 0 ; k < Map_MAXDEPTH; k++ )
        for ( j = 0 ; j < Map_MAXWIDTH; j++)
           for ( i = 0; i < Map_BYTE_WIDTH; i++)
           {
              p_map [ k ][ j ][ i ] = *tmpmap [ k ] [ j ] [ i ]; // try to copy from a table to another. Compiler fails here.
           }

我想你是说 tmpmap 是一个文本 blob,你想将它完全复制到 p_map 中。最简单的方法就是:

memcpy (p_map, tmpmap, Map_MAXDEPTH * Map_MAXWIDTH * Map_BYTE_WIDTH * sizeof(char));

请注意,乘以 sizeof(char) 在技术上是多余的,因为它保证为 1。

如果您尝试使用循环进行复制并且不想依赖相同的内存布局,为什么不简单地:

     int z = 0;
     for ( k = 0 ; k < Map_MAXDEPTH; k++ )
        for ( j = 0 ; j < Map_MAXWIDTH; j++)
           for ( i = 0; i < Map_BYTE_WIDTH; i++)
           {
              p_map [ k ][ j ][ i ] = tmpmap[z++];
           }

关于c++ - 返回并转换数组指针(错误 : invalid types . .. 数组下标),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21798779/

相关文章:

c++ - 切换到 bison 3.0 后 yylval 和 yylloc 的问题

c++ - 更改 .h 文件时是否可以重用 .so 文件

javascript - 数组在 JSON 请求之外消失

linux - 在 Linux 中,是否有将 CSV 文件转换为 SQLite 文件的命令?

c++ - 如何检查字符数组中是否存在字符串值?

c++ - 重载 > 运算符在应该返回 false 时返回 true

C - 将两个字符数组交织在一起时出现异常结果

c# - 增加 int 数组的更优雅的方法?

iphone - 如何在 sqlite 和 iPhone 中使用 LIKE 查询

shell - 从批处理文件自动创建 SQLite 数据库