返回并强制转换数组指针(错误:数组下标的类型..无效)

Returning and casting an array pointer (Error: invalid types ... for array subscript)

本文关键字:数组 下标 类型 无效 错误 转换 指针 返回      更新时间:2023-10-16

我发现了很多关于这方面的线程,但似乎都不起作用。这可能只是一个指针,我需要在正确的位置放置正确数量的恒星,但我无法计算。

我想从SQLITE数据库中读取一个blob,它最初是一个三维数组。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 DBn");
SQLfinalize();
}
else
printf ("Map.load: Cannot Prepare statement to save map into the DBn");
SQLdeactivate_errormsg();
}

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

所以我的想法是创建一个指向"无符号字符"的指针。然后将"const void*"转换为"unsigned char*"。然后使用无符号字符指针作为数组。但看起来:

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

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

谢谢你的帮助。

您没有显示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++];
}

目前,tmpmap充当一个一维的char数组。为了让代码正常工作,您必须将k、j和i转换为单个数组索引。类似于:

int ind=i+(j*Map_BYTE_WIDTH)+(j*Map_BYTE_WIDTH*Map_MAXWIDTH;p_map[k][j][i]=tmpmap[id];

我会这么做吗?或者,你可以定义一个大小合适的3D数组类型,并根据该类型定义tmpmap。现在不太可能看到世贸组织这么做。。。

将tmpmap定义为

const unsigned char ( *tmpmap )[ Map_MAXWIDTH ] [ Map_BYTE_WIDTH ];

此外,如果程序是用C++编写的,则更改此语句

tmpmap = SQLcolumn_blob (1); 

tmpmap = reinterpret_cast<const unsigned char ( *)[ Map_MAXWIDTH ] [ Map_BYTE_WIDTH ]>( SQLcolumn_blob (1) ); 

至于错误,很明显,您可能不会将tmpmap与三个下标一起使用,因为tmpmap[i]的类型为unsigned char,并且是标量类型。