Questions tagged «c»

C是用于操作系统,游戏和其他高性能工作的通用计算机编程语言。

7
使用C而不是Assembly有哪些优点/缺点?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 我目前正在研究电信和电子领域的工程学,我们已经从微处理器编程的汇编程序迁移到了C语言。我怀疑这是个好主意。与汇编相比,C有哪些优缺点? 我看到的优点/缺点是: 优点: 我可以说C语法比汇编器语法更容易学习。 使用C可以更轻松地制作更复杂的程序。 学习C比学习汇编器更有效率,因为围绕C的开发工作比汇编器要多。 缺点: 汇编器是比C更底层的编程语言,因此它非常适合直接对硬件进行编程。 暗示您可以使用内存,中断,微寄存器等的灵活性更高。
15 c  low-level  assembly 

5
有关为微控制器编写高效的C代码的资源?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,以使它成为软件工程堆栈交换的主题。 5年前关闭。 这里需要认真的帮助。我喜欢编程。最近,我一直在在线阅读有关C语言的大量书籍(例如K&R)和文章/论坛。甚至尝试研究Linux代码(尽管我不知道该从哪里开始,但是窥探小型库有帮助吗?)。 我最初是一名Java程序员,在Java中相当干cut。如果程序太大,则将其切成类,然后进一步细分为函数。准则,例如,保持代码可读性并添加注释。使用信息隐藏和OOP技术。其中一些仍然适用于C。 我现在一直在用C进行编码,到目前为止,我可以使程序以某种方式工作。许多人谈论性能/效率,算法/设计,优化和可维护性。有些人比其他人压力更大,但是对于非专业的软件工程师,您经常会听到类似这样的信息:Linux内核开发人员不会仅仅接受任何代码。 我的问题是:我计划在不浪费任何资源的情况下为8位微控制器编写代码。知道我来自Java背景,所以事情已经不一样了...资源/书籍/链接/技巧将不胜感激。性能和大小现在很重要。针对8位微控制器的有效(最佳实践)C代码的资源/技巧? 此外,它还inline assembly扮演着至关重要的角色,并且坚持遵守微控制器标准。但是,效率是否有适用于所有人的一般经验法则? 例如: 随时register unsigned int variable_name;首选char。或使用 uint8_t ,如果你不需要大的数字。 编辑:非常感谢您的所有答案和建议。感谢大家为共享知识所做的努力。
15 c  performance  speed 

5
如何在C中应用接口隔离原则?
我有一个模块,例如“ M”,其中有一些客户端,例如“ C1”,“ C2”,“ C3”。我想将模块M的名称空间(即,其公开的API和数据的声明)分配给头文件,使得- 对于任何客户端,仅可见其所需的数据和API;模块的其余名称空间对客户端是隐藏的,即遵守接口隔离原则。 在多个头文件中不重复声明,即不违反DRY。 模块M与其客户端没有任何依赖关系。 客户端不受模块M未被其使用的部分中所做的更改的影响。 现有客户端不受添加或删除更多客户端的影响。 目前,我通过根据模块客户端的需求划分模块的命名空间来解决此问题。例如,在下面的图像中,显示了其3个客户端所需的模块名称空间的不同部分。客户要求有重叠。模块的名称空间分为4个单独的头文件-'a','1','2'和'3'。 但是,这违反了上述某些要求,即R3和R5。违反了要求3,因为这种划分取决于客户端的性质;在添加新客户端时,该分区也会更改并违反要求5。如上图右侧所示,在添加新客户端后,模块的命名空间现在分为7个头文件-'a ”,“ b”,“ c”,“ 1”,“ 2 *”,“ 3 *”和“ 4”。用于2个旧客户端的头文件发生更改,从而触发了其重建。 有没有办法以非人为方式在C中实现接口隔离? 如果是,您将如何处理上述示例? 我想象的是一个虚幻的假设解决方案- 该模块有1个胖头文件覆盖了整个名称空间。该头文件分为可寻址的部分和子部分,如Wikipedia页面。然后,每个客户端都有一个为其量身定制的特定头文件。特定于客户机的头文件只是指向胖头文件的节/子节的超链接的列表。如果构建模块指向模块头文件中的任何部分,则构建系统必须将特定于客户端的头文件识别为“已修改”。
15 c  interfaces  solid 

