strcpy() and/or strcat() 挂起 Arduino Uno
strcpy() and/or strcat() hangs Arduino Uno
我有一个 Arduino Uno V3。我正在处理的草图有几个全局变量,其中存储了一个目录中的文件,我想在 Adafruit Music Maker shield 上播放该文件。一切都很好,只要我只想在实例化时播放 vars 中引用的文件,但是当我在需要修改这些 char 数组的地方调用我的函数时,我的程序或 Arduino 挂起或崩溃。
这些是我的变量:
// mp3 player variables
boolean plrStartPlaying = false; // Is set to true in case an nfc tag is present with information on tracks to play
char plrCurrentFile[13] = "track001.mp3"; // which track is the player playing?
char plrCurrentFolder[9] = "system00"; // from which directory is the player playing?
char filename[23] = "/system00/track001.mp3"; // path and filename of the track to play
byte firstTrackToPlay = 1; // the track number as received from the tag
char curTrackCharNumber[4] = "001";
这是我调用来修改它们的函数:
// stores the file to play in the global var filename - it is created from the gloal vars plrCurrentFolder and plrCurrentFile
boolean createFileNameToPlay(byte trackNo) {
// fill global var curTrackCharNumber with provided trackNo - we need it next to create the global var plrCurrentFile
sprintf(curTrackCharNumber, "%03d", trackNo);
// create the name of the track to play from the curTrack
strcpy(plrCurrentFile[0], '[=12=]');
strcat(plrCurrentFile, "track");
strcat(plrCurrentFile, curTrackCharNumber);
//strcat(plrCurrentFile, sprintf(plrCurrentFile, "%03d", trackNo));
strcat(plrCurrentFile, ".mp3");
// create the filename of the track to play, including path, so we can feed it to the music player
strcpy(filename[0], '[=12=]');
strcat(filename, "/");
strcat(filename, plrCurrentFolder);
strcat(filename, "/");
strcat(filename, plrCurrentFile);
if (SD.exists(filename)) {
return (true);
} else {
return (false);
}
}
如前所述,它不起作用 - 我通过注释掉函数中的所有 strcat()
和 strcpy()
调用进行检查,然后我的程序运行正常。但如果代码处于活动状态,它实际上会导致我的 Arduino 挂起或程序崩溃。不管是什么原因,结果是我的程序一旦调用这个函数就不会前进,并且在一定时间后,Arduino 会重置。
有人可以向我解释为什么会这样吗?
您尝试使用 strcpy()
将字符复制到字符,而不是将字符指针复制到字符指针 — 问题出现(至少)两次:
strcpy(plrCurrentFile[0], '[=10=]');
…
strcpy(filename[0], '[=10=]');
这应该会产生编译器错误;两个参数都应该是 char *
,但都不是 char *
。写入:
plrCurrentFile[0] = '[=11=]';
…
filename[0] = '[=11=]';
或:
strcpy(plrCurrentFile, "");
…
strcpy(filename, "");
您为什么不注意编译器警告?如果您至少没有收到警告,为什么不呢?找到创建此类警告所需的选项,最好将它们变成错误。例如,对于 GCC,请考虑:
gcc -O3 -g -std=c11 -Wall -Wextra -Werror -Wmissing-prototypes -Wstrict-prototypes …
这是我的基本选项;我不会 运行 使用这些选项编译不干净的代码。我有时会添加更多。
我有一个 Arduino Uno V3。我正在处理的草图有几个全局变量,其中存储了一个目录中的文件,我想在 Adafruit Music Maker shield 上播放该文件。一切都很好,只要我只想在实例化时播放 vars 中引用的文件,但是当我在需要修改这些 char 数组的地方调用我的函数时,我的程序或 Arduino 挂起或崩溃。
这些是我的变量:
// mp3 player variables
boolean plrStartPlaying = false; // Is set to true in case an nfc tag is present with information on tracks to play
char plrCurrentFile[13] = "track001.mp3"; // which track is the player playing?
char plrCurrentFolder[9] = "system00"; // from which directory is the player playing?
char filename[23] = "/system00/track001.mp3"; // path and filename of the track to play
byte firstTrackToPlay = 1; // the track number as received from the tag
char curTrackCharNumber[4] = "001";
这是我调用来修改它们的函数:
// stores the file to play in the global var filename - it is created from the gloal vars plrCurrentFolder and plrCurrentFile
boolean createFileNameToPlay(byte trackNo) {
// fill global var curTrackCharNumber with provided trackNo - we need it next to create the global var plrCurrentFile
sprintf(curTrackCharNumber, "%03d", trackNo);
// create the name of the track to play from the curTrack
strcpy(plrCurrentFile[0], '[=12=]');
strcat(plrCurrentFile, "track");
strcat(plrCurrentFile, curTrackCharNumber);
//strcat(plrCurrentFile, sprintf(plrCurrentFile, "%03d", trackNo));
strcat(plrCurrentFile, ".mp3");
// create the filename of the track to play, including path, so we can feed it to the music player
strcpy(filename[0], '[=12=]');
strcat(filename, "/");
strcat(filename, plrCurrentFolder);
strcat(filename, "/");
strcat(filename, plrCurrentFile);
if (SD.exists(filename)) {
return (true);
} else {
return (false);
}
}
如前所述,它不起作用 - 我通过注释掉函数中的所有 strcat()
和 strcpy()
调用进行检查,然后我的程序运行正常。但如果代码处于活动状态,它实际上会导致我的 Arduino 挂起或程序崩溃。不管是什么原因,结果是我的程序一旦调用这个函数就不会前进,并且在一定时间后,Arduino 会重置。
有人可以向我解释为什么会这样吗?
您尝试使用 strcpy()
将字符复制到字符,而不是将字符指针复制到字符指针 — 问题出现(至少)两次:
strcpy(plrCurrentFile[0], '[=10=]');
…
strcpy(filename[0], '[=10=]');
这应该会产生编译器错误;两个参数都应该是 char *
,但都不是 char *
。写入:
plrCurrentFile[0] = '[=11=]';
…
filename[0] = '[=11=]';
或:
strcpy(plrCurrentFile, "");
…
strcpy(filename, "");
您为什么不注意编译器警告?如果您至少没有收到警告,为什么不呢?找到创建此类警告所需的选项,最好将它们变成错误。例如,对于 GCC,请考虑:
gcc -O3 -g -std=c11 -Wall -Wextra -Werror -Wmissing-prototypes -Wstrict-prototypes …
这是我的基本选项;我不会 运行 使用这些选项编译不干净的代码。我有时会添加更多。