写入二维数组的问题,嵌入式C



我很难理解我的代码发生了什么,主要是关于2D数组。我正在尝试使用通信文件中的一个函数来解码来自终端的命令字符串。我希望它通过更新全局缓冲区来分解字符串并输出答案。我在写入这些数组时遇到问题,我不明白为什么。在下面的代码中,我刚刚为USART1_Command字符数组分配了一个值,在实际程序中,它来自一个终端。

主要和声明:

//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);
}

我发现了这一点,使其工作的方法如下:

全局变量声明:

#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()的所有问题都随着数组写入问题而消失了。我为这个不必要的问题向大家道歉。

最新更新