10
是什么让C开发人员如此好奇“ i ++ == ++ i”?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 只是随机观察,似乎在StackOverflow.com上,是否存在有关“ ++ i == i ++”的问题。这个问题一直被问到,我想我在过去两个月中看到了大约6到7次问。 我只是想知道为什么C开发人员对它如此感兴趣?C#和Java开发人员也存在相同的概念/问题,但我想我只看到一个与C#相关的问题。 是因为有这么多示例使用++ i吗?是因为有一些受欢迎的书或教程吗?是因为C开发人员只是喜欢尽可能多地将它们塞进一行以提高“效率” /“性能”,并因此更频繁地使用++运算符遇到“怪异”的构造?

4
当您不知道某物如何实际工作时,该如何编码?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,以使它成为软件工程堆栈交换的主题。 2年前关闭。 我最近学习了C,并且想启动一个项目来巩固我的知识。我决定制作一个非常简单的文本编辑器,例如vim。我面临的问题是,我真的不知道文本编辑器的工作原理,也不知道可以从谷歌那里学到什么。 对其进行谷歌搜索导致了vim的GitHub回购,这对我来说毫无用处,因为代码库很大而且代码使我感到困惑。我还找到了使用C制作文本编辑器的教程,其功能类似于vim。 尽管我考虑过学习这些教程,但感觉却像在作弊。vim开发人员如何在没有特定教程的情况下弄清楚如何编码vim?还是从更简单的文本编辑器开始?他们如何仅从语言知识及其文档中找出答案? 在不直接遵循教程的情况下开始编写此文本编辑器到底需要什么?我想想到的另一个示例是:Dennis Ritchie和Ken Thompson如何编写Unix的代码?我对OS的功能有所了解,但对如何将其放入代码中一无所知。我想念的是什么?如何将这种语言知识转化为实际的实际使用?
14 c  languages 

3
支持旧操作系统的开发
我维护着大部分用C编写的遗留代码。此代码最初被编写为针对Windows 3 for Workgroups进行编译,后来创建了NT版本。这个旧版应用程序至今仍在使用,自90年代初开始在3.11和NT工作站上愉快地运行。它可以正常工作,并且可以完成预期的工作,而它们仍然存在的原因是,属于该解决方案的某些自定义硬件的驱动程序与以后的Windows不兼容。 我维护了另一个应用程序,出于相同的原因,该应用程序仅在Win2k上有效。 但是,随着事情的发展,运行这些旧环境变得越来越困难。现在,我保留安装了开发软件的物理机,因此可以在本机硬件上工作。但是这些可能会随时死亡(毕竟他们已经25岁了)。 所以我的问题是,从2016年开始,我有什么选择可以更稳定地维护这一古老环境?您可以将3.11迁移到云托管吗? 我尝试了虚拟化,但是由于设置的特殊性,我无法使其与设备驱动程序一起使用,因此我认为可能需要按原样制作完整的操作系统映像,然后在一个操作系统中运行该映像。 VM开发软件?这样的事情可能对来宾操作系统版本一样古老WIN3和NT? 是否有任何经验可以使类似的旧平台存活下来进行开发,但是我可以借鉴更现代,更安全的方式? 我的目标是摆脱旧的物理机,然后转向虚拟化。
14 c  windows  legacy 

5
编写面向对象的C是否不好?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 我似乎总是用C编写的代码大多是面向对象的,所以说我有一个源文件或某些东西,我会创建一个结构,然后将指向该结构的指针传递给该结构所拥有的函数(方法): struct foo { int x; }; struct foo* createFoo(); // mallocs foo void destroyFoo(struct foo* foo); // frees foo and its things 这是不好的做法吗?我如何学习以“正确的方式”编写C语言。
14 c 

5
Java中未定义的行为
我在SO上阅读了这个问题,讨论了C ++中一些常见的未定义行为,我想知道:Java是否也具有未定义的行为? 如果是这样,那么Java中未定义行为的一些常见原因是什么? 如果不是,那么Java的哪些功能使其摆脱了此类行为,为什么没有使用这些属性实现最新版本的C和C ++?


4
如何在C指针中确定优先级?
我遇到了两个难以理解的指针声明。我对优先规则的理解是这样的: Operator Precedence Associativity (), [ ] 1 Left to Right *, identifier 2 Right to Left Data type 3 但是即使这样,我似乎也无法弄清楚如何正确评估以下示例: 第一个例子 float * (* (*ptr)(int))(double **,char c) 我的评价: *(ptr) (int) *(*ptr)(int) *(*(*ptr)(int)) 然后, double ** char c 第二个例子 unsigned **( * (*ptr) [5] ) (char const *,int *) *(ptr) …
14 c  pointers 

