控制可能在C中达到非空函数的结束
我有这个错误,我无法调试它
helpers.c:136:1:错误:控制可能达到非空函数的结束
IDE在最后一行中说}
这是我的代码
// Calculates frequency (in Hz) of a note int frequency(string note) { // TODO if (strlen(note) == 2) { if (note[0] == 'A') { int freq = round(440 * (pow(2, (((int) note[1]) - 52)))); return freq; } else { if (note[0] == 'A') { if (note[1] == '#') { int freq = round(466 * (pow(2, (((int) note[2]) - 52)))); return freq; } else if (note[1] == 'b') { int freq = round(415 / (pow(2, (((int) note[2]) - 52)))); return freq; } } } }
您需要在所有代码路径上返回。 我们来看看你的例子:
int frequency(string note) { // TODO if (strlen(note) == 2) { if (note[0] == 'A') { int freq = round(440 * (pow(2, (((int) note[1]) - 52)))); return freq; } // return what? else { if (note[0] == 'A') { if (note[1] == '#') { int freq = round(466 * (pow(2, (((int) note[2]) - 52)))); return freq; } else if (note[1] == 'b') { int freq = round(415 / (pow(2, (((int) note[2]) - 52)))); return freq; } // return what? } // return what? } }
一种选择是使用默认值在代码块的开头声明一个freq
。 然后,您可以根据需要修改此值,然后在函数末尾返回该值。 例如:
int frequency(string note) { int freq = 0; // TODO if (strlen(note) == 2) { if (note[0] == 'A') { freq = round(440 * (pow(2, (((int) note[1]) - 52)))); } else { if (note[0] == 'A') { if (note[1] == '#') { freq = round(466 * (pow(2, (((int) note[2]) - 52)))); } else if (note[1] == 'b') { freq = round(415 / (pow(2, (((int) note[2]) - 52)))); } } } return freq; }
“我有这个错误,我无法调试它”
你为什么不能调试它? 我认为这是所有编译器消息中最直接和最明显的一个?
简单地思考:
如果strlen(note)
不是2
(例如3
或7
),会发生什么?
那么如果note[0]
不是'A'
(比如'B'
或'C'
),接下来会发生什么?
那么你的函数会返回什么?
回答:
您的代码将到达函数的末尾,该函数必须返回一个int
,但不会返回任何内容!