gpt4 book ai didi

c - glib如何地址到索引g_ptr_array

转载 作者:行者123 更新时间:2023-11-30 15:19:37 25 4
gpt4 key购买 nike

我有 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

我假设 Netnet * 类型的变量。

Net->ArrLayers 的类型为 GPtrArray *

Net->ArrLayers->pdata 的类型为 gpointer *,即 void **,指向指针的指针。

Net->ArrLayers->pdata[i] 因此是 gpointer 类型,即 void *,一个指针。

现在您想要访问它的元素。从您的上下文来看,您希望将此指针解释为指向层的指针。然而,编译器不知道这一点。您需要告诉编译器。

因此您应该添加一个转换,(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++) { // ...

关于c - glib如何地址到索引g_ptr_array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30556210/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com