我必须在C中创建一个操作字符串的短程序,但我总是遇到一些奇怪的指针错误.虽然K&R是语言的一个很好的参考,当我感到困惑时,我经常会看到它已经假定你是一个适当的程序员.
教我们编程的讲师说好的程序员在这些东西上做了很好的图表,但我不知道怎么做.你能推荐一本好书或讲座吗?
谢谢,我会感谢我得到的每一个答案.
我首先回应了在纸上绘制它们的建议然后,如果您觉得有必要,可以在代码中包含它们的ascii版本.
我通常使用这三种格式:
推理记忆:
+--------+ 0 | | <- start +--------+ 1 | | <- q scans from start to end +--------+ ~ ..... ~ +--------+ | | <- end +--------+ \ | | | +--------+ |__ rest of the ~ ..... ~ | allocated memory n | | | +--------+ /
推理字符串:
0 n +--+-- --+--+--+--+ | | ... | | |\0| +--+- --+--+--+--+ ^ ^__ q moves from the | end to the start p moves from start to the end
推理单词中的位:
xxxx yyzz 00tt 11ss \ \ \ \ \ \ \__ storage registry \ \ \ \ \ \___ always set to 1 \ \ \ \ \_____ temp value \ \ \ \______ always zeroed \ \ \________ zero flag value \ \_________ y register \_____________ x address
我过去常常为有限状态机做类似的事情但是它们往往过于复杂(而且耗时很长)所以我现在直接将graphviz代码嵌入到注释中.即使不了解GraphViz,也应该很容易猜到如何绘制FSM图.
digraph G { mode = hier LIMBO [style= filled]; node [shape = ellipse]; LIMBO -> HEADER ; HEADER -> LIMBO; HEADER -> TUNE ; TUNE -> LYRICS ; TUNE -> CHORD [style=dashed ]; TUNE -> LIMBO ; GRACE -> TUNE ; GRACE -> CHORD [style=dashed ] ; SYMBOLS -> TUNE ; SYMBOLS -> LIMBO ; overlap=false sep = 1.5 }
这些涵盖了我需要的绝大多数图表.对于更复杂的,我使用GraphViz或OpenOffice Draw.
我曾经做过的最有用的事情之一是我的应用程序绘制图表...
在具有专门针对作业的复杂数据结构的应用程序中(标准散列表在那种情况下没有;-)我的应用程序输出了一个".dot"脚本,graphviz的点工具可以解析.
它通过使用转储例程(好的,方法,它是C++)来输出.dot标头
digraph g {
然后走了我的数据结构,然后写了页脚
}
在结构walk中,它用每个指针编写
SOURCE -> DESTINATION
其中Source是使用O(O213435354)预先填充的引用对象的内存地址,而Destination是以相同格式指向的对象.
在每个对象的开头它也写了
SOURCE [ .... ]
与...作为对象数据.
每当应用程序处于"有趣"状态时,我都会转储图形,然后使用graphviz中的点工具对其进行可视化.我很容易发现很多指针错误,眼睛是为了看到线条中的常规结构......
顺便说一句,我仍然可以正常使用graphviz,因为使用文本编辑器编写和编辑图表非常好,然后让工具对它们进行视觉化.如果我需要为一个受到电影浪潮破坏的观众打扮.dot图表,我将它们加载到Mac上的OmniGraffle中.(而且我的PC使用同事认为我有一些图表超级英雄的权力,因为使用这种组合我生成的图表比他们使用Visio时快10倍)
优秀的程序员不会制作"漂亮"的图表 - 他们会制作满足其目的的邋,难以辨认的图表.只需在任何可用的表面上涂抹您需要的东西.而且对于绘制"正确"的形状并不感兴趣 - 我的前同事曾经说过,如果你不能在fag的背面绘制图表,那么图表方法就不值得了.英国人)包.