当前位置:  开发笔记 > 编程语言 > 正文

动态char数组大小

如何解决《动态char数组大小》经验,为你挑选了1个好方法。

在我的应用程序中,我定义了一个char数组,它可以采用以下三个选项之一:"okay","high","low",然后从串行端口发送到远程设备.我目前的数组大小可以取4个字符加上回车和换行,但是当我必须发送"低"字符时,我会在字符串中得到一个空字符,我担心这会混淆主机终端.

数组定义

char mod1_status_char[6] = {'0','0','0','0','0','0'};     
char mod2_status_char[6] = {'0','0','0','0','0','0'};     
char mod3_status_char[6] = {'0','0','0','0','0','0'};     

开关案例陈述样本:

void DCOKStatus(uint8_t *ptr_status)
{
    uint8_t status = *ptr_status;

    switch (status) 
    {
        case 0x00:
            strcpy(mod1_status_char, "okay");
            strcpy(mod2_status_char, "okay");
            strcpy(mod3_status_char, "okay");
            break; 
        case 0x10:
            strcpy(mod1_status_char, "okay");
            strcpy(mod2_status_char, "okay");
            strcpy(mod3_status_char, "low");
            break;
     }

这是使消息字符串发送的结构

    strcpy(MsgStatus_on.descriptor_msg, "$psu_");
    MsgStatus_on.address01 = hex_addr[0];
    MsgStatus_on.address02 = hex_addr[1];
    MsgStatus_on.space01 = 0x20;
    strcpy(MsgStatus_on.cmdmsg01, "op_en op1_");
    strcpy(MsgStatus_on.statusmsg01, mod1_status_char);
    MsgStatus_on.space02 = 0x20;
    strcpy(MsgStatus_on.cmdmsg02, "op2_");
    strcpy(MsgStatus_on.statusmsg02, mod2_status_char);
    MsgStatus_on.space03 = 0x20;
    strcpy(MsgStatus_on.cmdmsg03, "op3_");
    strcpy(MsgStatus_on.statusmsg03, mod3_status_char);
    MsgStatus_on.CR = 0x0D;
    MsgStatus_on.LF = 0x0A;

这会发送消息

void USARTWrite(char *object, uint32_t size)
{    
    GPIO_SetBits(GPIOB, GPIO_Pin_1);

    char *byte;
    for (byte = object; size--; ++byte)                                                                       
    {                                       
          USART_SendData(USART1,*byte);                                 

    }

当我需要发送"低"时,是否有人能够建议一个好的方法来动态调整数组大小到一个字符?

谢谢



1> Steve Jessop..:

我不认为要调用动态大小的数组.C语言中有两种方法可以动态调整数组大小:使用malloc或类似地分配它; 或使用C99 VLA.但是在这种情况下,你有不同长度的字符串,当然重要的是按正确的顺序写正确的字节?就个人而言,我更喜欢这样的事情,也许:

char * strings[] = {"okay\r\n", "high\r\n", "low\r\n"};

serial_send(strings[msg_number], strlen(strings[msg_number]));

您不必调用strlen,必须将长度存储在另一个数组中.但即使在最小的嵌入式设备上,与发送串行数据相比,数到6只需要很少的时间.

当然我假设你调用的任何函数实际发送数据,需要一个指针和一个长度.但如果没有,我不知道动态大小的数组如何帮助.

我认为这里难以回答这个问题的一般问题是你没有真正说出数组的"大小"是什么,或者为什么它与实际写入串口的字节数有什么关系港口.

编辑:通过你的额外解释,关键的事情似乎是这个结构,三个单独的字符串被"传入".不确定将字符串传递给struct意味着什么.如果它目前看起来像这样:

struct serialmessage {
    char first[6];
    char second[6];
    char third[6];
};

serialmessage msg;
memcpy(msg.first, mod1_status_char, 6); // etc.

那么也许最好这样做:

char *char mod1_status_char; // etc.

switch(status) {
    case 0x00:
        mod1_status_char = strings[0]; // or #define STATUS_OK 0
        mod2_status_char = strings[0];
        mod3_status_char = strings[0];
        break;
    case 0x10:
        mod1_status_char = strings[0];
        mod2_status_char = strings[0];
        mod3_status_char = strings[2]; // STATUS_LOW
};

serialmessage msg[3*MAX_STRING_LENGTH+1];
strcpy(msg, mod1_status_char); // or use stpcpy if you have it
strcat(msg, mod2_status_char);
strcat(msg, mod3_status_char);

然后使用strlen(msg)发送struct.msg在这里并不完全是"动态的",但它中字符串的长度根据数据而变化,这可能是你想要的.或许我仍然误解了这三个char数组的作用.

在我看来,复制字符串不仅仅是为了引入并发症.通过指针引用它们,直到最后可能的时刻,组装消息,并最小化代码中必须正确获取缓冲区大小的位置数.

推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有