glib 如何地址索引 g_ptr_array
glib how address to index g_ptr_array
我有 3 个结构,我使用 GNOME glib 库来 具有动态 数组。
typedef struct Neuron
{
//number of inputs into neuron
int NumInputs;
//growing array of weights for each input
GArray* ArrWeight;
}neuron;
typedef struct NeuronLayer
{
//number of neurons in layer
int NumNeurons;
//growing array of neurons
GPtrArray* ArrNeurons;
}layer;
typedef struct Net
{
int numInputs;
int numOutputs;
int numHiddenLayers;
int NeuronsPerHiddenLayer;
//each layer of neurons
GPtrArray* ArrLayers;
}net;
我想要这样的写周期
for (k = 0; k < Net->ArrLayers->pdata[i].ArrNeuron->pdata[j].NumInputs; k++)
但我不知道如何寻址数组。编译器(clang 说):
member reference base type 'gpointer' (aka 'void *') is not
a structure or union.
structure of Gptrarray:
struct GPtrArray
{
gpointer *pdata;
guint len;
};
我想我应该写这样的东西
Net->ArrLayers->pdata[i*sizeof(layer)].ArrNeurons->pdata[j*sizeof(neuron)].NumInputs
gpointer
是一个通用指针。您正在使用它来存储特定类型的指针。因此,要访问其元素,您必须使用类型转换。
我会首先尝试分解你的陈述。目前看起来像这样:
Net->ArrLayers->pdata[i].ArrNeuron->pdata[j].NumInputs
我假设 Net
是一个类型为 net *
的变量。
Net->ArrLayers
的类型是 GPtrArray *
.
Net->ArrLayers->pdata
是 gpointer *
类型,即 void **
,指向指针的指针。
Net->ArrLayers->pdata[i]
因此属于 gpointer
类型,即 void *
,一个指针。
现在您想访问它的元素。从您的上下文来看,您想将此指针解释为指向 layer
的指针。但是,编译器并不知道这一点。你需要告诉编译器。
所以你应该添加演员表,(layer *)Net->ArrLayers->pdata[i]
。
现在因为这是 layer *
类型而不是 layer
,你仍然需要 ->
而不是 .
来访问它的元素,所以它现在应该变成:
((layer *)Net->ArrLayers->pdata[i])->ArrNeuron
现在您需要再次访问 pdata
。这个和上面的一样,所以我就不解释了,直接给大家看正确的方法:
((neuron *)((layer *)Net->ArrLayers->pdata[i])->ArrNeuron->pdata[j])->NumInputs
如您所见,这非常混乱。最好将其拆分为多个语句以增强可读性,这样做甚至可以跳过强制转换:
int current_num_inputs(net * Net, size_t i, size_t j) {
layer *current_layer = Net->ArrLayers->pdata[i];
neuron *current_neuron = current_layer->ArrNeuron->pdata[j];
return current_neuron->NumInputs;
}
然后在你的 for
循环中:
for(k = 0; k < current_num_inputs(Net, i, j); k++) { // ...
我有 3 个结构,我使用 GNOME glib 库来 具有动态 数组。
typedef struct Neuron
{
//number of inputs into neuron
int NumInputs;
//growing array of weights for each input
GArray* ArrWeight;
}neuron;
typedef struct NeuronLayer
{
//number of neurons in layer
int NumNeurons;
//growing array of neurons
GPtrArray* ArrNeurons;
}layer;
typedef struct Net
{
int numInputs;
int numOutputs;
int numHiddenLayers;
int NeuronsPerHiddenLayer;
//each layer of neurons
GPtrArray* ArrLayers;
}net;
我想要这样的写周期
for (k = 0; k < Net->ArrLayers->pdata[i].ArrNeuron->pdata[j].NumInputs; k++)
但我不知道如何寻址数组。编译器(clang 说):
member reference base type 'gpointer' (aka 'void *') is not a structure or union.
structure of Gptrarray:
struct GPtrArray
{
gpointer *pdata;
guint len;
};
我想我应该写这样的东西
Net->ArrLayers->pdata[i*sizeof(layer)].ArrNeurons->pdata[j*sizeof(neuron)].NumInputs
gpointer
是一个通用指针。您正在使用它来存储特定类型的指针。因此,要访问其元素,您必须使用类型转换。
我会首先尝试分解你的陈述。目前看起来像这样:
Net->ArrLayers->pdata[i].ArrNeuron->pdata[j].NumInputs
我假设 Net
是一个类型为 net *
的变量。
Net->ArrLayers
的类型是 GPtrArray *
.
Net->ArrLayers->pdata
是 gpointer *
类型,即 void **
,指向指针的指针。
Net->ArrLayers->pdata[i]
因此属于 gpointer
类型,即 void *
,一个指针。
现在您想访问它的元素。从您的上下文来看,您想将此指针解释为指向 layer
的指针。但是,编译器并不知道这一点。你需要告诉编译器。
所以你应该添加演员表,(layer *)Net->ArrLayers->pdata[i]
。
现在因为这是 layer *
类型而不是 layer
,你仍然需要 ->
而不是 .
来访问它的元素,所以它现在应该变成:
((layer *)Net->ArrLayers->pdata[i])->ArrNeuron
现在您需要再次访问 pdata
。这个和上面的一样,所以我就不解释了,直接给大家看正确的方法:
((neuron *)((layer *)Net->ArrLayers->pdata[i])->ArrNeuron->pdata[j])->NumInputs
如您所见,这非常混乱。最好将其拆分为多个语句以增强可读性,这样做甚至可以跳过强制转换:
int current_num_inputs(net * Net, size_t i, size_t j) {
layer *current_layer = Net->ArrLayers->pdata[i];
neuron *current_neuron = current_layer->ArrNeuron->pdata[j];
return current_neuron->NumInputs;
}
然后在你的 for
循环中:
for(k = 0; k < current_num_inputs(Net, i, j); k++) { // ...