早上好,
我正在尝试用C语言编写一个可以接受不同类型的动态数组。
主要结构如下:
typedef struct st_array
{
void* array;
uint16_t size;
uint16_t used;
void ( *push )( struct st_array*, void* );
void* ( *at )( struct st_array*, uint16_t );
} st_array;
void pushInArray( st_array* this, void* item )
{
// Check for last occupied bin
// if equal size, realloc() and increase this->size
this->array[this->used++] = item;
}
void* getAt( st_array* this, utf16_t idx )
{
if( idx <= this->used )
return this->array[idx];
return NULL;
}
st_array NewArray( uint16_t size )
{
st_array this;
this.array = malloc( size * sizeof( void* ) );
this.push = &pushInArray;
this.at = &getAt;
...
return this;
}
为了使用它,我需要在每次调用push()
和at()
时为我的变量类型强制转换:
int item = 13;
st_array a = NewArray( 32 );
a.push( &a, (void*)&item );
int item_ret = *(int*)a.at( &a, 0 );
我宁愿避免使用(虽然它可能很有用,只是为了让程序员知道她在做什么)。 可以定义一个接受类型为参数的函数式宏,但我仍然需要弄清楚如何将它“绑定”到结构函数指针。
我认为最简单的解决方案可能只是将函数式宏定义为(现在编写时没有检查以保持简短):
#define push( a, b ) a->array[a->used++] = ( void* )b
#define get( a, i, t ) *(t*)a->array[i]
并将它们用作:
push( &a, &item );
int item_ret = get( &a, 0, int );
但我不确定如何继续。有人可以给我一些建议吗?
答案 0 :(得分:0)
好的,我总结了一个答案,从我很幸运能收集到的所有建设性意见中学习:
声明的结构textview
只能包含指针数组,因为声明被修改为edittext
变为st_array
:
void * array
因此,当void ** array
进入数组时,不需要转换为typedef struct st_array
{
void** array;
uint8_t size, used;
...
} st_array
,但当void*
所需的值时,当然需要显式转换。
最简单的方法是定义函数式宏
push()
将指针返回到所需的项目,以便可以轻松执行大小检查(最新的指令仅用于强制在get()
的末尾使用#define get( struct_ptr, index, type ) if(index <= struct_ptr->used) (type*)struct_ptr->array[index]; else NULL; (void)index
{1}}语句,用于符号一致性。)
由于无法指向函数式宏(宏的代码在编译时被替换,因此没有定义实际函数),为了保持一致性,;
函数应该在没有结构内的指针引用。