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->pdatagpointer * 类型,即 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++) { // ...