通过多种功能访问数组

时间:2018-12-07 20:19:40

标签: c arrays function pointers

所以我用C创建了一个小程序,但遇到一个我找不到任何相关解决方案的问题。 这是我的程序:我有一个数据数组。我有一个函数,每秒填充一次此数组。因此,我在main中声明了此数组,并将其传递给我的函数:

readDataLoop((uint16_t tableau []);

到目前为止,一切都很好。填充此数组后,我将拥有一个函数:stateManager(state)。我没有将数组传递给此函数。在此函数中,状态管理器决定验证数据,因此我调用函数validateData(),该函数确定数组中的数据是否正确。

这是我的问题:由于我没有将其作为参数传递,我的函数validateData如何访问初始数组?

我可以做的是将数组作为参数传递给状态管理器,然后再次将数组传递给函数validateData(),但这会破坏我的逻辑。我希望状态管理器拥有的唯一参数是状态。

我也可以将数组声明为全局变量,但是我也试图避免这种情况……

2 个答案:

答案 0 :(得分:0)

  

我能做的是将数组作为参数传递给状态管理器,然后再次将数组传递给函数validateData(),但这会破坏我的逻辑。我希望状态管理器拥有的唯一参数是状态。

好吧,您有四个选择:

  1. 使数组成为全局变量,以便任何人都可以随时访问它。这是一个糟糕的主意。

  2. 将数组作为参数传递给状态管理器。您说这将破坏您的逻辑,但这没有道理-如果您的状态管理器当前未使用该数组,则仅添加了一个参数就不会破坏代码中的任何内容。

  3. 使state的数组部分传递到状态管理器中。这样可以避免添加您似乎不喜欢的参数,同时仍然允许状态管理器访问数组,而无需使用全局变量。

  4. 不要从validateData()调用stateManager(),而是从您有权访问该数组的地方进行调用。 (向蒂姆·兰德尔(Tim Randall)的提示,他在下面的评论中建议了这一点。)

答案 1 :(得分:0)

下面是一个简单的示例,说明如何使用参数在函数之间传递数组,读取数据并进行验证。

请注意,读取数据和验证数据不需要关于数据的任何概念(类型和大小除外)。我已经传递了大小,但是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;
}

我考虑显示一个全局数组版本,但反对这样做,因为它会养成非常不好的编码习惯,这种情况下不需要。