C:指向uint8_t []时遇到麻烦

时间:2017-02-06 17:27:31

标签: c pointers microcontroller coap

我正在使用微控制器并获得以下工作代码:

.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来填充指针。 不幸的是,我无法让它发挥作用。因此,我非常无能为力,我需要使用*或&或者根本不需要使用它来使其工作。我尝试了很多不同的方法,但都没有成功。

问题是:我使用什么类型的uint8_t(uint8_t / uint8_t * / uint8_t **)来初始化指向其中一个char数组的变量? 如何填写(指针)变量(ptr = state / ptr =& state / ptr =& state [0] / ...)? 如何在memcpy函数中使用(指针)变量(ptr /& ptr / * ptr /&(* ptr)/ ...)?

我知道我需要使用我为自己设置的变量。

如果需要,请提供更多信息:此代码用于OpenWSN。我正在使用物联网设备/微控制器。我正在使用他们的COAP实现向浏览器发送信息。

编辑:reserveHeaderSize函数和memcpy函数都将在切换后放置。 正如正确答案所指出的,这很简单,但我一直在忽略一个小愚蠢的错误:我没有删除第三个参数中的sizeof,所以我基本上做了sizeof(大小)。 DERP

1 个答案:

答案 0 :(得分:2)

如果我已正确理解您,您希望在每个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, ...