Плохой тип приемника iOS

#ios #xcode

#iOS #xcode

Вопрос:

Хорошо, итак, я уже посмотрел на SO и увидел пару подобных проблем, но я не мог найти ответа для моей конкретной ситуации. Всякий раз, когда я пытаюсь получить «количество» или размер f передаваемого массива, я получаю сообщение об Bad receiver type 'double *' ошибке. Я попытался преобразовать его в an 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;
}
 

Комментарии:

1. То, что вы передаете, не является NSArray , и поэтому не будет реагировать на count селектор

2. «преобразование его в ит » … опечатка?

3. -Вы правы, позвольте мне это изменить — верно, это опечатка. Я хотел сказать «это для инта».

Ответ №1:

Я не уверен, какова цель здесь. В Objective-C вы можете использовать 2 вида массивов — стандартные массивы C и базовые массивы ( NSArray и NSMutableArray ) Базовые массивы могут содержать только базовые объекты, т.е. NSNumber s, а не double s. Массивы C — это не объекты, это просто фрагменты последовательно выделенной памяти.

Вы пытаетесь использовать массивы C в качестве базовых массивов. То, что вы передаете в ( double[] ), является (после копирования в функцию) просто указателем на первый элемент в массиве, о чем и говорит ваша ошибка ‘Bad receiver type ‘double *’ — вы не можете отправить сообщение count этому типу. Это просто адрес в памяти.

Таким образом, сигнатура вашего метода должна быть:

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

Что касается остальной части метода, вы не можете инициализировать базовые массивы так, как вы пытаетесь это сделать. Можно инициализировать NSMutableArray с помощью capacity , но это подсказка компилятору зарезервировать этот объем пространства, и ничего более: после инициализации он будет содержать 0 объектов, а не любое число, которое вы передали в параметр capacity . По этой причине вы не можете сделать что-то подобное F[k] = f[k]; , потому что индекс не будет существовать. Вместо этого вы должны использовать addObject: .

Кроме того, имейте в виду, что NSArray s содержат NSNumbers , а не удваиваются. Чтобы получить значение NSNumber как a 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 переменные не должны быть заглавными (это зарезервировано для имен классов) и должны быть в camelCase. Также рекомендуется использовать описательные, не однобуквенные имена.
В качестве последнего замечания — я бы отредактировал ваш вопрос, чтобы он не содержал измененную сигнатуру метода с NSArray помощью s — поскольку этот вопрос не будет иметь смысла для других, поскольку опубликованный вами код больше не будет генерировать ошибку, которую вы описали в вопросе

Комментарии:

1. Я попробую это. Часть тела вырезана, но в основном я просто создаю массив после создания этого массива внутри тела моего метода

2. Также имейте в виду, что если convOutput is NSArray похож на другие, то возвращаемый объект будет an NSNumber , а не a double — вам нужно будет вызвать doubleValue его, чтобы получить double внутреннюю информацию

3. Хорошо, я отредактирую его и добавлю весь метод. Потому что у меня возникают проблемы с NSArray, когда дело доходит до возврата значений.

4. Извините за поздний ответ! Это сработало! большое вам спасибо. и я отредактирую свой вопрос