Как вы делаете диаграммы памяти и структуры данных? - PullRequest
7 голосов
/ 29 марта 2009

Мне нужно создать короткую программу на C, которая манипулирует строками, но я всегда сталкиваюсь с некоторыми странными ошибками указателя. Хотя K & R - отличный справочник по языку, и я часто смотрю на него, когда я озадачен, он уже предполагает, что вы - адекватный программист.

Лектор, который преподает нам программирование, сказал, что хорошие программисты делают хорошие диаграммы на этих вещах, но я понятия не имею, как это сделать. Можете ли вы порекомендовать хорошую книгу или лекции по этому вопросу?

Спасибо, я буду благодарен за каждый полученный ответ.

Ответы [ 11 ]

10 голосов
/ 29 марта 2009

Я повторяю предложение сначала нарисовать их на бумаге, а затем, если вы чувствуете необходимость, вы можете включить их версию 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.

8 голосов
/ 29 марта 2009

Одна из самых полезных вещей, которые я когда-то делал, - рисование графиков моим приложением ...

В приложении, которое имело сложную структуру данных, специализированную для работы (стандартная хеш-таблица в этом случае не работала ;-) У меня было приложение, которое выводило скрипт ".dot", инструмент для точек graphviz мог разобрать.

Это было сделано с помощью процедуры дампа (хорошо, метод, это был C ++), который выводил заголовок .dot

 digraph g {

затем прошел мою структуру данных и написал нижний колонтитул

 }

В структуре прогулки он записал каждый указатель с

 SOURCE -> DESTINATION

где Source - это адрес памяти ссылающегося объекта, предварительно подготовленного с помощью O (O213435354), а Destination - это объект, на который указывает тот же формат.

В начале каждого объекта также написано

SOURCE [ .... ]  

с ... являющимися данными объекта.

Всякий раз, когда приложение находилось в «интересном» состоянии, я сбрасывал график и затем использовал точечный инструмент из graphviz для его визуализации. Таким образом, я довольно легко обнаружил множество ошибок указателя, глаз построен так, чтобы видеть правильные структуры в строках ...

Кстати, я до сих пор регулярно использую graphviz , так как довольно неплохо писать и редактировать графики с помощью текстового редактора, а затем инструмент визуализирует их. Если мне нужно нарядить графы .dot для избалованной аудитории, я загружаю их в OmniGraffle на моем Mac. (А мои коллеги, использующие ПК, думают, что у меня есть некоторые способности супергероев диаграмм, потому что с этой комбинацией я получаю графики в 10 раз быстрее, чем они, когда они используют Visio)

7 голосов
/ 29 марта 2009

Хорошие программисты не создают «хороших» диаграмм - они создают грязные, неразборчивые, которые служат их целям. Просто набросайте то, что вам нужно на любой доступной поверхности. И не беспокойтесь о том, чтобы рисовать «правильные» фигуры - мой бывший коллега однажды сказал, что методология построения диаграмм не стоит того, если вы не можете нарисовать диаграммы на задней стороне сигареты (сигарета для Великобритания люди) пакет.

2 голосов
/ 29 марта 2009

Типичная модель памяти для C состоит в том, что память представляет собой набор блоков; каждый блок имеет ширину 1 байт. Каждое поле имеет адрес в шестнадцатеричном формате. Указатель - это переменная с адресом.

Что касается книг / лекций, вы ищете базовую книгу по компьютерной организации и архитектуре.

Я использовал эти 3 книги; Я заказываю их, "уменьшая понятность". Классика - последняя Паттерсон и Хеннесси, но я считаю ее наименее читаемой. 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

1 голос
/ 29 марта 2009

лучший способ визуализировать вашу проблему - отладить ваш код. и сосредоточиться на вашей переменной. это не только даст вам представление о вашем коде, но и позволит вам составить точную диаграмму кода, которую вам сказал ваш лектор.

1 голос
/ 29 марта 2009

Это применимо только к тем, кто знаком с внутренностями машины, но я использую хитрость, чтобы написать «фальшивый» адрес памяти в моих диаграммах, чтобы он выглядел реалистично. Я имею в виду следующее:

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

Угадайте, какая переменная имеет указатель, а какая имеет значение? На самом деле, я обычно пишу адрес под (или более) буквой B, чтобы показать, где он находится. А потом я сделаю еще один (совсем другой) фальшивый номер, чтобы показать, что А тоже где-то находится. Это полезно, когда вы только начинаете. Позже вы привыкнете ко всему этому указателю.

1 голос
/ 29 марта 2009

Простой способ - нарисовать память одной огромной «лестницей». Каждая коробка на лестнице представляет один адрес в памяти. В поле вы вводите данные, а рядом с ним вы вводите адрес. Примерно так:

http://cosketch.com/Saved/pe6sHGD0

Также узнайте, как работает отладчик, он часто может показать вам содержимое указателей, переменных и т. Д.

1 голос
/ 29 марта 2009

Используйте блок бумаги в квадрате (кадриль, а не график) и приличный карандаш *, если вы хотите, чтобы ваши диаграммы выглядели хорошо. Также полезно для представления ячеек памяти, букв в строках и так далее. Вы даже можете получить кадриль молескинов, если хотите быть одновременно бедрами и квадратными.

*** Мне нравится uni shalaku dx 0.5, так как он имеет кнопку подачи по бокам, поэтому вам не нужно сдвигать ручку, чтобы получить больше свинца.

1 голос
/ 29 марта 2009

Существует не так много инструментов, которые бы рисовали карты памяти, на которые ссылается ваш профессор.

Идея, которую он пытается донести, заключается в том, что когда вы начинающий разработчик в C, использование указателей и массивов вас сильно смущает. Что на что направлено? Эти два указателя указывают на одно и то же? На какие ячейки массива строк ссылается каждый индекс и т. Д.?

Опытные программисты имеют представление об этом. С опытом, вы тоже. До тех пор идея заключается в том, что вы могли бы физически нарисовать что-то на бумаге, чтобы понять эти вещи, а не иметь все это в своей голове.

Я согласен с тем, что K & R не предназначен для использования в качестве учебника и поэтому не имеет таких визуальных элементов.

Вы можете увидеть пример этих диаграмм в слайдах, которые я сделал для учебника по C

1 голос
/ 29 марта 2009

Возможно, вы захотите посмотреть блог Gustave Duartes . В своих постах он часто рисует диаграммы памяти и тому подобное. Он использует Visio для этого, и я, например, нахожу результаты довольно опрятными.

...