приращение в цикле и сохранение состояния - PullRequest
0 голосов
/ 27 октября 2010

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

Однако, поскольку я не хочу использоватьстатическая или глобальная переменная, есть ли способ увеличить значение для этого.Так что оно начнется там, где закончилась последняя функция.

Большое спасибо за любые предложения,

#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 ]

2 голосов
/ 27 октября 2010

Почему бы не изменить прототипы на что-то вроде:

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 голос
/ 27 октября 2010

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

1 голос
/ 27 октября 2010

Содержит указатель или индексную переменную внутри самой структуры.Это показатель того, как далеко структура была заполнена в целом.

1 голос
/ 27 октября 2010

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

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

При этом функции yout будут выглядеть примерно так:

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 типы возвращаемых данных, но они ничего не возвращают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...