C中结构(2d数组)的静态成员(2d数组)

时间:2016-07-27 02:13:41

标签: c

我对结构的静态成员有疑问 这是场景:

  • 需要2d数组变量,即使退出其他C文件中的函数,也要保留其值。从main() - 另一个C文件到函数的后续调用将使用该最后一个值并继续进行计算以生成和更新新值(也保留)。所以,我认为我需要为该数组使用静态。

  • 2D阵列是2D结构的成员。我需要2D结构用于2d阵列的身份目的。假设我有成员[5] [5]的身份[row] [column],我需要在main()的整个调用过程中静态定义成员。但是我注意到C中不允许使用静态结构成员。

我正在尝试的代码:

//in function.h

 #define row 2
 #define column 5
 int function(int rowNUM);

  //in function.c
int function(int rowNUM)
{
typedef struct {
    static int member[5][5];
    int y[5][5];
    int forg;
} mystruct;

mystruct identity[row][column];// declare the identity as structure array

int columnNUM;
int c;
int d;

//----try to initialize member to 1
for (columnNUM=0;columnNUM<column;columnNUM++)
{
for (c=0;c<5;c++)
   {
for(d=0;d<5;d++){
   identity[rowNUM][columnNUM].member[c][d]=1;
       }
    }
}


//----try to update member--- The values should retain for subsequent call from main
for (columnNUM=0;columnNUM<column;columnNUM++)
{
for (c=0;c<5;c++)
   {
for(d=0;d<5;d++){
   identity[rowNUM][columnNUM].member[c][d]=1+identity[rowNUM][columnNUM].member[c][d]; // to update member new value
       }
    }
}
}


// in main.c

main()
{
function(1);
function(2);// member here is in different identity from function (1)
function(1);//member should retain its value from function(1)
function(2);//member should retain its value from function(2)
}

如果这不是实现目标的方法,那么欢迎任何其他建议。 我是一个很新的编程请帮助我。

3 个答案:

答案 0 :(得分:0)

如果你只想要结构的一个成员是静态的,你最好的选择是在函数中创建一个静态类型,在你的情况下是一个静态的二维数组,然后分配给[stack]调用函数时的结构。

例如:

.. function(...)
{
  static int b[2][2]
  typedef struct { int a[2][2] } struct1;
  struct1 x[2][2];
  x->a = b;
}

答案 1 :(得分:0)

您已经定义了一个2d结构数组,这很难静态初始化,因为每个结构都包含整数矩阵。此外,您不能只拥有静态结构的成员,必须将整个结构定义为静态

我能想到做你想做的最简单的方法是定义一个静态的mystructs矩阵和一个辅助变量,以便在第一次调用时初始化它,即

//in function.c
#include <stdbool.h>

int function(int rowNUM)
{
    typedef struct {
        int member[5][5];
        int y[5][5];
        int forg;
    } mystruct;

    // helper flag    
    static bool first_call = true;

    // this is a matrix of (row x cols) mystructs
    static mystruct identity[row][col];

    if (first_call) {
        /* initialize the matrix however you want
           BUT remember to set first_call to false!
        */
        first_call = false;
    }

    // rest of function ...
}

如果您不想保留yforg成员的值(forg代表什么?这是一个错字吗?),您应该将结构分成两部分,但我不知道为什么你要保留结构的某些值并丢弃其他结构,除非它们是时间变量。

如果yforg是时间变量,那么肯定应该将结构定义分成两部分

另一种方法是将指针作为函数的参数传递给矩阵,这样就可以在不使用静态变量的情况下维护状态

int function(int rowNUM, mystruct **identity)

但请注意,尽管大多数时候数组都会衰减为指针(您可以在this one的类似问题中找到更多信息),但它们并不相同thing

答案 2 :(得分:0)

void function(int rowNUM){

int c;
int d;
int columnNUM;



typedef struct {
int member[3][3];
}mystruct;

mystruct identity[ROW][COLUMN];
static bool first_call = true;
if (first_call) {
// INTIALIZE each element of member array to 1 
for (columnNUM=0;columnNUM<COLUMN;columnNUM++)//total cell
{
for (c=0;c<3;c++)
   {
for(d=0;d<3;d++){
   identity[rowNUM][columnNUM].member[c][d]=1;
//printf("identity[%d][%d].member[%d][%d]=%d\n",rowNUM,columnNUM,c,d,identity[rowNUM][columnNUM].member[c][d]);
       }
    }
}
first_call = false;
    }



identity[0][0].member[0][0]=identity[0][0].member[0][0]+3;
printf("%d\n", identity[0][0].member[0][0]);
identity[0][0].member[0][1]=identity[0][0].member[0][1]+1;
printf("%d\n", identity[0][0].member[0][1]);



}

以上代码产生:  第一个电话= 4 2第二个电话= 7 3第三个电话= 10 4 工作完美,很好。但是我宣布

它的工作正常
mystruct identity[ROW][COLUMN];

static mystruct identity[ROW][COLUMN];

这是否意味着我根本不需要声明静态?