7

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

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

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

4

11 回答 11

11

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

我通常使用这三种格式:


推理记忆:

      +--------+
   0 | | <-开始
      +--------+
   1 | | <- q 从头到尾扫描
      +--------+
      ~~~~~
      +--------+
      | | <-结束
      +--------+ \
      | | |
      +--------+ |__ 其余的
      ~ ..... ~ | 分配的内存
  n | | |
      +--------+ /


推理字符串:

    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。

于 2009-03-29T17:51:28.753 回答
8

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

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

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

 digraph g {

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

 }

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

 SOURCE -> DESTINATION

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

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

SOURCE [ .... ]  

其中 ... 是对象数据。

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

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

于 2009-03-29T17:07:36.987 回答
7

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

于 2009-03-29T16:47:24.943 回答
2

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

于 2009-03-29T16:50:34.903 回答
1

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

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

于 2009-03-29T16:41:57.017 回答
1

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

于 2009-03-29T16:47:26.317 回答
1

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

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

有经验的程序员对此有一个心理印象。有经验,你也会。在那之前,你的想法是你可以在纸上画一些东西来理解这些东西,而不是把它们全都放在你的脑海里。

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

您可以在我为 C 教程制作的幻灯片中看到这些图表的示例

于 2009-03-29T16:48:14.457 回答
1

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

*** 我喜欢 uni shalaku dx 0.5,因为它的侧面有进纸器按钮,因此您无需移动手柄即可获得更多铅。

于 2009-03-29T17:26:40.667 回答
1

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

http://cosketch.com/Saved/pe6sHGD0

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

于 2009-03-29T17:37:24.217 回答
1

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

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

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

于 2009-03-29T18:12:53.757 回答
1

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

于 2009-03-29T18:43:17.380 回答