C:Having 指向 uint8_t[] 的指针有些麻烦
C:Having some troubles with a pointer to uint8_t[]
我正在使用微控制器并获得以下工作代码:
.h 文件
const static uint8_t state0[] = "Off";
const static uint8_t state1[] = "ROMLoad";
const static uint8_t state2[] = "RAMLoad";
const static uint8_t state3[] = "PacketSend";
const static uint8_t state4[] = "Process";
.c 文件
switch (coapapp_vars.state) {
case 0:
packetfunctions_reserveHeaderSize(msg, sizeof(state0) - 1);
memcpy(&msg->payload[0], &state0, sizeof(state0) - 1);
break;
case 1:
packetfunctions_reserveHeaderSize(msg, sizeof(state1) - 1);
memcpy(&msg->payload[0], &state1, sizeof(state1) - 1);
break;
case 2:
packetfunctions_reserveHeaderSize(msg, sizeof(state2) - 1);
memcpy(&msg->payload[0], &state2, sizeof(state2) - 1);
break;
case 3:
packetfunctions_reserveHeaderSize(msg, sizeof(state3) - 1);
memcpy(&msg->payload[0], &state3, sizeof(state3) - 1);
break;
case 4:
packetfunctions_reserveHeaderSize(msg, sizeof(state4) - 1);
memcpy(&msg->payload[0], &state4, sizeof(state4) - 1);
break;
}
我确实想通过在切换后调用 memcpy 来更改此代码以缩短文件(以减少上传的代码)。因此,我需要使用一个指向 .h 中正确值的指针,方法是使用 case 来填充指针。
不幸的是,我无法让它工作。所以我很无能为力,我需要在哪里使用 * 或 &,或者根本不用,才能让它工作。我尝试了很多不同的方法,但 none 成功了。
接下来的问题是:我使用什么类型的 uint8_t (uint8_t/uint8_t*/uint8_t**) 来初始化指向 char 数组之一的变量?
我如何填写那个(指针)变量(ptr = state/ptr = &state/ptr=&state[0]/...)?
我需要如何在 memcpy 函数中使用(指针)变量(ptr/&ptr/*ptr/&(*ptr)/...)?
我知道我需要使用我自己为尺寸设置的变量。
如果需要更多信息:此代码用于 OpenWSN。我正在使用 IoT device/microcontroller。我正在使用他们的 COAP 实现向浏览器发送信息。
编辑:reserveHeaderSize 函数和memcpy 函数都将放在开关之后。
正如正确答案所指出的,这非常简单,但我一直忽略了我的一个小错误:我没有删除第三个参数中的 sizeof,所以我基本上是在执行 sizeof(size)。德普
如果我没理解错的话,您希望在每个 case
中分配一个指针变量,以便之后可以调用 memcpy()
。如果是这样就简单了。你也只需要在每种情况下设置要复制的大小,但是你已经提到了。
事情是这样的:
uint8_t *stateptr; // pointers can be assigned to arrays
size_t size;
switch (coapapp_vars.state) {
case 0:
packetfunctions_reserveHeaderSize(msg, sizeof(state0) - 1);
stateptr = state0;
size = sizeof state0;
break;
case 1:
packetfunctions_reserveHeaderSize(msg, sizeof(state1) - 1);
stateptr = state1;
size = sizeof state1;
break;
// other cases
}
memcpy(&msg->payload[0], stateptr, size-1);
请注意,在您的代码中您也可以编写
memcpy( &msg->payload[0], state0, sizeof state0 - 1 );
而不是 ..., &state0, ...
。
我正在使用微控制器并获得以下工作代码:
.h 文件
const static uint8_t state0[] = "Off";
const static uint8_t state1[] = "ROMLoad";
const static uint8_t state2[] = "RAMLoad";
const static uint8_t state3[] = "PacketSend";
const static uint8_t state4[] = "Process";
.c 文件
switch (coapapp_vars.state) {
case 0:
packetfunctions_reserveHeaderSize(msg, sizeof(state0) - 1);
memcpy(&msg->payload[0], &state0, sizeof(state0) - 1);
break;
case 1:
packetfunctions_reserveHeaderSize(msg, sizeof(state1) - 1);
memcpy(&msg->payload[0], &state1, sizeof(state1) - 1);
break;
case 2:
packetfunctions_reserveHeaderSize(msg, sizeof(state2) - 1);
memcpy(&msg->payload[0], &state2, sizeof(state2) - 1);
break;
case 3:
packetfunctions_reserveHeaderSize(msg, sizeof(state3) - 1);
memcpy(&msg->payload[0], &state3, sizeof(state3) - 1);
break;
case 4:
packetfunctions_reserveHeaderSize(msg, sizeof(state4) - 1);
memcpy(&msg->payload[0], &state4, sizeof(state4) - 1);
break;
}
我确实想通过在切换后调用 memcpy 来更改此代码以缩短文件(以减少上传的代码)。因此,我需要使用一个指向 .h 中正确值的指针,方法是使用 case 来填充指针。 不幸的是,我无法让它工作。所以我很无能为力,我需要在哪里使用 * 或 &,或者根本不用,才能让它工作。我尝试了很多不同的方法,但 none 成功了。
接下来的问题是:我使用什么类型的 uint8_t (uint8_t/uint8_t*/uint8_t**) 来初始化指向 char 数组之一的变量? 我如何填写那个(指针)变量(ptr = state/ptr = &state/ptr=&state[0]/...)? 我需要如何在 memcpy 函数中使用(指针)变量(ptr/&ptr/*ptr/&(*ptr)/...)?
我知道我需要使用我自己为尺寸设置的变量。
如果需要更多信息:此代码用于 OpenWSN。我正在使用 IoT device/microcontroller。我正在使用他们的 COAP 实现向浏览器发送信息。
编辑:reserveHeaderSize 函数和memcpy 函数都将放在开关之后。 正如正确答案所指出的,这非常简单,但我一直忽略了我的一个小错误:我没有删除第三个参数中的 sizeof,所以我基本上是在执行 sizeof(size)。德普
如果我没理解错的话,您希望在每个 case
中分配一个指针变量,以便之后可以调用 memcpy()
。如果是这样就简单了。你也只需要在每种情况下设置要复制的大小,但是你已经提到了。
事情是这样的:
uint8_t *stateptr; // pointers can be assigned to arrays
size_t size;
switch (coapapp_vars.state) {
case 0:
packetfunctions_reserveHeaderSize(msg, sizeof(state0) - 1);
stateptr = state0;
size = sizeof state0;
break;
case 1:
packetfunctions_reserveHeaderSize(msg, sizeof(state1) - 1);
stateptr = state1;
size = sizeof state1;
break;
// other cases
}
memcpy(&msg->payload[0], stateptr, size-1);
请注意,在您的代码中您也可以编写
memcpy( &msg->payload[0], state0, sizeof state0 - 1 );
而不是 ..., &state0, ...
。