循环增量并保持状态

时间:2010-10-27 11:10:22

标签: c

gcc 4.4.4 c89

我有以下代码和2个必须填充的结构。

我有3个函数可以填充每个设备的句柄。

但是,device_type结构需要从最后一个函数完成的位置开始递增。

例如:

load_resources() starts at 0 and finishes at 9
    dev_types starts at 0 and finishes at 9

load_networks()  starts at 0 and finishes at 9
    dev_types starts at 10 and finishes at 19

load_controls()  starts at 0 and finishes at 9  
    dev_types starts at 20 and finishes at 29

但是,因为我不想使用静态或全局变量,所以我可以通过任何方式增加a 这个价值。所以它将从最后一个函数完成的地方开始。

非常感谢任何建议,

#define NUMBER_OF_DEVICES 10
#define NUMBER_OF_TYPES 3 /* resources
                             networks
                             controls */

int events(int evt);

int load_resources();
int load_networks();
int load_controls();

static struct device_table {
    int resource_handle;
    int network_handle;
    int control_handle;
} dev_tbl[NUMBER_OF_DEVICES];

struct device_types {
    size_t id;
    int dev_handle;
    int dev_type;
}dev_types[NUMBER_OF_DEVICES * NUMBER_OF_TYPES];

enum dev_name_types {RESOURCE, NETWORK, CONTROL};

/* Simulates the API calls, by returning a dummy handle */
int get_resources();
int get_networks();
int get_controls();

int main(void)
{
    srand(time(NULL));

    load_resources();
    load_networks();
    load_controls();

    return 0;
}

int load_resources()
{
    size_t i = 0;

    for(i = 0; i < NUMBER_OF_DEVICES; i++) {
        dev_tbl[i].resource_handle = get_resources();
        printf("dev_tbl[i].resource_handle [ %d ]\n", dev_tbl[i].resource_handle);
        dev_types[i].id = i;
        dev_types[i].dev_handle = dev_tbl[i].resource_handle;
        dev_types[i].dev_type = RESOURCE;
    }
}

int load_networks()
{
    size_t i = 0;

    for(i = 0; i < NUMBER_OF_DEVICES; i++) {
        dev_tbl[i].network_handle = get_networks();
        printf("dev_tbl[i].network_handle [ %d ]\n", dev_tbl[i].network_handle);
        dev_types[i].id = i;
        dev_types[i].dev_handle = dev_tbl[i].network_handle;
        dev_types[i].dev_type = NETWORK;
    }
}

int load_controls()
{
    size_t i = 0;

    for(i = 0; i < NUMBER_OF_DEVICES; i++) {
        dev_tbl[i].control_handle = get_controls();
        printf("dev_tbl[i].control_handle [ %d ]\n", dev_tbl[i].control_handle);
        dev_types[i].id = i;
        dev_types[i].dev_handle = dev_tbl[i].control_handle;
        dev_types[i].dev_type = CONTROL;
    }
}

4 个答案:

答案 0 :(得分:2)

为什么不将原型更改为:

void load_resources(int*)

(他们实际上并未返回任何内容)然后,在您的主要代码中,有:

int base = 0;
load_resources (&base);
load_networks (&base);
load_controls (&base);

然后每个函数负责使用和更新*base,如下所示:

void load_resources (int *pBase) {
    size_t i = 0;

    for(i = 0; i < NUMBER_OF_DEVICES; i++, (*pBase)++) {  // <-- see here!
        dev_tbl[i].resource_handle = get_resources();
        printf("dev_tbl[i].resource_handle [ %d ]\n", dev_tbl[i].resource_handle);
        dev_types[*pBase].id = i;
        dev_types[*pBase].dev_handle = dev_tbl[i].resource_handle;
        dev_types[*pBase].dev_type = RESOURCE;
    }
}

答案 1 :(得分:1)

一个选项是让每个函数都将基本索引作为参数,并返回第一个可用索引:

int index = 0;
index = load_resources(index);
index = load_network(index);
// and so on

有了这个你的功能看起来像这样:

int load_resources(int base_index) 
{
    size_t i = 0;
    size_t index;

    for(i = 0; i < NUMBER_OF_DEVICES; i++) {
        index = base_index + i;
        dev_tbl[index].resource_handle = get_resources();
        //
    }

    return index + 1;
}

顺便说一句,你的函数确实有int个返回类型,但不返回任何内容。

答案 2 :(得分:1)

在结构本身内保存指针或索引变量。它是一般指示结构填充的指标。

答案 3 :(得分:1)

只有两种方法可以将数据从一个范围保存到下一个范围 - 在堆栈和堆上。由于您已经排除了任何全局变量,因此需要使用堆栈变量,传入参数并返回值,或者将指针传递给参数。