我有一个非常基本的问题。
这次电话有什么问题?
int params[2] = {1, 1};
return strcmp95((char*)buffer1, (char*)buffer2, (long)stringLength, ¶ms);
该功能的定义如下:
double strcmp95(char *ying, char *yang, long y_length, int *ind_c[])
{...
当我在XCode中编译时,我收到以下警告:
警告:传递参数4 来自不兼容指针的'strcmp95' 型
抱歉不精确。这是功能描述:
/ *参数: ying和yang是指向要比较的2个字符串的指针。字符串 不必是NUL终止的字符串 因为长度通过了。 y_length是字符串的长度。 ind_c是一个数组,用于定义某些选项是否应该 被激活。非零值 表示该选项已停用 选项是: ind_c [0]匹配时增加匹配概率 字符很大。这个选项 允许更多的容忍度 当字符串很大时。它不是 比较时的适当测试 固定长度的字段,如电话和 社会安全号码。 ind_c [1]所有小写字符都转换为大写 在比较之前。禁用 这个功能意味着下层
案例字符串“代码”不会 被认为与鞋面相同 案例字符串“CODE”。而且, 调整类似的字符 部分仅适用于大写 字符。 建议的值对于字符串都是零,例如 名。 * /
答案 0 :(得分:4)
params
是int [2]
,在传递给函数时会衰减到int *
,并且以int []
为参数的函数实际上正在int *
在幕后。不幸的是,¶ms
是int(*)[2]
,比您需要的int *
(与函数参数中的int **
相同)更接近int *[]
。
您最好的选择是将您的功能更改为:
double strcmp95(char *ying, char *yang, long y_length, int *ind_c)
并假设调用者将始终通过int[2]
。或者您可以明确要求int(*)[2]
- 指向2 int
s数组的指针:
double strcmp95(char *ying, char *yang, long y_length, int (*ind_c)[2])
但这似乎没有必要保证传递两个int
,如果你需要考虑数组中两个以上int
s的可能性是不合适的。更好的方法是:
double strcmp95(char *ying, char *yang, long y_length, int *ind_c, size_t len)
size_t
是一个无符号整数类型,保证能够保存任何对象或任何数组索引的大小,在这种情况下,len
参数是数组的长度({{1如果你想要花哨/前瞻性思考,(sizeof params / sizeof params[0])
如果你不这样做。那是最安全的路线。
顺便说一句,您的2
参数也应该是y_length
变量。 size_t
已签名,我不得不处理一个-1长度的字符串。即使您使用long
,也无法保证unsigned long
足以处理系统的大小(相反,对于您的系统来说,一个错误的大long
值太大了处理并导致混淆)。
答案 1 :(得分:2)
strcmp95
获取指向int(int **
)的指针,同时向它传递一个指向两个整数(int (*)[2]
)数组的指针。
您可以修改strcmp95
,使其签名如下所示:
double strcmp95(char *ying, char *yang, long y_length, int (*ind_c)[] );
这里的要点是指向数组(int (*x)[]
)的指针与指针数组(int *(x[])
并且与int *x[]
相同)
答案 2 :(得分:1)
很难知道strcmp95是否应该采用像你试图传递的int数组,或者它是要将一个int指针数组作为原型请求。前者似乎很可能 - 如果是这样,你应该改变......
double strcmp95(char *ying, char *yang, long y_length, int *ind_c[])
...到...
double strcmp95(char *ying, char *yang, long y_length, int *ind_c)
......或等同于......
double strcmp95(char *ying, char *yang, long y_length, int ind_c[])
答案 3 :(得分:1)
为什么你传递& params,params就足够了,因为数组就像一个指针。
return strcmp95((char*)buffer1, (char*)buffer2, (long)stringLength, params);
其次strcmp95现在应该期待一系列的整数,这很好:
double strcmp95(char *ying, char *yang, long y_length, int ind_c[])
答案 4 :(得分:1)
另外我认为你正在传递params(它本身就是一个整数指针),而strncmp95函数期望指向一个整数数组的指针,即int * ind_c []。