【问题标题】:Struct pointer assignment结构体指针赋值
【发布时间】:2012-07-20 22:20:01
【问题描述】:

我正在尝试将结构传递给函数(通过引用)并在该函数中设置结构的多个值。

结构如下:

struct Sensor
{
    BYTE accel_data[6];
    BYTE gyro_data[6];
    int ax;
    int ay;
    int az;
    int gx;
    int gy;
    int gz;
}; 

这是 main() 中的声明:

struct Sensor s;

这是函数的传递:

readAccel(&s);

readAccel 函数:

void readAccel(struct Sensor* s)
{
int ax, ay, az;
// Read data from Accelerometer Chip

i2c_multiRead(ACCEL_READ_ADDR, ACCEL_DATA_ADDR, s->accel_data, 6);

ax = make16(s->accel_data[1],s->accel_data[0]);
ay = make16(s->accel_data[3],s->accel_data[2]);
az = make16(s->accel_data[5],s->accel_data[4]);

fprintf(COM_A,"x: %d\ty: %d\tz: %d\r\n", ax, ay, az);

s->ax = ax;
s->ay = ay;
s->az = az;

fprintf(COM_A,"x: %d\ty: %d\tz: %d\r\n", s->ax, s->ay, s->az);
}

由于某种原因,readAccel() 底部的三个赋值行不起作用。第一个打印语句给出了正确的加速度计值。第二个打印语句为 x 提供了正确的值,但 y 是垃圾值,z 始终为 0。

这是在 pic 微芯片上运行的稍微不标准的 c(ccs c 编译器)。编译器有一些怪癖(整数是 16 位,所有变量都必须在函数的开头声明等),但我认为这不应该是它不起作用的原因(尽管我认为这是可能的)。

感谢您抽出宝贵时间提供帮助!

编辑:

这是 i2c_multiread 函数:

void i2c_multiRead(char deviceAddrR, char registerAddr, BYTE data[], int numBytes)
{
    int x;
    i2c_start();
    i2c_write(deviceAddrR-0b00000001);
    i2c_write(registerAddr);
    i2c_start();
    i2c_write(deviceAddrR);
    for(x=0; x<numBytes-1; x++)
    {
        data[x]=i2c_read();
    }
    data[numBytes-1] = i2c_read(0); //NACK on last read
    i2c_stop();
}

void main ()
{
    struct Sensor s;
    int raw_accel_data[6];
    int i, data;
    char data_ready;
    fprintf(COM_A,"keyspan working \n\r");
    initAccel(&s);
    //initGyro(&s);
    fprintf(COM_A,"ALL SYSTEMS GO (accel initialized successfully)\n\r");

while(true) {

     //data_ready = i2c_singleRead(ACCEL_READ_ADDR,ACCEL_INT_MAP);
     //data_ready = data_ready >> 7;
    readAccel(&s);
    //readGyro(&s);
    //displayGyroData(&s);
    //displayGyroRawData(&s);

    delay_ms(100);
}
// Address of ITG (Gyro Chip)
//  Read:  0xD1
//  Write: 0xD0
}

【问题讨论】:

  • 听起来很奇怪。关闭优化设置有帮助吗?
  • 您的代码对我来说看起来不错。它要么是您的编译器/平台,要么是您发布的范围之外的其他东西。
  • @aschepler 我不确定如何关闭优化设置.....抱歉。你是说fast_io之类的东西?
  • 这很奇怪,只是出于好奇,如果你用(*s).ax = ...试试呢?
  • 我猜那 s 并没有指向你的结构。尝试在 main 中为 ax、ay 和 az 赋值,并在 readAccel 的开头添加另一个 fprintf(如最后一个)。

标签: c memory pointers struct pic


【解决方案1】:

难道这只是您的 fprintf 实现的一个“功能”?

fprintf(COM_A,"x: %d\ty: %d\tz: %d\r\n", s->ax, s->ay, s->az);

格式字符串表示您将提供 3 个整数,但您提供的是 3 个字节。 fprintf 实现可能会为第二个和第三个参数生成错误的地址。

【讨论】:

  • 不,我不这么认为,因为它们是整数,而不是字节。传感器结构中包含整数 ax、ay 和 az。
  • 其实我不知道为什么,但我认为你是对的。打印语句似乎是问题,因为我将程序重组为使用数组而不是结构,并且发生了同样的问题。您能否详细说明为什么会出现此问题以及您将如何解决?
  • 你是对的,值是整数,而不是我说的字节。我一定看起来不太好——我很抱歉。我在谷歌上搜索了“css printf bug”,它带来了许多结果。我最好的选择是您的编译器版本存在错误。
猜你喜欢
  • 2020-05-09
  • 2011-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多