gpt4 book ai didi

ios - 错误的接收器类型 iOS

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:22:34 24 4
gpt4 key购买 nike

好的,所以我已经四处查看了 SO,我看到了一些这样的问题,但我无法找到适合我的特定情况的答案。每当我尝试获取传入的 f 数组的“计数”或大小时,我都会收到 Bad receiver type 'double *' 错误。我尝试将其转换为 int 但这没有帮助。

有什么建议吗?

- (double[])convolve1D:(double[])total f:(double[])f size:(int)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 数组和基础数组(NSArrayNSMutableArray)基础数组只能包含基础对象,即 NSNumber 而不是 double。 C 数组不是对象,它们只是连续分配的内存块。

您正在尝试将 C 数组用作基础数组。您传入 (double[]) 的内容(一旦复制到函数中)只是指向数组中第一个元素的指针,这就是您的“Bad receiver type 'double*'”错误关于 - 您不能将消息 count 发送到该类型。它只是内存中的一个地址。

所以你的方法的签名应该是:

- (void)convolve1D:(NSArray*)total f:(NSArray*)f size:(int)size.

至于该方法的其余部分,您无法按照您尝试的方式初始化 Foundation 数组。可以用一个容量初始化一个 NSMutableArray ,但这只是提示编译器保留那个空间量,仅此而已:初始化后,它将包含 0 个对象,而不是你想要的任何数量传递给容量参数。由于这个原因,您不能执行类似 F[k] = f[k]; 的操作,因为索引将不存在。相反,您必须使用 addObject:

此外,请记住 NSArray 包含 NSNumbers,而不是 double 。要获取 NSNumber 的值作为 double,您必须调用 [numberObject doubleValue]; 创建一个 NSNumber,使用 NSNumber 文字语法,例如@0.1@(someDoubleVariable);。这种包装和解包很烦人,但不幸的是,如果您想使用 Objective-C 类来执行此操作,则这是必需的。

- (NSArray*)convolve1D:(NSArray*)total f:(NSArray*)f size:(int)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 addObject:@0];

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 的修改后的方法签名 - 因为这个问题对其他人来说毫无意义,因为你的代码已发布将不再生成您在问题中描述的错误

关于ios - 错误的接收器类型 iOS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24417217/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com