首页 > 解决方案 > 写入二维数组的问题,嵌入式 C

问题描述

我无法理解我的代码发生了什么,主要是关于二维数组。我试图在我的通信文件中使用一个函数来解码来自终端的命令字符串。我希望它通过更新全局缓冲区来分解字符串并输出答案。我无法写入这些数组,我不明白为什么。在下面的代码中,我只是为 USART1_Command char 数组分配了一个值,在实际程序中它来自终端。

主要和声明:

//Global declarations//
#define USART1_BUFFER_SIZE (100)
#define MAX_COMMAND_INT_VALUES (50)
#define MAX_COMMAND_STR_VALUES (50)
#define MAX_COMMAND_STR_LENGTH (50)
char USART1_Buffer[USART1_BUFFER_SIZE];
uint16_t USART1_Write_Index = 0;
char USART1_Command[MAX_COMMAND_STR_LENGTH] = {0x00};
uint16_t USART1_Command_Int_Values[MAX_COMMAND_INT_VALUES] = {0x00};
char **USART1_Command_Str_Values;

void main(void){
  USART1_Command_Str_Values = (char **)calloc(MAX_COMMAND_STR_VALUES, sizeof(char *));
  uint16_t i = 0;
  for(i = 0; i < MAX_COMMAND_INT_VALUES; i++){
    USART1_Command_Str_Values[i] = (char *)calloc(MAX_COMMAND_STR_LENGTH, sizeof(char));
  }

  strcpy(USART1_Command, "TESTCOMMAND,45,36,21-TEST1-TEST2");
  USART1_Command_Decode(USART1_Command, USART1_Command_Int_Values, USART1_Command_Str_Values, MAX_COMMAND_INT_VALUES, MAX_COMMAND_STR_VALUES, MAX_COMMAND_STR_LENGTH);

  while(1){

  }
}

和功能:

void USART1_Command_Decode(char *command, uint16_t *int_values_buffer, char **str_values_buffer, uint16_t int_values_buffer_size, uint16_t str_values_buffer_size, uint16_t str_values_size){
  uint16_t i = 0;
  uint16_t j = 0;
  uint16_t length = strlen(command);
  
  int16_t Int_Values_Index = -1;
  bool Int_Value_Flag = false;

  char **Int_Values;
  Int_Values = (char**)calloc(int_values_buffer_size, sizeof(char*));
  for(i = 0; i < int_values_buffer_size; i++){
    Int_Values[i] = (char*)calloc(str_values_size, sizeof(char));
  }

  const uint16_t Max_Str_Values = 50;
  int16_t Str_Values_Index = -1;
  bool Str_Value_Flag = false;
  
  for(i = 0; i < length; i++){

     switch(command[i]){

        case ',': //Signifies integer value//
            if(Int_Values_Index < int_values_buffer_size){
                Int_Values_Index++;
                Int_Value_Flag = true;
                Str_Value_Flag = false;
                j = 0;
            }
            command[i] = 0x00;
            break;

        case '-': //Signifies string value//
            if(Str_Values_Index < str_values_buffer_size){
                Str_Values_Index++;
                Str_Value_Flag = true;
                Int_Value_Flag = false;
                j = 0;
            }
            command[i] = 0x00;
            break;

        default:
            if(Int_Value_Flag){
                Int_Values[Int_Values_Index][j] = command[i];
                command[i] = 0x00;
                j++;
            }
            if(Str_Value_Flag){
                str_values_buffer[Str_Values_Index][j] = command[i];
                command[i] = 0x00;
                j++;
            }
            break;
     }
  }

  //Convert integer strings to integers//
  for(i = 1; i <= Int_Values_Index; i++){
      int_values_buffer[i] = atoi(Int_Values[i]);
  }


  for(i = 0; i < int_values_buffer_size; i++){
    free(Int_Values[i]);
  }

  free(Int_Values);
}

标签: cembedded

解决方案


我想通了,我能够使它工作的方式如下:

全局变量声明:

#define MAX_COMMAND_INT_VALUES (50)
#define MAX_COMMAND_STR_VALUES (50)
#define MAX_COMMAND_STR_LENGTH (50)
char USART1_Command[MAX_COMMAND_STR_LENGTH] = {0x00};
uint16_t USART1_Command_Int_Values[MAX_COMMAND_INT_VALUES] = {0x00};
char USART1_Command_Str_Values[MAX_COMMAND_STR_VALUES][MAX_COMMAND_STR_LENGTH];

功能:

void USART1_Command_Decode(char *command, uint16_t *int_values_buffer, uint16_t int_values_buffer_size, uint16_t str_values_buffer_size, uint16_t str_values_size, char str_values_buffer[str_values_buffer_size][str_values_size]){
  uint16_t i = 0;
  uint16_t j = 0;
  uint16_t length = strlen(command);
  
  int16_t Int_Values_Index = -1;
  bool Int_Value_Flag = false;

  char Int_Values[int_values_buffer_size][str_values_size];
  
  for(i = 0; i < int_values_buffer_size; i++){
    for(j = 0; j < str_values_size; j++){
      Int_Values[i][j] = 0x00;
    }
  }

  int16_t Str_Values_Index = -1;
  bool Str_Value_Flag = false;
  
  for(i = 0; i < length; i++){

     switch(command[i]){

        case ',': //Signifies integer value//
            if(Int_Values_Index < int_values_buffer_size){
                Int_Values_Index++;
                Int_Value_Flag = true;
                Str_Value_Flag = false;
                j = 0;
            }
            command[i] = 0x00;
            break;

        case '-': //Signifies string value//
            if(Str_Values_Index < str_values_buffer_size){
                Str_Values_Index++;
                Str_Value_Flag = true;
                Int_Value_Flag = false;
                j = 0;
            }
            command[i] = 0x00;
            break;

        default:
            if(Int_Value_Flag){
                Int_Values[Int_Values_Index][j] = command[i];
                command[i] = 0x00;
                j++;
            }
            if(Str_Value_Flag){
                str_values_buffer[Str_Values_Index][j] = command[i];
                command[i] = 0x00;
                j++;
            }
            break;
     }
  }

  //Convert integer strings to integers//
  for(i = 0; i <= Int_Values_Index; i++){
      int_values_buffer[i] = atoi(Int_Values[i]);
  }

}

函数调用:

USART1_Command_Decode(USART1_Command, USART1_Command_Int_Values, MAX_COMMAND_INT_VALUES, MAX_COMMAND_STR_VALUES, MAX_COMMAND_STR_LENGTH, USART1_Command_Str_Values);

谢谢@P__J__ 的帮助!

编辑:我发现原始代码的主要问题是堆栈溢出问题,因为我误解了 Cross Studio 中堆栈和堆的分配。当我认为我有更多的 20KB 时,我有 256 字节的堆栈。我为堆栈分配了 16KB,为堆分配了 8KB,所有的问题都随着数组写入问题malloc()而消失了。calloc()对于不必要的问题,我向大家道歉。


推荐阅读