С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

Objective-C

Войти
Регистрация
Восстановить пароль
 
dontgiveafk
36 / 16 / 0
Регистрация: 29.01.2010
Сообщений: 252
#1

Вызов блока с переменными параметрами - Objective-C

19.02.2015, 11:37. Просмотров 666. Ответов 3
Метки нет (Все метки)

Странное дело. Есть функция/метод у объекта:
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
-(void) BlockCall:(void (^)(float a, float b, NSObject *object, NSObject *secObject, NSObject *thirdObject)) argBlock
                withObject: (NSObject *)object
                   andSObj:(NSObject *)sobject
                   andTObj:(NSObject *)tobject
{
 
    object = [[NSObject alloc] init];
    sobject = [[NSObject alloc] init];
    tobject = [[NSObject alloc] init];
    NSLog(@"First object:%@", object);
    NSLog(@"Second object:%@", sobject);
    NSLog(@"Third object:%@", tobject);
    argBlock(15 ,27, object, sobject, tobject);
}
И блок :
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
void (^voidBlock)(va_list args, ...);
  voidBlock= ^(va_list args, ...){
 
      va_list parsArgs;
      va_start(parsArgs, args);
 
        va_arg(parsArgs, double);
        va_arg(parsArgs, double);
        id NSObjectArg = va_arg(parsArgs, id);
        id NSObjectArg2 = va_arg(parsArgs, id);
        id NSObjectArg3 = va_arg(parsArgs, id);
     va_end(parsArgs); 
 }
Если я вызову эту функцию с корректными параметрами и передам ей блок в качестве параметра, то внутри блока он корректно прочитает два первых флота потом второй переданный объект он прочитает как первый NSObjectArg, третий прочитает как NSObjectArg2.
И так всегда он будет читать все примитивы до первого указателя, потом сожрет первый указатель и прочитает все остальные.
Если блок изменить и сделать его с фиксированными параметрами то все он нормально прочитает, но мне нужен именно блок с переменными параметрами
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.02.2015, 11:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вызов блока с переменными параметрами (Objective-C):

Вызов скрипта с параметрами скрипта рекурсивно с своими глобальными переменными каждый вызов - Node.js
Всем привет, есть скрипт у которого глобальные переменные на весь файл. Хочу запустить этот скрипт с путем к файлу с параметрами для...

Подпрограммы с типизированными параметрами -значениями и параметрами-переменными - Pascal
Помогите пожалуйста). С помощью подпрограммы, определяющей принадлежность символа к заданному множеству, установить количество гласных букв...

Подпрограммы с типизированными параметрами -значениями и параметрами-переменными - Turbo Pascal
С помощью подпрограммы подсчитать сумму элементов главной диагонали для матриц 4х4 и 5х5 из вещественных чисел. Добавлено через 1...

Процедура с параметрами переменными - Pascal
Помогите пожалуйста решить задачу... Вычислить значение х^y 2^3+3^4+4^5

Запуск exe-файла с переменными параметрами - Delphi
Хочу запустить exe-файл с параметром: выбираю файл нажимаю "Открыть", затем отрабатывает "Запускаемая_программа.exe" с параметрами, а в...

Создание блока с переменными при клике - jQuery
Здравствуйте! Мне нужно при клике по ссылке создавать одинаковые блоки, но с разными id. Пока вот, что у меня получилось: methods.php ...

3
zulkis
683 / 610 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
19.02.2015, 11:56 #2
dontgiveafk, дело простое, не странное.
Читайте https://developer.apple.com/library/...itChanges.html
Дело в разном размере float и pointer в 64-битной системе.
Вы можете изменить float -> CGFloat, что должно вылечить симптом. Но я бы на вашем месте пересмотрел взгляд на использование таких блоков.
Другое, более верное решение - передавать список с указателями на объекты, и использовать не примитивы, но NSNumber.

С другой стороны - я не могу с уверенностью сказать что сделает LLVM с типом float в списке. По стандарту вроде должен преобразовать в double, а это уже 8. Если все так - то проблема может быть не там, где я подумал.
1
dontgiveafk
36 / 16 / 0
Регистрация: 29.01.2010
Сообщений: 252
19.02.2015, 15:01  [ТС] #3
CGFloat не лечит симптом, если посмотреть этот тип, там все промотится до double и поведение такое же, отсюда другой вопрос:
Я хочу сам вычислить смещение и читать эти аргументы ? задавая сам сколько байт нужно прочитать могу ли я как ни это сделать?

Добавлено через 24 минуты
То есть я не хочу писать float b = va_arg(parsArgs, double) , а хочу написать float b = va_arg(parsArgs, 8) считай мне 8 следующих байт и интерпретируй как float или хочу написать float b = va_arg(parsArgs, sizeof(double)/alignof(float))
считай мне результат этого деления и интерпретируй как флотб или двигать его как pointer

Добавлено через 1 час 36 минут
Если блок будет принимать два int и шагать в va_arg по int то проблема та же следующий за int ссыльный тип сотрется
0
zulkis
683 / 610 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
19.02.2015, 19:40 #4
va_list вообще не создавался для того, чтобы разные типы гонять в нем.
Гарантий, что ваша арифметика заведется на другой архитектуре(читайте ARM/x64/x86) - нет никаких.
Есть замечательный ответ на SO по этому поводу.
Вся эта затея очень шаткая, скажите - зачем вам это? Наверняка есть более простые способы...
0
19.02.2015, 19:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.02.2015, 19:40
Привет! Вот еще темы с ответами:

ADDODB и вызов ХП с параметрами - VBA
With comm .ActiveConnection = conn .CommandType = adCmdStoredProc .CommandText = "temp" ...

Вызов процедуры с параметрами - Delphi
Здравствуйте, знаю что вопрос ламерский,но все же.. как в делфе вызвать процедуру события другого объекта с параметрами? то есть у...

Вызов процедуры с параметрами - Visual Basic .NET
в общем туплю жестко но как вызвать процедуру в коде? Public Class Form1 Private SUB procedyra(BYVAL j AS DOUBLE, BYVAL i...

Асинхронный вызов метода с параметрами - C++
Здравствуйте, возможно ли в c++ вызвать метод с параметрами и не дожидаясь его завершения продолжать выполнять код? Например. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.