簡體   English   中英

訪問另一個結構內的結構數組

[英]Accessing struct array inside another struct

我有一個名為id_item的結構,它具有2個元素(id和tipo)。 我需要這種方式,以便我可以一次取回每個項目的信息。 然后,我有另一個名為id_list的結構,它具有一個id_item數組,在其上插入的元素總數(計數),以及一個表示退出位置(位置)的數字。

有一個名為id_init的函數初始化該結構,一個id_insert插入一個元素,一個id_getNext檢索下一個元素。

我認為我在訪問id_list中的id_item數組元素時遇到問題。 該程序可以很好地編譯,但是當我運行它時,卻沒有得到想要的東西。 代碼和輸出顯示在下面。

我在“ .h”庫中有下面的代碼。

#define ID_SIZE 30

typedef struct {
    uint8_t id;
    uint8_t tipo;
} id_item;

typedef struct {
    id_item modulo[ID_SIZE];
    uint8_t position;
    uint8_t count;
} id_list;

void id_init(id_list *list) {
    uint8_t i;

    for (i = 0; i < ID_SIZE; i++) {
        list->modulo[i].id = 0x00;
        list->modulo[i].tipo = 0x00;
    }
    list->position = 0;
    list->count = 0;
}

uint8_t id_insert(id_list *list, uint8_t id, uint8_t tipo) {
    if (list->count < ID_SIZE) {
        list->modulo[list->count].id        = id;
        list->modulo[list->count].tipo      = tipo;
        list->count++;
        return 0x06; /*ACK*/
    }
    else {
        // Lista cheia
        return 0x15; /*NAK*/
    }
}

void id_getNext(id_list *list, id_item *modulo) {
    uint8_t pos;

    pos = list->position++;

    if (list->position >= list->count)
        list->position = 0x00;

    modulo = &(list->modulo[pos]);
}

在主文件中,我確實包含了以前的庫。 初始化后,我在ID上插入了30個元素,其中元素id假定為值o“ i”,tipo始終為整數“ 1”,主要代碼為:

int main()
{
    uint8_t i;
    id_list IDs;
    id_item item;

    id_init(&IDs);

    printf("count: %02d, Position: %02d\n", IDs.count, IDs.position);

    for (i = 0; i < ID_SIZE; i++) {
        printf("%d..\n", i);
        printf("insert: %02X\n",id_insert(&IDs, i, 0x01));
    }
    printf("\n");

    for (i = 0; i < ID_SIZE; i++) {
        id_getNext(&IDs, &item);

        printf("Position: %02d, ID: %d, Tipo: %02d\n", IDs.position, item.id, item.tipo);
    }
    return 0;
}

程序輸出如下所示:

0..
insert: 06
1..
insert: 06
2..
insert: 06
3..
insert: 06
4..
insert: 06
5..
insert: 06
6..
insert: 06
7..
insert: 06
8..
insert: 06
9..
insert: 06
10..
insert: 06
11..
insert: 06
12..
insert: 06
13..
insert: 06
14..
insert: 06
15..
insert: 06
16..
insert: 06
17..
insert: 06
18..
insert: 06
19..
insert: 06
20..
insert: 06
21..
insert: 06
22..
insert: 06
23..
insert: 06
24..
insert: 06
25..
insert: 06
26..
insert: 06
27..
insert: 06
28..
insert: 06
29..
insert: 06

count: 30, Position: 00
Position: 01, ID: 0, Tipo: 64    
Position: 02, ID: 0, Tipo: 64
Position: 03, ID: 0, Tipo: 64
Position: 04, ID: 0, Tipo: 64
Position: 05, ID: 0, Tipo: 64
Position: 06, ID: 0, Tipo: 64
Position: 07, ID: 0, Tipo: 64
Position: 08, ID: 0, Tipo: 64
Position: 09, ID: 0, Tipo: 64
Position: 10, ID: 0, Tipo: 64
Position: 11, ID: 0, Tipo: 64
Position: 12, ID: 0, Tipo: 64
Position: 13, ID: 0, Tipo: 64
Position: 14, ID: 0, Tipo: 64
Position: 15, ID: 0, Tipo: 64
Position: 16, ID: 0, Tipo: 64
Position: 17, ID: 0, Tipo: 64
Position: 18, ID: 0, Tipo: 64
Position: 19, ID: 0, Tipo: 64
Position: 20, ID: 0, Tipo: 64
Position: 21, ID: 0, Tipo: 64
Position: 22, ID: 0, Tipo: 64
Position: 23, ID: 0, Tipo: 64
Position: 24, ID: 0, Tipo: 64
Position: 25, ID: 0, Tipo: 64
Position: 26, ID: 0, Tipo: 64
Position: 27, ID: 0, Tipo: 64
Position: 28, ID: 0, Tipo: 64
Position: 29, ID: 0, Tipo: 64
Position: 00, ID: 0, Tipo: 64

Process returned 0 (0x0)   execution time : 0.201 s
Press any key to continue.

預期的輸出將是每個id從1開始到29,所有tipo為1,但是所有id為0和所有tipo 64(我什至不知道該64來自何處)。

這里

modulo = &(list->modulo[pos]);

您正在使本地指針指向list->modulo[pos]的地址,當函數返回時,這不會影響傳遞的變量,實際上,在該行之后,您將無法再更改傳遞的變量,因為您覆蓋此語句中的地址。

它應該是

*modulo = list->modulo[pos];

也許你是說

void id_getNext(id_list *list, id_item **modulo) {
    uint8_t pos;

    pos = list->position++;

    if (list->position >= list->count)
        list->position = 0x00;

    *modulo = &(list->modulo[pos]);
}

int main()
{
    uint8_t  i;
    id_list  IDs;
    id_item *item;

    id_init(&IDs);

    printf("count: %02d, Position: %02d\n", IDs.count, IDs.position);

    for (i = 0; i < ID_SIZE; i++) {
        printf("%d..\n", i);
        printf("insert: %02X\n",id_insert(&IDs, i, 0x01));
    }
    printf("\n");

    for (i = 0; i < ID_SIZE; i++) {
        id_getNext(&IDs, &item);

        printf("Position: %02d, ID: %d, Tipo: %02d\n", IDs.position, item->id, item->tipo);
    }
    return 0;
}

這將更改指針,而不復制整個結構。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM