我必须在C中创建一个操作字符串的短程序,但我总是遇到一些奇怪的指针错误。虽然K& R是语言的一个很好的参考,当我感到困惑时,我经常会看到它已经假定你是一个适当的程序员。
教我们编程的讲师说好的程序员在这些东西上做了很好的图表,但我不知道怎么做。你能推荐一本好书或讲座吗?
谢谢,我会感谢我得到的每一个答案。
答案 0 :(得分:10)
我首先回应在纸上绘制它们的建议然后,如果您觉得有需要,可以在代码中包含它们的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。
答案 1 :(得分:8)
我曾经做过的最有用的事情之一是我的应用程序绘制图表......
在具有专门针对作业的复杂数据结构的应用程序中(标准哈希表在那种情况下没有;-)我的应用程序输出了一个“.dot”脚本,graphviz的点工具可以解析。
它通过输出.dot标头的转储例程(好的,方法,它是C ++)来实现这一点
digraph g {
然后走了我的数据结构然后写了页脚
}
在结构walk中,它用
写了每个指针 SOURCE -> DESTINATION
其中Source是以O(O213435354)预先填充的引用对象的内存地址,而Destination是以相同格式指向的对象。
在每个对象的开头它也写了
SOURCE [ .... ]
用...作为对象数据。
每当应用程序处于“有趣”状态时,我会转储图形,然后使用graphviz中的点工具对其进行可视化。我已经很容易地找到了很多指针错误,眼睛的构建是为了看到行中的常规结构...
顺便说一句,我仍然会定期使用graphviz,因为编写&amp;使用文本编辑器编辑图形,然后让工具对它们进行可视化。如果我需要为一个受到电影节点破坏的观众打扮.dot图表,我将它们加载到我的Mac上的OmniGraffle。 (而且我的PC使用同事认为我有一些图表超级英雄的能力,因为使用这种组合我生成的图表比他们使用Visio时快10倍)
答案 2 :(得分:7)
优秀的程序员不会制作“漂亮”的图表 - 他们会制作出符合其目的的邋,难以辨认的图表。只需在任何可用表面上涂抹您需要的东西。而且对于绘制“正确”的形状并不感兴趣 - 我的前同事曾经说过,如果你不能在fag的背面绘制图表,那么图表方法就不值得了。英国人)包。
答案 3 :(得分:2)
C的典型内存模型是内存是一组框;每个盒子宽1个字节。每个方框都有一个十六进制的地址。指针是一个包含地址的变量。
关于书籍/讲座,您正在寻找基本的计算机组织和架构书。
我用过这三本书;我通过“降低可理解性”来命令它们。经典是Patterson和Hennessy的最后一个,但我觉得它最不可读。 YMMV。
答案 4 :(得分:1)
您是否要求使用工具来绘制图表,或图表应代表什么?我建议你只需要用一张纸和一支铅笔来做任何你自己试图理解的事情;你不需要任何花哨的工具。
如果你想知道指针是如何工作的,以及这些图是什么意思,我在Googling之后发现this handout看起来它可能是一个不错的教程。
答案 5 :(得分:1)
您可能希望看到Gustave Duartes'blog。在他的帖子中,他经常绘制记忆图等。他使用Visio来实现这个目标,我发现结果非常整洁。
答案 6 :(得分:1)
没有多少工具能够描绘出教授所指的记忆地图风格。
他试图表达的想法是,当你是C语言的初学者时,指针和数组的使用会让你感到困惑。什么针对什么?这两个指针是否指向同一个东西?每个索引所指的字符串数组的哪些单元格等等?
有经验的程序员对此有一种心理形象。有了经验,你也一样。在那之前,我们的想法是你可以在纸上画一些东西来理解这些东西,而不是把它全部放在脑子里。
我同意K&amp; R不是教科书,因此没有这些视觉材料。
中查看这些图表的示例答案 7 :(得分:1)
如果你希望你的图表看起来不错,可以使用一块方形(四边形而不是图形)纸和一支不错的铅笔*。也可用于表示存储器单元,字符串中的字母等。如果你想同时保持臀部和方形,你甚至可以获得quadrille moleskines。
***我喜欢uni shalaku dx 0.5因为它有侧面的进纸按钮所以你不必移动你的手柄以获得更多的领先优势。
答案 8 :(得分:1)
一种简单的方法是将记忆画成一个巨大的“阶梯”。 梯子中的每个框表示内存中的一个地址。在框中键入数据,然后在其旁边键入地址。 像这样:
http://cosketch.com/Saved/pe6sHGD0
还要了解调试器的工作原理,它通常可以显示指针,变量等的内容。
答案 9 :(得分:1)
这只适用于那些熟悉机器内部的人,但我使用的技巧是在我的图表中写一个“假的”内存地址,使其看起来真实。我的意思是:
.------.
A | 3FFC |
'------'
.------.
B | 7 |
'------'
猜猜哪个变量有指针,哪个变量有值? 实际上,我通常会在B的框下面(或上面)写下地址来显示它的位置。 然后,我将构成另一个(非常不同的)假数字,以表明A也位于某个地方。刚开始时这很有用。后来,你习惯了所有这些指针。
答案 10 :(得分:1)
可视化问题的最佳方法是调试代码。并专注于你的变量。 它不仅可以为您提供有关代码的深入视图,还可以让您绘制代码的精确图表,您的讲师会对您说。