好的,所以我已经在 SO 上环顾四周,发现了一些这样的问题,但我无法为我的特殊情况找到答案。每当我尝试获取传入的 f
数组的“计数”或大小时,都会收到 Bad receiver type 'double *'
错误。我尝试将其转换为 int
但这没有帮助。
有什么建议吗?
- (double[])convolve1Ddouble[])total fdouble[])f sizeint)size {
double ConvOutput[[total count] + [f count]-1];
double *F[size];
double *TOTAL[size];
for (int k = 0; k < [f count]; k++)
F[k] = f[k];
for (int k = 0; k < [f count]; k++)
TOTAL[k] = total[k];
for (int i = 0; i < ([f count] + [total count] - 1);i++)
{
ConvOutput[i] = 0;
for (int j = 0; j < [total count]; j++)
{
if (i - j + 1 > 0)
ConvOutput[i]+=TOTAL[j] * F[i - j];
}
}
return ConvOutput;
}
我不确定这里的目标是什么。在 Objective-C 中,您可以使用 2 种数组 - 标准 C 数组和 Foundation 数组(NSArray
和 NSMutableArray
) Foundation 数组只能包含 Foundation 对象,即 NSNumber
s 而不是 double
s。 C 数组不是对象,它们只是连续分配的内存块。
您正在尝试将 C 数组用作 Foundation 数组。您传入的 (double[]
) 是(一旦复制到函数中)只是指向数组中第一个元素的指针,这就是您的“错误接收器类型 'double*' 错误是什么关于 - 您不能将消息 count
发送到该类型。它只是内存中的一个地址。
所以你的方法的签名应该是:
- (void)convolve1DNSArray*)total fNSArray*)f sizeint)size
.
至于该方法的其余部分,您无法以您尝试的方式初始化 Foundation 数组。可以使用容量初始化 NSMutableArray
,但这是对编译器保留该空间量的提示,仅此而已:初始化后,它将包含 0 个对象,而不是您的任何数量传递给容量参数。
由于这个原因,您不能执行 F[k] = f[k];
之类的操作,因为索引将不存在。相反,您必须使用 addObject:
。
另外,请记住 NSArray
s 包含 NSNumbers
,而不是 double 。要将 NSNumber
的值作为 double
获取,必须调用 [numberObject doubleValue];
来创建 NSNumber
,使用 NSNumber
文字语法,例如@0.1
或 @(someDoubleVariable);
。这种包装和展开是令人厌烦的,但不幸的是,如果你想使用 Objective-C 类来做到这一点,这是必要的。
- (NSArray*)convolve1DNSArray*)total fNSArray*)f sizeint)size
{
NSMutableArray *convOutput = [NSMutableArray arrayWithCapacity:[total count] + [f count]-1];
NSMutableArray *fArray = [NSMutableArray arrayWithCapacity:size];
NSMutableArray *innerTotal = [NSMutableArray arrayWithCapacity:size];
for (int k = 0; k < [f count]; k++)
{
[fArray addObject:f[k]];
[innerTotal addObject:total[k]];
}
for (int i = 0; i < ([f count] + [total count] - 1);i++)
{
[convOutput addObject0];
for (int j = 0; j < [total count]; j++)
{
if (i - j + 1 > 0)
{
double val1 = [innerTotal[j] doubleValue];
double val2 = [fArray[i-j] doubleValue];
double currentVal = [convOutput[i] doubleValue];
convOutput[i] = @(val1 * val2 + currentVal);
}
}
}
return (NSArray*)convOutput;
}
我还更改了一些变量的名称。一般来说,在 Objective-C 中,变量不应该大写(这是为类名保留的),并且应该是驼峰式。使用描述性的非单个字母名称也是一个好主意。
最后一点 - 我会重新编辑你的问题,所以它不包含带有 NSArray
s 的修改后的方法签名 - 因为这个问题对其他人来说毫无意义,因为你的代码'已发布将不再产生您在问题中描述的错误
关于ios - 错误的接收器类型 iOS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24417217/
欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) | Powered by Discuz! X3.4 |