【问题标题】:How do you make diagrams of memory and data structures?你如何制作内存和数据结构的图表?
【发布时间】:2009-03-29 16:36:59
【问题描述】:

我必须用 C 语言创建一个处理字符串的短程序,但我总是遇到一些奇怪的指针错误。虽然 K&R 是该语言的一个很好的参考,当我感到困惑时,我经常看它,它已经假设你是一个合格的程序员。

教我们编程的讲师说,优秀的程序员会在这些东西上画出漂亮的图表,但我不知道该怎么做。你能推荐一本关于这方面的好书或讲座吗?

谢谢,我会感谢我得到的每一个答案。

【问题讨论】:

  • 注意:我不是要演示工具。我正在寻求一种方法来更好地想象内存和数据结构并为自己跟踪它们(这样我就可以知道我在做什么,而不是输入随机的东西并调整它们直到它们以某种方式工作)。谢谢。

标签: c memory diagram


【解决方案1】:

我同意先在纸上绘制它们的建议,然后,如果您觉得有需要,可以将它们的 ascii 版本包含到代码中。

我通常使用这三种格式:


推理记忆:

+--------+ 0 | |

推理字符串:

0 n +--+-- --+--+--+--+ | | ... | | |\0| +--+- --+--+--+--+ ^ ^__ q 从 |从头到尾 p 从 从头到尾

推理单词中的位:

xxxx yyzz 00tt 11ss \ \ \ \ \ \ \__ 存储注册表 \ \ \ \ \ \___ 始终设置为 1 \ \ \ \ \____温度值 \ \ \ \______ 始终归零 \ \ \________ 零标志值 \ \_________ 你注册 \_____________ x 地址

我以前也为有限状态机做过类似的事情,但它们往往过于复杂(而且做起来很耗时),所以我现在直接将 graphviz 代码嵌入到注释中。即使不了解 GraphViz,也应该很容易猜到如何绘制 FSM 图。

有向图 G { 模式 = 等级 LIMBO [样式=填充]; 节点[形状=椭圆]; LIMBO -> 标题; 标题-> LIMBO; 标题 -> 调谐; 曲调->歌词; TUNE -> CHORD [style=dashed ]; TUNE -> LIMBO ; 恩典->调; 恩典->和弦[风格=破折号]; 符号 -> 曲调; 符号 -> LIMBO ; 重叠=假 九月 = 1.5 }

这些涵盖了我需要的绝大多数图表。对于更复杂的,我使用 GraphViz 或 OpenOffice Draw。

