#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
isNSArray
похож на другие, то возвращаемый объект будет anNSNumber
, а не adouble
— вам нужно будет вызватьdoubleValue
его, чтобы получитьdouble
внутреннюю информацию3. Хорошо, я отредактирую его и добавлю весь метод. Потому что у меня возникают проблемы с NSArray, когда дело доходит до возврата значений.
4. Извините за поздний ответ! Это сработало! большое вам спасибо. и я отредактирую свой вопрос