控制可能在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 (例如37 ),会发生什么?
那么如果note[0]不是'A' (比如'B''C' ),接下来会发生什么?

那么你的函数会返回什么?

回答:
您的代码将到达函数的末尾,该函数必须返回一个int ,但不会返回任何内容!