我在C#中有这个功能:
=SUM(IFERROR(C$2:C$20*B$2:B$20/K$2:K$20,0))
我尝试用C ++重写它,我做到了这一点:
public static unsafe int GetMonoHash(string str) {
unsafe {
fixed (char* src = str) {
char* chPtr2 = src; // + offset;
char* chPtr3 = (chPtr2 + str.Length) - 1;
int num = 0;
while (chPtr2 < chPtr3) {
num = ((num << 5) - num) + chPtr2[0];
num = ((num << 5) - num) + chPtr2[1];
chPtr2 += 2;
}
chPtr3++;
if (chPtr2 < chPtr3) {
num = ((num << 5) - num) + chPtr2[0];
}
return num;
}
}
}
这引发了编译错误:
int Utils::getMonoHash(std::string str)
{
char* src = &str[0];
char* chPtr2 = src; // + offset;
-> char* chPtr3 = (chPtr2 + str.length) - 1;
int num = 0;
while (chPtr2 < chPtr3) {
num = ((num << 5) - num) + chPtr2[0];
num = ((num << 5) - num) + chPtr2[1];
chPtr2 += 2;
}
chPtr3++;
if (chPtr2 < chPtr3) {
num = ((num << 5) - num) + chPtr2[0];
}
return num;
}
所以我将指示的(C3867 'std::basic_string<char,std::char_traits<char>,std::allocator<char>>::length': non-standard syntax; use '&' to create a pointer to member
C2297 '+': illegal, right operand has type 'unsigned __int64 (__cdecl std::basic_string<char,std::char_traits<char>,std::allocator<char>>::* )(void) noexcept const'
)行更改为
->
这给了我一个新的编译错误(这次只有一个,是的!):
char* chPtr3 = (chPtr2 + (char *)str.length) - 1;
我不知道现在该做什么。当与C#one输入相同时,我需要C ++函数与C#函数具有相同的输出。
我在这做什么?
答案 0 :(得分:3)
str.length不是属性,它是一个函数,需要()
根据我作为C#程序员的经验,这是C#程序员在编写C ++时最常犯的错误之一。
答案 1 :(得分:2)
在str.length之后不要忘记括号。正确的类型应该是这样的
char* chPtr3 = (chPtr2 + str.length()) - 1;
答案 2 :(得分:1)
你做什么的?你停止“翻译”,好像C ++和C#有任何共同点,并从头开始使用你的基本要求 - 以及你的C ++书籍 - 作为指南。
在这种情况下,您的问题是您使用的成员函数不正确。它是str.length()
。编译器的抱怨是关于错误地使用函数名,而没有实际调用它。