Правильно ли я формирую этот многомерный массив? - PullRequest
0 голосов
/ 27 апреля 2018

Здесь я пытаюсь создать матрицу, назначая массивы для ссылки на указатель:

bb_ANN(int num_Weights, int num_Layers, int num_Nodes, double * inputs){

//create an array that will hold pointers
struct ANN_Node *layer[num_Layers];
//create an array of nodes
struct ANN_Node **arr = malloc(sizeof(struct ANN_Node **) *num_Layers);
//initialize Nodes
for(int i=0;i<num_Layers;i++)
{       
    // layer heads
    layer[i] = ANN_Init_Node(num_Weights); 
    for(int j=0; j<num_Nodes;j++)
    //push nodes into each layer head
    { push_ANN_Node(&layer[i],num_Weights); }
    // converting each list into an array, then each embedding into arr[] 
     arr[i] = arrayOfList(layer[i]); 
}


    printf("f(x):%f ", arr[0][1].weights[0]);
////////////

Это определение arrayOfList:

struct ANN_Node *arrayOfList(struct ANN_Node *listP){
int i = lengthOfList(listP) ; //make i the length of the list
struct ANN_Node **ptr=  malloc(sizeof(struct ANN_Node **) *i);
for(i=0;listP != NULL;listP=listP->next,i++)
{ ptr[i] = listP; }
return ptr;
    }

Теперь то, что я пытаюсь сделать, это создать некую матрицу 'ANN_Nodes':

-->[ 0 0 0 ]
-->[ 0 0 0 ]
-->[ 0 0 0 ]

, в результате чего я создаю цикл, который проходит через каждый слой и вставляет массив, который будет возвращать моя функция arrayOfList.

Теперь есть такая вещь: arr[0][0].weights[0] и это нормально. Так что это arr[1][0].weights[0] и это arr[2][0].weights[0] и так далее.

Но мне не удалось создать нечто двумерное: arr[0][1].weights[0] это сбой и ошибка.

Имеет ли смысл то, что я пытаюсь сделать, возможно ли это, и как я могу на самом деле достичь структуры двумерного массива, чтобы я мог выполнять свои задачи?

PS. Я уже проверил многомерные массивы, но я думаю, что мой случай немного отличается от большинства примеров и учебных пособий, которые я нахожу в Интернете, я пытаюсь сортировать возвращаемый массив и массив массивов, если это имеет смысл .. .

1 Ответ

0 голосов
/ 27 апреля 2018

Если ваша функция arrayOfList создает «массив» указателей, и ptr указывает на эту память.

Затем вы делаете return *ptr;, что равно return ptr[0];. То есть вы возвращаете один указатель на один элемент. Остальная часть «массива» будет потеряна.

Если вам нужен динамический «двумерный массив» указателей в C, вам нужно стать трехзвездным программистом , как это будет (в вашем случае) типа struct ANN_Node ***.

Тогда arrayOfList должен вернуть struct ANN_Node **, т.е. ptr (вместо *ptr).

...