所以我用C创建了一个小程序,但遇到一个我找不到任何相关解决方案的问题。
这是我的程序:我有一个数据数组。我有一个函数,每秒填充一次此数组。因此,我在main
中声明了此数组,并将其传递给我的函数:
readDataLoop((uint16_t tableau []);
到目前为止,一切都很好。填充此数组后,我将拥有一个函数:stateManager(state)
。我没有将数组传递给此函数。在此函数中,状态管理器决定验证数据,因此我调用函数validateData()
,该函数确定数组中的数据是否正确。
这是我的问题:由于我没有将其作为参数传递,我的函数validateData如何访问初始数组?
我可以做的是将数组作为参数传递给状态管理器,然后再次将数组传递给函数validateData()
,但这会破坏我的逻辑。我希望状态管理器拥有的唯一参数是状态。
我也可以将数组声明为全局变量,但是我也试图避免这种情况……
答案 0 :(得分:0)
我能做的是将数组作为参数传递给状态管理器,然后再次将数组传递给函数validateData(),但这会破坏我的逻辑。我希望状态管理器拥有的唯一参数是状态。
好吧,您有四个选择:
使数组成为全局变量,以便任何人都可以随时访问它。这是一个糟糕的主意。
将数组作为参数传递给状态管理器。您说这将破坏您的逻辑,但这没有道理-如果您的状态管理器当前未使用该数组,则仅添加了一个参数就不会破坏代码中的任何内容。
使state
的数组部分传递到状态管理器中。这样可以避免添加您似乎不喜欢的参数,同时仍然允许状态管理器访问数组,而无需使用全局变量。
不要从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;
}
我考虑显示一个全局数组版本,但反对这样做,因为它会养成非常不好的编码习惯,这种情况下不需要。