指针如何与预定义的结构交互?

问题描述 投票:0回答:3

所以我有这样的结构:

struct state {
  int previous[2];
  int current[2];
  bool pen;
}; 
typedef struct state state;

在一些函数中,我使用它作为参数,例如:

void new_state(&s, char *file, int i, int j){
    int new = s -> current[j];
    s -> current[j] = operand(byte(i, file)) + s -> current[j];
    s -> previous[j] = new;
}

我在一个函数中调用它们,在那里我将s定义为来自状态:

void main_function(char *file){
  state s;
  display *display = newDisplay(file, 200, 200);
  int j = size(file);
  for(int i=0; i<j; i++){
    if(opcode(byte(i, file)) == 0){
       new_state(&s, file, i, 0);
    }
    else if(opcode(byte(i, file)) == 1){
      new_state(&s, file, i, 1);
      draw(s, display, file);
    }
    else if(opcode(byte(i, file)) == 2){
      pause(display, operand(byte(i, file)) * 10);
    }
     else{
        new_pen(s);
    }
    end(display);
}
}

但是在编译时我仍然会收到错误消息:期望的声明说明符或'&'令牌之前的'...',但我不明白为什么。我已经将变量s定义为结构状态的一部分,然后使用&s,这给了它正确的地址?

c pointers c99
3个回答
1
投票

void new_state(&s,错了。

在C中应该阅读

void new_state(state *s, char *file, int i, int j)

0
投票

您必须区分函数定义和函数调用。使用参数定义函数时,必须提供每个参数的数据类型,除非它是变量参数列表...

但是,在调用函数时,应传递兼容类型的常量或变量。


0
投票
void new_state(&s, char *file, int i, int j){
    int new = s -> current[j];
    s -> current[j] = operand(byte(i, file)) + s -> current[j];
    s -> previous[j] = new;
}

你的代码中的这个是函数定义。 struct state是一种数据类型。 s只是struct state类型的变量。 &s(在s定义的范围内)也指记忆中s的地址。

你真正想做的是创建一个函数,它指向struct state类型的任何变量。这将是正确的语法

void new_state(struct state * s, char * file, int i, int j){
    ...(function body)...
}

现在,在函数调用中,(当你在main或其他地方使用函数时)。你有点放置你已经使用过的东西。

声明是通用的(用于任何输入)。然而,呼叫是特定的(或特定的)。

在这里你指定你是arguments函数的参数(或passing)。

这就是电话的样子

.
.
.
new_state(&s, file, i, j);
.
.
© www.soinside.com 2019 - 2024. All rights reserved.