C结构数组

时间:2010-08-28 21:45:53

标签: c arrays pointers

我有一个C(不是C ++)结构,就像这样

typedef struct mystruct{
float a,b;
int x, y;
} mystruct;

然后在函数中我收集这样的数据:

mystruct List[MAX];
ListNumber = 0;

for(i = 0; i < MAX; i++)
{
 if(conditions_meet)
 {
  List[ListNumber].a = masterlist[i].a;

...等

ListNumber++;
 }
}

然后我将数组发送到函数

 DoStuff(static int max, mystruct array[max]){
  Stuff
 }

这样可行,但当我尝试这样做时......

mystruct setter(int i)
{
mystruct TEMP;
TEMP.a = masterlist[i].a;
 //......etc
return TEMP;
}


mystruct List[MAX];
ListNumber = 0;

for(i = 0; i < MAX; i++)
{
 if(conditions_meet)
 {
  List[ListNumber] = setter(i);
  ListNumber++;
 }
}

它会导致许多时髦的错误。为什么会这样? 编辑: @ tommieb75我不能给出太多细节,结果似乎没有一个模式。该列表用作将内容绘制到屏幕的通用方法,并且使用函数而不是直接设置会在渲染和随机中产生奇怪的问题,但根本不会产生编译错误。 gdb显示一些整数大于整数,这是我找到的唯一模式。 masterlist是另一个struct的全局数组。在此示例中,数据需要转换为结构。 根本没有编译器警告或错误。我可以提交更敏感的警告,但我总是得到报告我能想到的任何一般性错误。 我将尝试选择的解决方案,这应该足够了。无论如何,在我的代码中使用返回结构的类似函数,并且除了具有结构数组的情况外,所有函数都完美地工作。

4 个答案:

答案 0 :(得分:1)

是什么

mystruct setter(i)
{
mystruct TEMP;
TEMP.a = masterlist[i].a;

'我'有任何类型?

//如果你在struct中发现了未初始化的成员错误,那可能会有所帮助 http://ideone.com/WRLVG

答案 1 :(得分:1)

对于一个简单的设置结构成员,你需要一个整个struct-element的副本?

mystruct List[MAX];
ListNumber = 0;

for(i = 0; i < MAX; i++)
{
 if(conditions_meet)
 {
  List[ListNumber].a = masterlist[i].a;
  ListNumber++;
 }
}

如果您确实需要一个功能,请使用目标内存作为参数,如:

void setter(mystruct *dest,const mystruct *src)
{
  dest->a = src->a; 
}
for(i = 0; i < MAX; i++)
{
 if(conditions_meet)
 {
  setter( &List[ListNumber], &masterlist[i] );
  ListNumber++;
 }
}

答案 2 :(得分:0)

第一个问题是你对setter的定义不是合法的函数签名。必须为参数i指定类型

mystruct setter(int i) {
  ...
}

它还使用函数中未定义的变量masterlist。这可以在其他地方合法地宣布为静态。如果没有,虽然它需要以某种方式访问​​该功能

答案 3 :(得分:0)

问题是在setter函数中你有一个堆栈分配的变量TEMP,一旦函数返回就超出了范围......你可能最好将指针分配给{{1在堆上并将其地址返回给调用例程......

修改

my_struct

这是在例程超出范围后将值恢复的原因。这称为 按引用返回