Arrays 如何在C18编译器MPLAB(ANSI C89)中分配结构

Arrays 如何在C18编译器MPLAB(ANSI C89)中分配结构,arrays,structure,assign,c18,Arrays,Structure,Assign,C18,我试图在主程序中赋值 typedef struct PointStructure { unsigned char x; unsigned char y; unsigned char offset; unsigned char page; }point; volatile far point p; volatile far point AryP[5]; 我可以在主程序中为结构p赋值的唯一方法是 p.x=10; p.y=20; p.offset=0; p

我试图在主程序中赋值

typedef struct PointStructure 
{   unsigned char x;    
    unsigned char y; 
    unsigned char offset; 
    unsigned char page;
}point;

volatile far point p;
volatile far point AryP[5];
我可以在主程序中为结构p赋值的唯一方法是

p.x=10;
p.y=20;
p.offset=0;
p.page=1;
这样,我将需要大量的空间和时间来为数组赋值。有更好的方法吗

以下方法对我不起作用

p = {10, 20, 0, 1};

p = {.x = 10, .y=20, .offset=0, .page=1};
上述方法不正确,除非将其用作初始化:

volatile far point p = {.x = 10, .y=20, .offset=0, .page=1};
要将值赋给结构,以下是唯一的方法:

p.x=10;
p.y=20;
p.offset=0;
p.page=1;
没有任何方法可以同时分配多个成员,除非您创建一个函数来完成此操作

void assignValue(point *p, x, y, offset, page)
{
      p->x = x;
      p->y = y;
      p->offset = offset;
      p->page = page;
}
因此,您可以这样分配值:

assignValue(&p, 10, 20, 0, 1);

={10,20,0,1}应该在初始化阶段起作用。对于assign,未定义它。fieldname=值仅为GNU C,不被识别也就不足为奇了。谢谢您的回复。是的,它在初始化阶段工作。但是基于某些标志,我必须在运行时分配值。我希望在主程序中找到一种更简单的分配方法。除了p.x=10,是否还有其他方法赋值;依此类推?点t={10,20,0,1};memcpy&p&t,sizeoft;。C99为此添加了复合文本,但我猜它在编译器上不可用。我必须在某些标志更改时对许多数组执行此操作,这可能不是最有效的方法。我希望像我们在初始化阶段分配的那样,有一些直接的东西。不过还是要谢谢。好吧,memcpy是非常有效的,因为编译器知道它的功能,并且可能会大量内联它;但我不会指望它在旧的编译器上。但是,不管是这样,还是定义一个宏,它将扩展到分配单个字段——我认为C89没有其他方法。
assignValue(&p, 10, 20, 0, 1);