【讨论】:

    【解决方案2】:

    我曾经做过的最有用的事情之一就是我的应用程序绘制图形...

    在具有专门用于该工作的复杂数据结构的应用程序中(标准哈希表在这种情况下没有做;-) 我让我的应用程序输出一个“.dot”脚本,graphviz 的点工具可以解析。

    它通过一个输出 .dot 标头的转储例程(好吧,方法,它是 C++)来做到这一点

     digraph g {
    

    然后遍历我的数据结构,然后写页脚

     }
    

    在结构 walk 中,它写了每个指针

     SOURCE -> DESTINATION
    

    其中 Source 是以 O (O213435354) 开头的引用对象的内存地址,Destination 是以相同格式指向的对象。

    在每个对象的开头它也写了

    SOURCE [ .... ]  
    

    其中 ... 是对象数据。

    每当应用程序处于“有趣”状态时,我都会转储图形,然后使用 graphviz 中的点工具将其可视化。这样我就很容易发现很多指针错误,眼睛是用来查看规则结构的...

    顺便说一句,我仍然经常使用graphviz,因为使用文本编辑器编写和编辑图形并让工具随后将它们可视化是非常好的。如果我需要为被 powerpoint 宠坏的观众修饰 .dot 图表,我会将它们加载到我的 Mac 上的 OmniGraffle 中。 (而且我使用 PC 的同事认为我有一些绘制图表的超级英雄能力,因为通过这种组合,我生成图表的速度比他们使用 Visio 时快 10 倍)

    【讨论】:

    • 感谢您的回复,Graphviz 看起来很酷,但我担心它对于我的需求来说有点太高级了。当我开始做更大的事情时,我一定会再看一遍。
    【解决方案3】:

    优秀的程序员不会制作“漂亮”的图表——他们会制作邋遢、难以辨认的图表来满足他们的目的。只需在任何可用的表面上写下您需要的内容。不要担心画出“正确”的形状——我的一位前同事曾经说过,如果你不能在一根烟的背面画出图表,那么图表方法就不值得了(香烟对于非英国人)数据包。

    【讨论】:

    • 您好,感谢您的回复。我同意你的观点。你能举个图表方法的例子吗?
    【解决方案4】:

    C 的典型记忆模型是记忆是一组盒子;每个框为 1 字节宽。每个盒子都有一个十六进制地址。指针是一个包含地址的变量。

    关于书籍/讲座,您正在寻找一本基本的计算机组织和架构书籍。

    我用过这三本书;我通过“降低可理解性”来订购它们。经典是帕特森和轩尼诗的最后一部,但我觉得它的可读性最低。 YMMV。

    http://www.amazon.com/Introduction-Computing-Systems-gates-beyond/dp/0072467509/ref=sr_1_1?ie=UTF8&s=books&qid=1238345302&sr=1-1

    http://www.amazon.com/Digital-Design-Computer-Architecture-Harris/dp/0123704979/ref=sr_1_6?ie=UTF8&s=books&qid=1238345245&sr=1-6

    http://www.amazon.com/Computer-Organization-Design-Fourth-Architecture/dp/0123744938/ref=sr_1_3?ie=UTF8&s=books&qid=1238345245&sr=1-3

    【讨论】:

      【解决方案5】:

      您是否需要工具来帮助绘制图表,或者图表应该代表什么?我建议您只使用一张纸和铅笔来做任何事情,以尝试自己理解这一点;你不需要任何花哨的工具。

      如果您想了解指针的工作原理以及图表的含义,我在谷歌搜索后找到了this handout,看起来这可能是一个不错的教程。

      【讨论】:

      • 您好,感谢您的快速回复。我在问图表应该代表什么。讲义看起来很不错。
      【解决方案6】:

      一种简单的方法是将内存绘制成一个巨大的“阶梯”。 梯形图中的每个框代表内存中的一个地址。在框中键入数据,然后在其旁边键入地址。 像这样的:

      http://cosketch.com/Saved/pe6sHGD0

      还可以了解调试器的工作原理,它通常可以向您显示指针、变量等的内容。

      【讨论】:

      • 感谢您的回复。顺便说一句,cosketch 很棒!
      【解决方案7】:

      这仅适用于那些熟悉机器内部的人,但我使用的一个技巧是在我的图表中写入一个“假”内存地址以使其看起来更真实。我的意思是:

          .------.
       A  | 3FFC |
          '------'
          .------.
       B  |    7 |
          '------'
      

      猜猜哪个变量有指针,哪个有值? 实际上,我通常会在 B 的框下方(或上方)写下地址以显示它在哪里。 然后,我将编造另一个(非常不同的)假数字来表明 A 也位于某个地方。这在您刚开始时很有帮助。以后,你会习惯所有这些指针的东西。

      【讨论】:

        【解决方案8】:

        如果您希望图表看起来不错,请使用一块方格纸(方形纸而不是图形)和一支像样的铅笔*。也可用于表示记忆单元、字符串中的字母等。如果你想同时保持臀部和方形,你甚至可以得到四边形鼹鼠。

        *** 我喜欢 uni shalaku dx 0.5,因为它的侧边有进纸器按钮,所以你不必移动你的抓地力来获得更多的领先优势。

        【讨论】:

          【解决方案9】:

          可视化问题的最佳方法是调试代码。并专注于你的变量。 它不仅可以让您深入了解您的代码,还可以让您绘制出您的讲师告诉您的代码的精确图表。

          【讨论】:

            【解决方案10】:

            您可能想查看 Gustave Duartes 的blog。在他的帖子中,他经常绘制记忆图等。他为此使用 Visio,而我发现结果非常整洁。

            【讨论】:

            • 感谢您的回复。生病检查 Visio 和它的文档,即使我怀疑我是否可以使用它。我希望自己做笔记和图表,而不是作为演示文稿。我还是会看的..
            【解决方案11】:

            没有多少工具可以绘制您教授所指的内存映射样式。

            他试图传达的想法是,当您是 C 语言的初级开发人员时,指针和数组的使用会让您很困惑。目的是什么?这两个指针指向同一个东西吗?每个索引引用的字符串数组的哪些单元格等?

            经验丰富的程序员对此有一个心理印象。有经验,你也会。在那之前,我们的想法是,您可以在纸上实际画出一些东西来理解这些东西,而不是全都在脑海中。

            我同意 K&R 并不是一本教科书,因此没有这些视觉效果。

            您可以在slides that I've made for a C tutorial 中查看这些图表的示例

            【讨论】:

            • 感谢您的回复,我也认为他试图传达这一点,但他声称他认识的更好的程序员仍然会制作一些图表..
            • 作为程序员,我们确实制作了很多图表,但是系统的整体结构(例如,调用图、模块依赖关系、架构)。
            • 嗯,你能提供一些关于这方面的一般性提示吗?或者它对每个程序员的不同之处?
            猜你喜欢
            • 1970-01-01
            • 2010-10-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-05-11
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多