访问块内的 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】:

好的,在评论路径后面有一些指针,但是你需要学习和理解这里发生了什么

可以吗

myBlockType array = calloc(2, sizeof(myBlockType));
在 C 数组中,指针是密切相关的。在 C 数组 T x[n] 中,名称 x 的类型为 T * - 一个指针。使用指针操作 (* & +) 将索引操作 x[n] 定义为与 *(x + n) 相同。因此,您可以将数组视为指针,将指针视为数组,例如你可以“索引”一个指针。 正如您所发现的,您无法在块中捕获 本地 数组变量。 您可以捕获指针值变量,您有责任确保所指向的内容保持有效。 您的calloc 想法是一种可能的解决方案,但类型错误,array 需要声明为指针。 此外,如果您正在使用 ARC(很有可能)并存储 可保留对象类型的指针,例如对对象或块的引用,则array 的类型必须包含所有权限定符。您可能应该使用__strong,以便您的“数组”拥有它引用的项目,就像NSArray 一样。 如果您有任何问题calloc(或malloc),您有责任在需要时致电free

了解这些要点,您可能的解决方案(不止一个)就会落空。

HTH

【讨论】:

以上是关于访问块内的 C 块数组的主要内容,如果未能解决你的问题,请参考以下文章

C++ 访问静态分配对象的成员

更改完成块内的属性值

描述块内的 jest.setTimeOut() 是不是仅将超时应用于描述块内的测试

深度解析PHP数组函数array_chunk

完成块内的 UIViewPropertyAnimator 状态?

内联块内的文本选择,中间没有空格