OStack程序员社区-中国程序员成长平台

标题: ios - 错误的接收器类型 iOS [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-12 23:18
标题: ios - 错误的接收器类型 iOS

好的,所以我已经在 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;
}



Best Answer-推荐答案


我不确定这里的目标是什么。在 Objective-C 中,您可以使用 2 种数组 - 标准 C 数组和 Foundation 数组(NSArrayNSMutableArray) Foundation 数组只能包含 Foundation 对象,即 NSNumber s 而不是 doubles。 C 数组不是对象,它们只是连续分配的内存块。

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

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

- (void)convolve1DNSArray*)total fNSArray*)f sizeint)size.

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

另外,请记住 NSArrays 包含 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 中,变量不应该大写(这是为类名保留的),并且应该是驼峰式。使用描述性的非单个字母名称也是一个好主意。 最后一点 - 我会重新编辑你的问题,所以它不包含带有 NSArrays 的修改后的方法签名 - 因为这个问题对其他人来说毫无意义,因为你的代码'已发布将不再产生您在问题中描述的错误

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






欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) Powered by Discuz! X3.4