C++ 字符串打印机问题:参数X从‘;字符(*)[xx]和#x2019;至‘;字符**’;
函数声明如下:C++ 字符串打印机问题:参数X从‘;字符(*)[xx]和#x2019;至‘;字符**’;,c++,string,char,pass-by-reference,C++,String,Char,Pass By Reference,函数声明如下: public: static void bitfield_to_strfield ( s_EnhancedSQLobject_strfield hash[], char **str, int bitfield ); EnhancedSQLobject::bitfield_to_strfield ( STRFLD_ELEMENTAL_PROPERTY, &p_resistance_str, p_resistance ); 我正在尝试这样调用函数: public: sta
public: static void bitfield_to_strfield ( s_EnhancedSQLobject_strfield hash[], char **str, int bitfield );
EnhancedSQLobject::bitfield_to_strfield ( STRFLD_ELEMENTAL_PROPERTY, &p_resistance_str, p_resistance );
我正在尝试这样调用函数:
public: static void bitfield_to_strfield ( s_EnhancedSQLobject_strfield hash[], char **str, int bitfield );
EnhancedSQLobject::bitfield_to_strfield ( STRFLD_ELEMENTAL_PROPERTY, &p_resistance_str, p_resistance );
字符串声明为:
private: char p_resistance_str [ EnhancedSQLobject_STRFIELD_LEN ];
我得到以下错误
no known conversion for argument 2 from ‘char (*)[94]’ to ‘char**’
根据这条线索
似乎存在某种隐式转换问题。在传入参数之前,我尝试创建一个临时变量,但它仍然不起作用
char **tmptr = &p_resistance_str;
给我
cannot convert ‘char (*)[94]’ to ‘char**’ in initialization
我这样做的原因是,如果返回值是字符串,它将返回空指针,除非我动态分配字符串,返回字符串,然后销毁字符串
否则,是否可以将参数声明为:
char *[] str
因为我应该只使用固定宽度的字符串。如果要更改函数中字符串的元素,则无需传递字符串的地址。这样声明参数就足够了
char *str
并使用相应的参数,如
p_resistance_str
至于错误,那么字符串的定义如下
char p_resistance_str [ EnhancedSQLobject_STRFIELD_LEN ];
因此,指向字符串的指针将具有类型
char ( * ) [ EnhancedSQLobject_STRFIELD_LEN ];
当然,它与char**
不同
&p_resistance_str
类型为char(*)[size],无法隐式转换为char**
您可以做的是:-
char *ptr = p_resistance_str ;
func(&ptr);
void func(char** ptr) //just used for explanation...
如果你讨厌指针。。。C/C++不适合您的合作伙伴!;)) 如果要更改此字符串的内容,不需要传递指针的引用(char**) 将您的功能声明为:
public: static void bitfield_to_strfield ( s_EnhancedSQLobject_strfield hash[], char *str, int bitfield );
并称之为:
EnhancedSQLobject::bitfield_to_strfield ( STRFLD_ELEMENTAL_PROPERTY, p_resistance_str, p_resistance );
我希望你会觉得它有用。。。但是,请给我们一个机会去STD库。让我们考虑一下,如果编译器允许您进行此转换,将会发生什么。如果您获取
p\u resistance\u str
的地址,然后将该地址传递给函数,则函数可以修改p\u resistance\u str
指向的字符串的位置。这是没有道理的。事实上,你可以让p\u resistance\u str
指向不同大小的东西。具体来说,您可以将它指向不长的东西。所以这种转换是完全不安全的,这就是为什么它是不被允许的。如果bitfield\u to\u strfield
需要修改p\u resistance\u str
的字符,则不需要传递p\u resistance\u str的地址。如果bitfield\u to\u strfield
需要修改其参数点的位置,则无法传递p\u resistance\u str的地址。相反,您应该创建一个临时指针变量并传递它的地址。如果您希望临时指针变量最初具有与p\u resistance\u str
相同的内容,那么您也可以这样做:
char *temp = p_resistance_str;
bitfield_to_strfield(&temp);
请注意,temp
可能不再指向char
的相同序列,正如调用bitfield\u到strfield
后,p\u resistance\u str
所指向的序列一样。C!=C++ 2。为什么要声明为char**str
?它正在修改指针吗?或者它需要一个字符串数组?3.使用std::stringschar p_resistance\u str[…]
您拼错了std::string
。谢谢,这样应该更容易。我编译成功,但我必须创建测试代码,看看它是否有效。所以这需要一段时间。@larienna看起来你只需要打印出修改过的字符串,以确保程序是正确的。我测试了它,它工作正常。我编写测试代码是因为它在函数调用的链中非常深。因为这是一个游戏,它依赖于一些随机因素,信息不会显示在屏幕上。所以我只是做了一个测试循环,通过表显示信息,然后将一些信息重新插入数据库,它像一个符咒一样在两个方向上工作。我知道指针是如何工作的,我只是尽量避免它们。它们是隐形bug的潜在来源,2个月后,这些bug爆炸了,没有找到bug所在的线索。至于STD类,我使用的是allegro,它对Cstring友好。另外,STD类会使我的程序膨胀太多,而且它没有针对视频游戏进行优化。所以我宁愿用我多年前开始的方式来完成它。我将在Java中使用它们。