доступ к массиву через несколько функций - PullRequest
0 голосов
/ 07 декабря 2018

, поэтому я создаю небольшую программу на C и сталкиваюсь с проблемой, для которой я не могу найти какое-либо соответствующее решение.Вот моя программа: у меня есть массив данных.У меня есть функция, которая заполняет этот массив каждую секунду.Поэтому я объявил этот массив в своем main и передал его в свою функцию:

readDataLoop((uint16_t tableau []);

Пока все хорошо.Как только этот массив заполнен, у меня есть функция: stateManager(state), которая вызывается.Я не передаю свой массив этой функции.В этой функции мой диспетчер состояний решает проверить данные, поэтому я вызываю функцию validateData(), которая определяет, верны ли данные в массиве.

Вот моя проблема: как моя функция validateData может получить доступ к исходным данным?массив, так как я не передал его в качестве параметра?

Я мог бы передать массив в качестве параметра менеджеру состояния, а затем снова передать массив в функцию validateData(), но этосломай мою логику.Единственный аргумент, который я хочу, чтобы у моего менеджера состояний было состояние.

Я мог бы также объявить свой массив как глобальную переменную, но я также пытаюсь избежать этого ...

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

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

Обратите внимание, что для чтения данных и проверки данных не нужно иметь никакого представления оданные за исключением типа и размера.Я передал размер, но C плохо обрабатывает разные типы.Для этого вам нужно создать разные функции, использовать общий тип #define или сделать что-нибудь вонючее void * и набрать тип перечисления.(В C ++ есть шаблоны для решения этой проблемы ...)

Также обратите внимание, что на самом деле здесь нет менеджера состояний или чего-то еще, только пара функций.Если вы хотите построить настоящий менеджер состояний, тогда данные действительно захотят стать частью этого менеджера.Это опять-таки может перейти в землю C ++, хотя C может делать такие вещи прилично.

#include <stdio.h>

typedef int BOOL;
#define TRUE 1
#define FALSE 0

// Pass the data by reference and include the number of entries.
// This way we can modify the data.  In C, you almost always pass
// arrays this way as passing arrays by value isn't well supported.
void readData(int *myData, int numEntries)
{
    for(int i=0; i<numEntries; i++)
    {
        myData[i] = i;
    }
}

// validate the data - *myData here could/should be constant.
BOOL validateData(int *myData, int numEntries)
{
    for(int i=0; i<numEntries; i++)
    {
        if(myData[i] != i) 
        {
            return FALSE;
        }
    }
    return TRUE;
}

// Using C style defines for constants.  Newer compilers can do it safer.
#define NUM_ENTRIES 10
int main()
{
    int myData[NUM_ENTRIES];

    readData(myData, NUM_ENTRIES);
    if(!validateData(myData, NUM_ENTRIES))
    {
        printf("Bad Data\n");
    }
    else
    {
        printf("Good Data\n");
    }

    return 0;
}

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

0 голосов
/ 07 декабря 2018

То, что я мог бы сделать, это передать массив в качестве параметра менеджеру состояния, а затем снова передать массив в функцию validateData (), но это нарушило бы мою логику.Единственный аргумент, который я хочу, чтобы у моего менеджера состояний было состояние.

Ну, у вас есть четыре варианта:

  1. Сделать массив глобальной переменной, поэтомучто любой может получить к нему доступ в любое время.Это ужасная идея.

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

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

  4. Не вызывать validateData() изstateManager(), но вместо этого сделайте это откуда-нибудь, где у вас есть доступ к массиву.(Шляпа для Тима Рэндалла, который предложил это в комментарии ниже.)

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