我一直试图找到一个答案并让它工作一段时间,所以我想我会在这里查看。我试图通过引用将指针传递给long。我正在使用的语法是:
int Hex2Loong(long*& bytebuff, int& len, const std::string Hexbuff);
每当我尝试声明该函数时,错误就会出现。这个定义令人惊讶
似乎没有问题。我在int*&
fcn中使用与Hex2Int
完全相同的语法
那里没有问题。我有什么想法搞砸了吗?
我得到的错误是: 错误:传递Hex2Loong的参数1(long int *&,int&,const std :: string);
在相关的说明中,如果我有一个unsigned long *
我接受它,那么就没有办法强制转换它
可以将它传递给Hex2Loong
函数吗?我将不得不创建临时long *
vars投入他们并通过那些?
Ty任何答案, DRF
编辑: 嗯,好的,回答一些评论。 我传递了一个引用,因为该函数转换了一个可能非常长的十六进制字符串 一长串。 (即想一个大约2 ^ 1000的数字写成十六进制字符串) 我需要将数字作为一个longs数组传回(我可能会重写它 因为没有铸造使得它很麻烦,所以无符号长。)
HexString被声明为const,因为它应该是(它不应该被修改只读)。
最后你是对的,错误与宣言无关但是
而是用法。事实上我试图将(long *) num1
传递给num1
是unsigned long *
弄乱了一切。我仍然不明白错误显示的原因
在头文件中,而不仅仅是我实际调用的地方
具有错误参数的函数。
Edit2:哦,我刚刚意识到你通过const std::string&
的意思。而且当然
你是完全正确的。我也会改变它。这是我用java编写的
太多了。我没有意识到字符串实际上会被复制。
答案 0 :(得分:2)
你应该可以通过以下方式调用该函数:
long lvar;
long *plvar = &lvar;
int rc = Hex2Loong (plvar, some_int, some_string);
你不能做的是传递long的地址,因为你需要一个真正的引用。换句话说,不要尝试:
long lvar;
int rc = Hex2Loong (&lvar, some_int, some_string);
请参阅以下示例代码:
void Fn (long * &p1) {}
int main (void) {
long lvar;
long *plvar = &lvar;
Fn (plvar);
//Fn (&lvar);
return 0;
}
这可以编译好,但是当您取消注释&lvar
行时会抱怨。
就你的第二个问题而言,不,你需要一个可以作为参考传递的实际变量,因为函数可能会尝试改变它。因此,您需要在某处制作临时副本。
但是,请记住,除非您确实需要更改您传入的变量的值(以便这样的更改反映在调用代码中),否则不需要传递参考。您可以按值传递它并使用函数中的值。
如果您这样做(即,如果您不需要更改它),则可以在函数调用中使用&lvar
或(long*)(unsigned_long_ptr_variable)
等临时值。