3
为什么c系列是LISP系列而不是数学/ CS计划的标准CS学习团?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 为了自我改善,我一直在熟悉LISP。我注意到的一件事是LISP在数学范式中比在C语言中更重要。语法和设计结构似乎直接反映了算法的实际数学模型。对我来说,为什么即使是基于数学的优秀CS程序也学习C而不是LISP,这对我来说都没有道理。我认为LISP比C更直接采用更高的数学概念。我并不是说您不能在C中对数学结构进行建模。我只是注意到LISP对于数学家来说似乎是一成不变的。 我已经在JAVA学校中阅读了许多Joel Spolsky的咆哮,而没有读到(我同意他的评价),但是我的学校并没有因此而教JAVA。他们在教授诸如指针,算法设计,递归甚至汇编指令之类的基本概念方面非常严格。但是,他们在C和c ++中都完成了这一切。有谁知道原因和/或其历史?

3
在C ++或MATLAB中实现技术论文算法
我是电气工程专业的本科生。我已经阅读了许多有关信号和图像处理算法(重构,分段,滤波等)的技术论文。这些论文中显示的大多数算法都是在连续时间和连续频率上定义的,并且经常根据复杂的方程式给出解决方案。您将如何在C ++或MATLAB中从头开始实施技术论文,以便复制在该论文中获得的结果? 更具体地说,我正在看Wang等人的论文“通用锥束重建算法”(IEEE Trans Med Imaging。1993; 12(3):486-96),我想知道如何开始?实现他们的算法?公式10为您提供了处重建图像的公式。您将如何编码?您是否有一个遍历每个体素并计算相应公式的for循环?您将如何在该公式中编写函数的函数代码?您将如何在任意点评估函数? 我读过冈萨雷斯和伍兹写的《数字图像处理》一书,但我仍然茫然。我还阅读了有关数字食谱的系列丛书。那是正确的方法吗? 您从研究论文中编程算法有什么经验?有任何提示或建议吗?
14 c  algorithms  matlab 

8
为什么C在嵌入式软件市场占主导地位?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 现在几乎每个人都会说祝福: 性能! 好的,C确实可以编写运动代码。但是毕竟还有其他语言可以做到!而且现代编译器的优化功能非常强大。C是否具有其他语言没有的某些优势?还是在该领域根本不需要更灵活的工具?

4
为什么Apache HTTP Server如此复杂?
Apache HTTP服务器是比,说一个相当大的项目要大得多,lighthttp或nginx否则肯定了“简单的HTTP服务器,”你看在C / C左右浮动++教程。 额外的代码是做什么的?它是增加安全性/稳定性(如果可以的话,如何呢?),还是仅用于执行诸如解析Apache conf文件/ .htaccess键入事物(以及,我猜VirtualHosts等等)之类的事情。 我要求不要批评Apache,但是因为我对编写各种Web服务器感兴趣,并且我想知道一些事情,尽管可能并不明显,但对于记住一个安全,稳定和快速的Web服务器来说,这些事情很重要。
14 c  apache  http 

4
您最喜欢的按位技术是什么?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 已锁定。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 几天前,StackExchange成员Anto询问了按位运算符的有效用法。我说过,移位比将整数除以2的幂更快。StackExchange成员Daemin反驳说,右移带来了负数问题。 那时,我还没有真正考虑过将带符号整数用于移位运算符。我主要在底层软件开发中使用了该技术。因此,我总是使用无符号整数。C对无符号整数执行逻辑移位。执行逻辑右移时,无需注意符号位。空位用零填充。但是,当右移有符号整数时,C执行算术移位运算。空位用符号位填充。此差异导致负值四舍五入为无穷大而不是被舍弃为零,这与有符号整数除法不同。 经过几分钟的思考,得出了第一手的解决方案。该解决方案在移位之前有条件地将负值转换为正值。在执行移位操作后,值将有条件地转换回其负数形式。 int a = -5; int n = 1; int negative = q < 0; a = negative ? -a : a; a >>= n; a = negative ? -a : a; 该解决方案的问题在于,通常将条件赋值语句转换为至少一个跳转指令,并且在不对两个指令路径都进行解码的处理器上,跳转指令可能会非常昂贵。必须两次重新灌注指令流水线才能很好地降低通过分频获得的任何性能提升。 综上所述,我在周六醒来,回答了条件分配问题。我们在执行算术移位运算时遇到的舍入问题仅在使用二进制补码表示形式时发生。它不会以补码表示出现。该问题的解决方案包括在执行移位操作之前将二进制补码值转换为一个二进制补码值。然后,我们必须将一个人的补码值转换回一个两个人的补码值。令人惊讶的是,我们可以执行这组操作,而无需在执行移位操作之前有条件地转换负值。 int a = -5; int n = 1; register int sign …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.