【发布时间】:2023-03-08 14:53:01
【问题描述】:
我遇到了内存违规问题,如果达到else if(argc == 2)
我正在尝试编写一个没有类似错误的漂亮脚本,其他任何东西都像一个魅力......
这是一个代码片段:
//...
// POWER ON
if(strcmp(argv[2], "on") == 0)
{
// GPIO On
pin_on();
// Open the serial port READ-WRITE
int serial_port = open("/dev/ttyS5", O_RDWR);
// Load serial port settings
settings(serial_port);
// POWER ON Message
unsigned char msg[] = { '\x2A', '\x20', '\x30', '\x20',
'\x49', '\x52', '\x20', '\x30',
'\x30', '\x31', '\x0D' };
// Send message to device
write(serial_port, msg, sizeof(msg));
// Time for device to process
std::system("sleep 0.25");
// Close the serial port
close(serial_port);
// GPIO Off
pin_off();
return 0; // success
}
// POWER OFF
else if(strcmp(argv[2], "off") == 0)
{
// GPIO On
pin_on();
// Open the serial port READ-WRITE
int serial_port = open("/dev/ttyS5", O_RDWR);
// Load serial port settings
settings(serial_port);
// POWER OFF Message
unsigned char msg[] = { '\x2A', '\x20', '\x30', '\x20',
'\x49', '\x52', '\x20', '\x30',
'\x30', '\x32', '\x0D' };
// Send message to device
write(serial_port, msg, sizeof(msg));
// Time for device to process
std::system("sleep 0.25");
// Close the serial port
close(serial_port);
// GPIO Off
pin_off();
return 0; // success
}
else if(argc == 2)
{
std::cout << "No argument passed!" << std::endl;
std::cout << "Pattern: acer power <on/off>" << std::endl;
return 1; // failure
}
else if(argc > 3)
{
std::cout << "Too many arguments passed!" << std::endl;
std::cout << "Pattern: acer power <on/off>" << std::endl;
return 1; // failure
}
else
{
std::cout << "Wrong argument! Passed: " << std::string(argv[2]) << std::endl;
std::cout << "Pattern: acer power <on/off>" << std::endl;
return 1; // failure
}
//...
编辑:除了 argc 和 argv[] 值程序没有分配任何变量
编辑 2.:程序由 2 个参数动作和 3 个参数动作构成,就像我发布的代码中提到的那样。
【问题讨论】:
-
您在尝试访问第三个参数后检查是否有 3 个参数。首先验证参数的数量是否正确,然后尝试使用它们。
-
是的,但我也有 2 个参数操作,所以我也需要它们
-
@Yksisarvinen 哦,我想我明白你的意思了。如果存在第三个参数,我应该在正确的第二次访问后检查吗?
-
我的意思是你应该重新订购你的
ifs。首先检查if(argc == 2)(或< 3,会更安全),然后检查else if(argc > 3),如果参数是"on"或"off",最后检查else子句。这样,当没有足够的参数时,您将不会尝试访问该参数。 -
我怀疑您没有考虑时间因素,而是期望选择“最佳”条件,而不管它们的文本顺序如何。 (这并非不合理,但这也不是事情的运作方式。)
标签: c++ linux serial-port command-line-arguments argv