我在哪里可以找到一些关于在C中编写可扩展,模块化,松散耦合代码的良好,经过验证的指南或示例(如果可能)?
我们的问题的背景是我们正在为具有有限计算和内存资源的低成本微控制器维护大型纯C,遗留代码项目.由于系统必须非常可靠并且存储器相当有限,因此第一个约束之一是根本不使用动态存储器分配.所有结构都是静态映射的.
因此,我们正在寻找使这些代码更易于维护和更加模块化的方法.我们对编码标准不感兴趣,而是设计建议.我们有良好的编码约定(命名,组织代码,SVN),所以这不是问题.
从我在网上看到的(我可能是错的)来看,似乎大多数只在普通C或汇编程序中编程的程序员,至少在uC/Embedded社区中,都禁止使用任何更简单的程序编程.
例如,我们可以使用回调函数,包含函数指针和类似东西的结构(它不需要动态分配,只需要传递指向结构的指针)来获得大部分OOP优势并在纯C中解耦,但我们希望看到如果已经有一些经过验证的方法.
您是否知道这些资源,或者除了 "为什么不切换到C++或其他编程语言" 之外还有类似的建议?
[编辑]
非常感谢所有答案,我还没来得及检查它们.平台是16位(XC166或类似)uC,裸hw(无RTOS).
为什么在Visual Studio WinForms设计器中我不能将我的表单大小增加到我目前正在处理的屏幕分辨率之上?我认为应该以某种方式开发一种针对较低分辨率系统的更高分辨率的应用程序.这将在调试期间剪切窗体这一事实应该不是问题.在Visual Studio中是否可能有一些设置,我似乎找不到?
编辑:我的主要问题是我需要能够在具有(例如)1360x768屏幕的笔记本电脑上设计(例如)1440x900大小的表格.
我有一个对象列表
class Answer
{
bool correct;
}
List<Answer> Answers = new List<Answer>();
Run Code Online (Sandbox Code Playgroud)
在linq中是否有办法根据其属性选择对象?
到目前为止我有
Answer answer = Answers.Single(a => a == a.Correct);
Run Code Online (Sandbox Code Playgroud)
但它不起作用
==
和Equals()
示例有什么区别?我知道==
用于比较运算符和Equals()
方法用于比较string的内容.所以我试过
// first example
string s1 = "a";
string s2 = "a";
Console.Write(a.Equals(s2)); // returns true, but if I assign "b" to s2,
// then result will be false
// second example
string s1 ="a";
string s2 ="a";
Console.Write(s1 == s2); // returns true
Run Code Online (Sandbox Code Playgroud)
怎么会这样?两者都是不同的对象引用.假设我们认为这些是参考.但我试着这样使用
string s1 = new string("ab");
string s2 = new string("ab");
Run Code Online (Sandbox Code Playgroud)
我收到编译时错误,无法将字符串转换为char
我在Visual Studio 2008中调试(web)项目.我正在打破一个断点.正如预期的那样,F10继续到下一行,但是下一个F10只是停止调试,代码继续而没有任何调试(比如按F5).为什么会这样?
有线索吗?
我创建了一个连接到sql 2005服务器的c#应用程序(不是asp网页).在我的源代码中,此sql-server的密码和用户标识是ConnectionString中的纯文本编码.
SqlConnection con = new SqlConnection();
con.ConnectionString =
"Data Source=server1;"+
"Initial Catalog=mydatabase;"+
"Integrated Security=no;"+
"User ID=admin;Password=mypassword;";
con.Open();
Run Code Online (Sandbox Code Playgroud)
有没有一种简单的方法来加密密码或整个连接字符串,反汇编我的工具的其他人无法看到密码?
谢谢
我正在查看一些C源代码,我不明白以下部分
#if 1
typedef unsigned short PronId;
typedef unsigned short LMId;
# define LM_NGRAM_INT
#else
typedef unsigned int LMId;
typedef unsigned int PronId;
# undef LM_NGRAM_INT
#endif
Run Code Online (Sandbox Code Playgroud)
有人会这样做#if 1
吗?难道只有第一个块会被处理吗?
我正在使用XmlSerializer并在类中具有以下属性
public string Data { get; set; }
Run Code Online (Sandbox Code Playgroud)
我需要输出完全如此
<Data />
Run Code Online (Sandbox Code Playgroud)
我将如何实现这一目标?
打印以下程序
A:C(A,B)
B:C(A,B)
Run Code Online (Sandbox Code Playgroud)
(正如它应该)
public interface I
{
string A();
}
public class C : I
{
public string A()
{
return "A";
}
public string B()
{
return "B";
}
}
public class A
{
public virtual void Print(C c)
{
Console.WriteLine("A:C(" + c.A() + "," + c.B() + ")");
}
}
public class B : A
{
public new void Print(C c)
{
Console.WriteLine("B:C(" + c.A() + "," + c.B() + ")");
}
public void Print(I i)
{ …
Run Code Online (Sandbox Code Playgroud) 这是我的班级:
public class Command
{
[XmlArray(IsNullable = true)]
public List<Parameter> To { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当我序列化这个类的对象时:
var s = new XmlSerializer(typeof(Command));
s.Serialize(Console.Out, new Command());
Run Code Online (Sandbox Code Playgroud)
它按预期打印(省略xml标头和默认MS名称空间):
<Command><To xsi:nil="true" /></Command>
Run Code Online (Sandbox Code Playgroud)
当我拿这个xml并试图反序列化它时我被卡住了,因为它总是打印"Not null":
var t = s.Deserialize(...);
if (t.To == null)
Console.WriteLine("Null");
else
Console.WriteLine("Not null");
Run Code Online (Sandbox Code Playgroud)
如果强制反序列化器使我的列表为null,如果它在xml中为null?
c# ×7
arrays ×1
breakpoints ×1
c ×1
coding-style ×1
debugging ×1
embedded ×1
encryption ×1
equals ×1
inheritance ×1
linq ×1
nullable ×1
sql ×1
string ×1
winforms ×1
xml ×1