- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我对 C
完全陌生,所以请多多包涵。我正在编写一个解析器来打开多个文本文件——每个大约 300 Kb,逐个字符地读取它们并提取所需的信息。处理分为三个不同的阶段,它需要大约十个不同的函数来处理每个字符串 block ,一个接一个。
由于文件不是很小而且可能有很多,我正在尝试编写一个高效且符合行业标准的代码。
在我看来,这些是我的选择:
A) 嵌套函数调用:假设我的 main
函数调用 read_file
,然后 read_file
调用 get_lines
,然后 get_lines
调用 get_name
等等。
这个解决方案的优点是,如果我在我的 read_file
函数中有一个 while
循环,那么我可以直接在循环内调用 get_name
功能;但是,如果我将数据从 get_lines
函数返回到 main
,那么我必须再次循环并将数据传递给 get_name
。
这里的问题是它不是一种很有条理的做事方式。在这种情况下,我的主函数只会调用 read_file
函数,然后最后将输出数据写入文件。
我猜 main
函数应该控制程序的整体执行,这意味着它应该调用一个函数来执行一些业务逻辑,然后检索数据并将其传递给下一个函数,很快。我是对的还是错误的假设?
B) 全局变量:这样我将定义几个全局变量,然后我将直接处理它们,而不需要将它们从这个函数传递到另一个功能。
既然不需要在函数生命周期结束时返回数据,那么效率肯定更高;但是,一般来说,我不是全局变量 的忠实拥护者,即使在静态类型和同步环境中也是如此。不过,我可能对此感到不必要的担心。
C) 传递指针:对我来说,这似乎是我应该去做的方式;然而,由于这些数据在函数范围内是本地的,所以我将使用Wild Pointers。 static
关键字解决了无效指针的问题;然而,似乎更有经验的人出于某种原因试图避免使用它。所以我不太确定这是否是一个好的做法。
问题:我在C
方面没有任何实际经验,因此我看不出上述解决方案的真正优缺点。例如,与使用全局变量相比,使用 static
关键字并传递指针是否有任何优势?
换句话说,在这个特定案例中,每种方法的优缺点的简短列表肯定会帮助我从三种方法中选择一种。
最佳答案
就问题而言,全局和局部静态变量的行为方式相同。出于特定功能的考虑,它们都算作“全局”,因此不能同时从多个调用(从多个并发线程调用)中使用 end。
要回答这个问题,需要了解此代码的要求和最终目标。
有些任务需要最终数据集作为结果——这些数据会随着文件的增加而增长,但在使用之前仍然必须完成。作为示例,您可以想到文件(或文件集)中的唯一单词列表。
其他任务允许迭代方法 - 您可以多次调用函数,每次检查返回值并处理它。一些特定的返回值表示没有更多数据,此时您应该停止调用它。示例是文件读取函数,例如 fread
- 您多次调用它,并且每次它都从上次停止的地方继续读取。同样的任务可以通过形成完整的数据集来完成——比如根据需要分配尽可能多的内存并将整个文件读入其中;这是完全不同的,不太灵活的方法。然而,某些更高级别的任务(处理数据的任务)可能需要它。
有些任务允许两种方法,例如XML 解析可能是 DOM 或 SAX。但是,仍然有一个更高级别的目标决定使用哪种方法(DOM 可能更容易使用,但如果数据是从慢速源(例如互联网)获取的,则首选 SAX,同时需要至少显示部分数据尚未完全加载的数据)。
关于c - 避免在函数调用之间传递大数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27766967/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!