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::strings
char p_resistance\u str[…]
您拼错了
std::string
。谢谢,这样应该更容易。我编译成功,但我必须创建测试代码,看看它是否有效。所以这需要一段时间。@larienna看起来你只需要打印出修改过的字符串,以确保程序是正确的。我测试了它,它工作正常。我编写测试代码是因为它在函数调用的链中非常深。因为这是一个游戏,它依赖于一些随机因素,信息不会显示在屏幕上。所以我只是做了一个测试循环,通过表显示信息,然后将一些信息重新插入数据库,它像一个符咒一样在两个方向上工作。我知道指针是如何工作的,我只是尽量避免它们。它们是隐形bug的潜在来源,2个月后,这些bug爆炸了,没有找到bug所在的线索。至于STD类,我使用的是allegro,它对Cstring友好。另外,STD类会使我的程序膨胀太多,而且它没有针对视频游戏进行优化。所以我宁愿用我多年前开始的方式来完成它。我将在Java中使用它们。