【发布时间】:2019-05-16 13:14:34
【问题描述】:
我正在尝试创建一个 const char 字符串数组,用于识别某些硬件通道。然后我想通过索引检索这些条目以在用户控制台上标记输出。其中一些通道未分配并用字符串“XX_UNASSIGNED_XX”标记,因此该值在数组中重复。
当我尝试在测试代码中按顺序显示这些值时,我看到 XX_UNASSIGNED_XX 只出现一次,随后被跳过。我在嵌入式硬件中打开了内存跟踪,果然,内存只列出了 XX_UNASSIGNED_XX 一次,我假设这是一种优化。
有没有办法强制编译器按原样列出内存中的每个条目、重复项和所有项?或者,是否有可能我不需要这样做,并且我尝试显示字符串的方式不正确或效率低下并且可以改进?
我已经尝试过如何显示字符串,并且因为它最终是一个指针数组,每个字符串的长度不同,我最终记录了每个字符串的长度,使用指针变量跟踪数组,然后使用snprintf 将字符串复制到一个临时字符串,然后我会显示该字符串。任何直接打印数组中值的尝试都会导致我似乎无法纠正的异常行为。
仅供参考 Display_printf 命令只是一个到 UART 终端的 printf,语法如下:
Display_printf(UART_handle,col_index, row_index, display_text))
#define ADC_COUNT (20)
const char* adcNamesArray[ADC_COUNT] = {
"KP_CUR_MON",
"A_CUR_MON",
"A_VOLT_MON",
"NEG_15_VOLT_MON",
"XX_UNASSIGNED_XX",
"FOCUS_CUR_MON",
"XX_UNASSIGNED_XX",
"XX_UNASSIGNED_XX",
"K_CUR_MON",
"XX_UNASSIGNED_XX",
"XX_UNASSIGNED_XX",
"XX_UNASSIGNED_XX",
"FOCUS_VOLT_MON",
"FARADAY_MON",
"MFC_MON",
"XX_UNASSIGNED_XX",
"POS_12_VOLT_MON",
"POS_24_VOLT_MON",
"POS_15_VOLT_MON",
"POS_5_VOLT_MON"
};
char str[20];
char* ptr = &adcNamesArray[0];
char* printPtr;
int nameLength;
for(int adc_index = 0; adc_index < ADC_COUNT; adc_index++) {
nameLength = 0;
while(*ptr == '\0') {
ptr += sizeof(char);
}
printPtr = ptr;
while(*ptr != '\0') {
ptr += sizeof(char);
nameLength++;
}
nameLength++;
char* str;
str = (char *)malloc((sizeof(char)*nameLength+1));
snprintf(str, nameLength, "%s", printPtr);
Display_printf(display,0,0,"ADC %d: %s", adc_index, str);
}
所以,我希望所有 XX_UNASSIGNED_XX 条目按顺序显示,但我得到的是:
ADC 0: KP_CUR_MON
ADC 1: A_CUR_MON
ADC 2: A_VOLT_MON
ADC 3: NEG_15_VOLT_MON
ADC 4: XX_UNASSIGNED_XX
ADC 5: FOCUS_CUR_MON
ADC 6: K_CUR_MON
ADC 7: FOCUS_VOLT_MON
ADC 8: FARADAY_MON
ADC 9: MFC_MON
ADC 10: POS_12_VOLT_MON
ADC 11: POS_24_VOLT_MON
ADC 12: POS_15_VOLT_MON
ADC 13: POS_5_VOLT_MON
ADC 14: ▒
ADC 15: @
ADC 16: ▒▒▒▒
ADC 17: @▒
ADC 18:
ADC 19:
查看内存转储会给出这一点,这就解释了为什么 XX_UNASSIGNED_XX 没有多次出现。
0x0001C0D8 . . . . . . . 0 K P _ C U R _ M
0x0001C0E8 O N . . A _ C U R _ M O N . . .
0x0001C0F8 A _ V O L T _ M O N . . N E G _
0x0001C108 1 5 _ V O L T _ M O N . X X _ U
0x0001C118 N A S S I G N E D _ X X . . . .
0x0001C128 F O C U S _ C U R _ M O N . . .
0x0001C138 K _ C U R _ M O N . . . F O C U
0x0001C148 S _ V O L T _ M O N . . F A R A
0x0001C158 D A Y _ M O N . M F C _ M O N .
0x0001C168 P O S _ 1 2 _ V O L T _ M O N .
0x0001C178 P O S _ 2 4 _ V O L T _ M O N .
0x0001C188 P O S _ 1 5 _ V O L T _ M O N .
0x0001C198 P O S _ 5 _ V O L T _ M O N . .
0x0001C1A8 uartMSP432E4HWAttrs
0x0001C1A8 . . . @ . . . . . . . . . . . .
0x0001C1B8 @ . . . . . . . . . . . . . . .
感谢任何帮助。
【问题讨论】:
-
因为字符串是
const,编译器在数组中重复使用相同的字符串。为什么不直接使用索引访问数组?Display_printf(display,0,0,"ADC %d: %s", adc_index, adcNamesArray[adc_index]); -
我尝试使用索引访问它,但它返回垃圾 ADC 0:ADC 1:k▒ ADC 2:ADC 3:ADC 4:▒ ADC 5:ADC 6:ADC 7:▒ ADC 8: ADC 9:ADC 10:(空)ADC 11:(空)ADC 12:▒ ADC 13:ADC 14:ADC 15:▒ ADC 16:ADC 17:ADC 18:▒ ADC 19:知道为什么吗?
-
什么是
MSP432E4_ADC_COUNT?ADC_COUNT是什么?请出示minimal reproducible example -
@Jabberwocky 对不起,错字。我修复了它并将定义添加到代码中。
-
您正在假设编译器如何在内存中布置字符串。你有一个指针数组,而不是字符。这些指针可以指向任何地方。您不能依赖字符串在内存中是连续的。