访问块内的 C 块数组
Posted
技术标签:
【中文标题】访问块内的 C 块数组【英文标题】:Accessing a C array of blocks inside a block 【发布时间】:2017-07-27 14:21:19 【问题描述】:我有一个这样定义的 C 块数组:
void (^block1)() = ^void()
doSomething1();
doSomething2();
;
void (^block2)() = ^void()
doSomething3();
doSomething4();
;
// etc.
typedef void (^myBlockType)();
myBlockType arrayBlock[2];
arrayBlock[0] = block1;
arrayBlock[1] = block2;
但后来我试图从块内访问该 C 数组,类似于
void (^adjust)(int value) = ^void(int value)
myBlockType myBlock = arrayBlock[value];
;
Xcode 在抱怨
不能引用块内的数组类型的声明
如果这是一个浮点数、整数等数组,则有this solution,但如何为 C 块数组执行此操作?
可以吗
myBlockType array = calloc(2, sizeof(myBlockType));
?这是正确的方法吗?在那种情况下,我该如何初始化这些值?
【问题讨论】:
两个问题(a)你没有说你为什么不使用NSArray
,这将有助于了解(b)链接的问题(不是answer) 为您提供了一个解决方案——它有一个 X 数组,你有一个 Y 数组,对程序没有任何影响——那你怎么办?如果您编辑要回答的问题可能是最好的(只需留下您所做的评论)。
对不起,我的 C 很烂,但我必须使用 C 数组,因为我必须与之交互的模块,而不是我编写的,都是用 C 编写的。除了我的 C 很烂之外,我的另一个问题是使用语法array[i]
无法访问另一个数组。我试过了,Xcode 到处抱怨。我猜该数组上的元素必须使用指针来访问,我不知道如何做到这一点,或者甚至如何用要开始的元素填充该数组。
继续...查看我对 C 知识贫乏的链接并没有让我在那里看到答案...如果您能回答我如何创建它、填充和获取项目,我会接受答案...是的,我知道,我的 C 很臭。谢谢
如果你正在这样做,你真的需要学习一些(更多——Objective-C 是一个超集,所以你必须知道一些)C。 “我的另一个问题是,使用语法 array[i]
无法访问另一个数组” - 如果您要导入 C 数组 或 指针,那么此语法 将起作用 .如果“Xcode 到处发牢骚”,那就是错误。在尝试继续之前弄清楚是什么(如果需要,可以询问关于 SO 的问题)。
这就是我创建这个问题的原因。让我们希望有人知道如何做到这一点。还是谢谢。
【参考方案1】:
好的,在评论路径后面有一些指针,但是你需要学习和理解这里发生了什么。
在 C 数组中,指针是密切相关的。在 C 数组可以吗
myBlockType array = calloc(2, sizeof(myBlockType));
T x[n]
中,名称 x
的类型为 T *
- 一个指针。使用指针操作 (*
& +
) 将索引操作 x[n]
定义为与 *(x + n)
相同。因此,您可以将数组视为指针,将指针视为数组,例如你可以“索引”一个指针。
正如您所发现的,您无法在块中捕获 本地 数组变量。
您可以捕获指针值变量,但您有责任确保所指向的内容保持有效。
您的calloc
想法是一种可能的解决方案,但类型错误,array
需要声明为指针。
此外,如果您正在使用 ARC(很有可能)并存储 可保留对象类型的指针,例如对对象或块的引用,则array
的类型必须包含所有权限定符。您可能应该使用__strong
,以便您的“数组”拥有它引用的项目,就像NSArray
一样。
如果您有任何问题calloc
(或malloc
等),您有责任在需要时致电free
。
了解这些要点,您可能的解决方案(不止一个)就会落空。
HTH
【讨论】:
以上是关于访问块内的 C 块数组的主要内容,如果未能解决你的问题,请参考以下文章
描述块内的 jest.setTimeOut() 是不是仅将超时应用于描述块内的测试