snp-lab-code/build/html/P04_Modularisieren_von_C_Code/README.html

555 lines
37 KiB
HTML
Raw Normal View History

2022-02-17 14:51:10 +01:00
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
2022-03-01 14:30:52 +01:00
<meta content="metadata description" lang="en" name="description" xml:lang="en" />
<meta content="description des métadonnées" lang="fr" name="description" xml:lang="fr" />
<meta content="Sphinx, MyST" name="keywords" />
<meta content="en_US" property="og:locale" />
2022-02-17 14:51:10 +01:00
<title>04 - Modularisieren von C Code &#8212; SNP Labs documentation</title>
<link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
<link rel="stylesheet" type="text/css" href="../_static/alabaster.css" />
<script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script>
<script src="../_static/doctools.js"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
<link rel="stylesheet" href="../_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<section class="tex2jax_ignore mathjax_ignore" id="modularisieren-von-c-code">
<h1>04 - Modularisieren von C Code<a class="headerlink" href="#modularisieren-von-c-code" title="Permalink to this headline"></a></h1>
<figure class="align-right" id="logo">
<a class="reference internal image-reference" href="P04_Modularisieren_von_C_Code/zhaw_neg_P2945.jpg"><img alt="P04_Modularisieren_von_C_Code/zhaw_neg_P2945.jpg" src="P04_Modularisieren_von_C_Code/zhaw_neg_P2945.jpg" style="width: 100px;" /></a>
</figure>
<hr class="docutils" />
<figure class="align-center" id="logo">
<a class="reference internal image-reference" href="../_images/modularisieren_von_c_code.JPG"><img alt="../_images/modularisieren_von_c_code.JPG" src="../_images/modularisieren_von_c_code.JPG" style="width: 500px;" /></a>
</figure>
<hr class="docutils" />
<section id="inhalt">
<h2>Inhalt<a class="headerlink" href="#inhalt" title="Permalink to this headline"></a></h2>
<p><a class="reference internal" href="#introduction"><span class="std std-ref">1. Übersicht</span></a></p>
<p><a class="reference internal" href="#learning-objectives"><span class="std std-ref">2. Lernziele</span></a></p>
<p><a class="reference internal" href="#task-01"><span class="std std-ref">3. Aufgabe 1: Modularisieren</span></a></p>
<p><a class="reference internal" href="#task-02"><span class="std std-ref">4. Aufgabe 2: Makefile Regeln</span></a></p>
<p><a class="reference internal" href="#grading"><span class="std std-ref">5. Bewertung</span></a></p>
<p><a class="reference internal" href="#appendix"><span class="std std-ref">6. Anhang</span></a></p>
<hr class="docutils" />
</section>
<section id="ubersicht">
<span id="introduction"></span><h2>1. Übersicht<a class="headerlink" href="#ubersicht" title="Permalink to this headline"></a></h2>
<p>In diesem Praktikum üben Sie modulare Programmierung indem Sie ein
Java Programm (bestehend aus drei Java Files) in ein entsprechendes C
Programm aus drei Modulen (aus je einem Header- und Implementations-
File) übersetzen. Sie passen das Makefile so an, dass die
entsprechenden Module mit kompiliert werden.</p>
<p>In der zweiten Aufgabe erstellen Sie Makefile Regeln für die drei
Schritte von den C Source Files zur graphischen Darstellung der
Abhängigkeiten.</p>
<figure class="align-center" id="uebersicht">
<a class="reference internal image-reference" href="../_images/uebersicht.png"><img alt="../_images/uebersicht.png" src="../_images/uebersicht.png" style="width: 500px;" /></a>
</figure>
<p>Im Anhang ist eine Übersicht über die verwendeten File Formate gegeben.</p>
</section>
<section id="lernziele">
<span id="learning-objectives"></span><h2>2. Lernziele<a class="headerlink" href="#lernziele" title="Permalink to this headline"></a></h2>
<p>In diesem Praktikum lernen Sie die Handgriffe um ein Programm zu modularisieren, d.h. in mehrere Module aufzuteilen.</p>
<ul class="simple">
<li><p>Sie wissen, dass ein Modul aus einem C-File und einem passenden
H-File besteht.</p></li>
<li><p>Sie können Header Files korrekt strukturieren.</p></li>
<li><p>Sie deklarieren im Header-File die öffentlichen Typen und Funktionen
eines Moduls.</p></li>
<li><p>Sie wissen wie <strong>Include Guards</strong> anzuwenden sind.</p></li>
<li><p>Sie können Module im <code class="docutils literal notranslate"><span class="pre">Makefile</span></code> zur Kompilation hinzufügen.</p></li>
<li><p>Sie können <code class="docutils literal notranslate"><span class="pre">Makefile</span></code> Regeln schreiben.</p></li>
</ul>
<p>Die Bewertung dieses Praktikums ist am Ende angegeben.</p>
<p>Erweitern Sie die vorgegebenen Code Gerüste, welche im <code class="docutils literal notranslate"><span class="pre">git</span></code>
Repository <code class="docutils literal notranslate"><span class="pre">snp-lab-code</span></code> verfügbar sind.</p>
</section>
<section id="aufgabe-1-modularisieren">
<span id="task-01"></span><h2>3. Aufgabe 1: Modularisieren<a class="headerlink" href="#aufgabe-1-modularisieren" title="Permalink to this headline"></a></h2>
<p>Das zu ergänzende Programm dep2dot hat folgende Funktionalität:</p>
<p>Ergänzen Sie in <strong><code class="docutils literal notranslate"><span class="pre">modularize/src</span></code></strong> den Code in <strong><code class="docutils literal notranslate"><span class="pre">triangle.c</span></code></strong>,
<strong><code class="docutils literal notranslate"><span class="pre">read.h</span></code></strong>, <strong><code class="docutils literal notranslate"><span class="pre">read.c</span></code></strong>, <strong><code class="docutils literal notranslate"><span class="pre">rectang.h</span></code></strong> und <strong><code class="docutils literal notranslate"><span class="pre">rectang.c</span></code></strong> so
dass die Tests erfolgreich durchlaufen. Die C Implementation soll
dieselbe Funktionalität haben wie die gegebenen Java Files. Lehnen Sie
sich so nahe wie möglich an die Java Files an.</p>
<ol class="arabic simple">
<li><p>In den Header-Files implementieren Sie den Include-Guard und
deklarieren Sie die öffentlichen Funktionen und gegebenenfalls
<strong><code class="docutils literal notranslate"><span class="pre">#define</span></code></strong>.</p></li>
<li><p>In den Implementations-Files implementieren Sie die Funktionen.</p></li>
</ol>
<p>Die drei Java Files liegen in <strong><code class="docutils literal notranslate"><span class="pre">modularize/java</span></code></strong>.</p>
<section id="tipps">
<h3>Tipps<a class="headerlink" href="#tipps" title="Permalink to this headline"></a></h3>
<ul class="simple">
<li><p>Implementieren Sie die Symbole welche vollständig in Grossbuchstaben
geschrieben sind als <strong><code class="docutils literal notranslate"><span class="pre">#define</span></code></strong>.</p></li>
<li><p><strong><code class="docutils literal notranslate"><span class="pre">EOF</span></code></strong> kommt schon aus <strong><code class="docutils literal notranslate"><span class="pre">stdio.h</span></code></strong> und sollte deshalb nicht
mehr definiert werden.</p></li>
<li><p>Jene <strong><code class="docutils literal notranslate"><span class="pre">#define</span></code></strong> welche von andern Modulen verwendet werden
kommen ins Header-File, die andern ins Implementations-File.</p></li>
<li><p>Ein Grossteil des Java Codes aus den Methoden Bodies kann
eins-zu-eins in C übernommen werden. Listen Sie auf welche
Unterschiede es gibt:</p></li>
</ul>
<table>
<style>
table, th, td {
border: 1px solid black;
border-collapse: collapse;
}
table th:first-of-type {
width: 50%;
}
table th:nth-of-type(2) {
width: 50%;
}
</style>
<tr><th>Java</th><th>C</th></tr>
<tr><td>
<div class="highlight-Java notranslate"><div class="highlight"><pre><span></span><span class="kt">byte</span>
</pre></div>
</div>
</td><td></td></tr>
<tr><td>
<div class="highlight-Java notranslate"><div class="highlight"><pre><span></span><span class="kt">boolean</span>
</pre></div>
</div>
</td><td></td></tr>
<tr><td>
<div class="highlight-Java notranslate"><div class="highlight"><pre><span></span><span class="kc">true</span>
</pre></div>
</div>
</td><td></td></tr>
<tr><td>
<div class="highlight-Java notranslate"><div class="highlight"><pre><span></span><span class="kc">false</span>
</pre></div>
</div>
</td><td></td></tr>
<tr><td>
<div class="highlight-Java notranslate"><div class="highlight"><pre><span></span>System.out.print(…)
</pre></div>
</div>
</td><td></td></tr>
<tr><td>
<div class="highlight-Java notranslate"><div class="highlight"><pre><span></span>System.out.println(…)
</pre></div>
</div>
</td><td></td></tr>
<tr><td>
<div class="highlight-Java notranslate"><div class="highlight"><pre><span></span><span class="n">System</span><span class="p">.</span><span class="na">in</span><span class="p">.</span><span class="na">read</span><span class="p">()</span>
</pre></div>
</div>
</td><td></td></tr>
<tr><td>
<div class="highlight-Java notranslate"><div class="highlight"><pre><span></span><span class="kt">byte</span><span class="o">[]</span> <span class="n">buffer</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">byte</span><span class="o">[</span><span class="n">BUFFERSIZE</span><span class="o">]</span><span class="p">;</span>
</pre></div>
</div>
</td><td></td></tr>
<tr><td>
<div class="highlight-Java notranslate"><div class="highlight"><pre><span></span>public class rectang {
public boolean Rectangular(…)
{ … }
}
</pre></div>
</div>
</td><td></td></tr>
<tr><td>
<div class="highlight-Java notranslate"><div class="highlight"><pre><span></span><span class="kd">public</span> <span class="kd">class</span> <span class="nc">read</span> <span class="p">{</span>
<span class="kd">public</span> <span class="kt">int</span> <span class="nf">getInt</span><span class="p">(...)</span>
<span class="kd">throws</span> <span class="n">java</span><span class="p">.</span><span class="na">io</span><span class="p">.</span><span class="na">IOException</span>
<span class="p">{</span> <span class="p">...</span> <span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
</td><td></td></tr>
<tr><td>
<div class="highlight-Java notranslate"><div class="highlight"><pre><span></span><span class="kd">class</span> <span class="nc">triangle</span> <span class="p">{</span>
<span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="p">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="p">)</span>
<span class="kd">throws</span> <span class="n">java</span><span class="p">.</span><span class="na">io</span><span class="p">.</span><span class="na">IOException</span>
<span class="p">{</span> <span class="p">...</span> <span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
</td><td></td></tr>
<tr><td>
<div class="highlight-Java notranslate"><div class="highlight"><pre><span></span><span class="n">read</span> <span class="n">ReadInt</span> <span class="o">=</span> <span class="k">new</span> <span class="n">read</span><span class="p">();</span>
<span class="p">...</span>
<span class="n">word</span> <span class="o">=</span> <span class="n">ReadInt</span><span class="p">.</span><span class="na">getInt</span><span class="p">(</span><span class="n">MAX_NUMBER</span><span class="p">);</span>
</pre></div>
</div>
</td><td></td></tr>
<tr><td>
<div class="highlight-Java notranslate"><div class="highlight"><pre><span></span><span class="n">rectang</span> <span class="n">Rect</span> <span class="o">=</span> <span class="k">new</span> <span class="n">rectang</span><span class="p">();</span>
<span class="p">...</span>
<span class="k">if</span> <span class="p">(</span><span class="n">Rect</span><span class="p">.</span><span class="na">Rectangular</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">)</span> <span class="o">==</span> <span class="kc">true</span><span class="p">)</span> <span class="p">{</span> <span class="p">...</span> <span class="p">}</span>
</pre></div>
</div>
</td><td></td></tr>
<tr><td>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">System</span><span class="o">.</span><span class="n">out</span><span class="o">.</span><span class="n">println</span><span class="p">(</span>
<span class="s2">&quot;-&gt; Dreieck &quot;</span> <span class="o">+</span> <span class="n">a</span> <span class="o">+</span> <span class="s2">&quot;-&quot;</span> <span class="o">+</span> <span class="n">b</span> <span class="o">+</span> <span class="s2">&quot;-&quot;</span> <span class="o">+</span> <span class="n">c</span>
<span class="o">+</span> <span class="s2">&quot; ist rechtwinklig&quot;</span><span class="p">);</span>
</pre></div>
</div>
</td><td></td></tr>
</table>
</section>
</section>
<section id="aufgabe-2-makefile-regeln">
<span id="task-02"></span><h2>4. Aufgabe 2: Makefile Regeln<a class="headerlink" href="#aufgabe-2-makefile-regeln" title="Permalink to this headline"></a></h2>
<p>Die folgenden drei Schritte erstellen von einem C Source File eine
graphische Darstellung der Abhängigkeiten:</p>
<ol class="arabic simple">
<li><p><code class="docutils literal notranslate"><span class="pre">gcc</span> <span class="pre">...</span> <span class="pre">-H</span> <span class="pre">..</span> <span class="pre">file.c</span> <span class="pre">...</span> <span class="pre">2&gt;</span> <span class="pre">file.dep</span></code> (Regeln im Makefile bereits vorhanden)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">dep2dot</span> <span class="pre">file.c</span> <span class="pre">&lt;file.dep</span> <span class="pre">&gt;file.dot</span></code> (in dieser Aufgabe zu erstellen)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">dot</span> <span class="pre">-Tpng</span> <span class="pre">file.dot</span> <span class="pre">&gt;file.png</span></code> (in dieser Aufgabe zu erstellen)</p></li>
</ol>
<p>Sie sollen für die Compiler-ähnlichen Programme <code class="docutils literal notranslate"><span class="pre">dep2dot</span></code> und <code class="docutils literal notranslate"><span class="pre">dot</span></code>
Makefile Regeln schreiben.</p>
<figure class="align-center" id="uebersicht">
<a class="reference internal image-reference" href="../_images/uebersicht.png"><img alt="../_images/uebersicht.png" src="../_images/uebersicht.png" style="width: 500px;" /></a>
</figure>
<p>Das Programm <code class="docutils literal notranslate"><span class="pre">dep2dot</span></code> hat folgende Funktionalität:</p>
<ol class="arabic simple">
<li><p>Es liest von <code class="docutils literal notranslate"><span class="pre">stdin</span></code> die vom Compiler generierten
Abhängigkeits-Daten in Form des <code class="docutils literal notranslate"><span class="pre">dep</span></code> Formates ein.</p></li>
<li><p>Das erste und einzige Command Line Argument gibt das File an für
welches die von <code class="docutils literal notranslate"><span class="pre">stdin</span></code> gelesenen Abhängigkeiten gelten.</p></li>
<li><p>Auf <code class="docutils literal notranslate"><span class="pre">stdout</span></code> werden die Abhängigkeiten von <code class="docutils literal notranslate"><span class="pre">stdin</span></code> übersetzt als
<code class="docutils literal notranslate"><span class="pre">dot</span></code>-File Format ausgegeben.</p></li>
</ol>
<p>Das Programm <code class="docutils literal notranslate"><span class="pre">dot</span></code> hat folgende Funktionalität:</p>
<ol class="arabic simple">
<li><p>Es liest die textuelle Beschreibung eines Graphen aus der
übergebenen Datei (erstes Argument) ein.</p></li>
<li><p>Auf <code class="docutils literal notranslate"><span class="pre">stdout</span></code> wird die grafische Darstellung der Beschreibung der
Eingabe-Datei im <code class="docutils literal notranslate"><span class="pre">png</span></code>-File Format ausgegeben.</p></li>
</ol>
<p>Das <code class="docutils literal notranslate"><span class="pre">dep</span></code>-Format und das <code class="docutils literal notranslate"><span class="pre">dot</span></code>-Format sind im Anhang beschrieben.</p>
<p>Sie können die Funktionalität des Programms <code class="docutils literal notranslate"><span class="pre">dep2dot</span></code> kennen lernen,
indem Sie folgende Zeilen auf der Bash Shell ausführen. Das
<code class="docutils literal notranslate"><span class="pre">dep.input</span></code> File ist Teil der automatisierten Test Suite im
Verzeichnis <code class="docutils literal notranslate"><span class="pre">tests</span></code>:</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>bin/dep2dot dir/file &lt;tests/dep.input &gt;dep.dot
dot -Tpng dep.dot &gt;dep.png
firefox dep.png
</pre></div>
</div>
<p>Als Resultat sollte Firefox folgende Graphik darstellen:</p>
<figure class="align-center" id="dep-dot">
<a class="reference internal image-reference" href="../_images/dep_dot.png"><img alt="../_images/dep_dot.png" src="../_images/dep_dot.png" style="width: 150px;" /></a>
</figure>
<p>Definieren Sie im <code class="docutils literal notranslate"><span class="pre">Makefile</span></code> Regeln, welche die einzelnen Schritte von
den Source Files zu den <code class="docutils literal notranslate"><span class="pre">png</span></code> Files ausführen.</p>
<p>Prüfen Sie schliesslich die Umsetzung Aufgabe mittels <code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">dep-clean</span> <span class="pre">dep</span> <span class="pre">&amp;&amp;</span> <span class="pre">firefox</span> <span class="pre">src/*.png.</span></code></p>
<section id="neue-regeln-hinzufugen">
2022-03-01 14:30:52 +01:00
<h3>4.1 Neue Regeln hinzufügen<a class="headerlink" href="#neue-regeln-hinzufugen" title="Permalink to this headline"></a></h3>
2022-02-17 14:51:10 +01:00
<p>Führen Sie im <code class="docutils literal notranslate"><span class="pre">Makefile</span></code> an den angegebenen Stellen folgende
Ergänzungen durch</p>
<ul class="simple">
<li><p>definieren Sie eine Variable <code class="docutils literal notranslate"><span class="pre">DEPFILES</span></code> deren Inhalt die Liste alle
Einträge der Variable <code class="docutils literal notranslate"><span class="pre">SOURCES</span></code> ist, wobei bei allen die Endung <code class="docutils literal notranslate"><span class="pre">.c</span></code>
durch die Endung <code class="docutils literal notranslate"><span class="pre">.c.png</span></code> ersetzt ist</p></li>
<li><p>fügen Sie zum <code class="docutils literal notranslate"><span class="pre">Pseudo-Target</span> <span class="pre">.PHONEY</span></code> das Target <code class="docutils literal notranslate"><span class="pre">dep</span></code> dazu dies
besagt, dass das später folgenden Target <code class="docutils literal notranslate"><span class="pre">dep</span></code> nicht ein File
repräsentiert (ohne dieses Setting würde make gegebenenfalls nach
einem File mit Namen <code class="docutils literal notranslate"><span class="pre">dep</span></code> suchen um zu entscheiden ob es
inkrementell gebildet werden muss)</p></li>
<li><p>schreiben Sie das Target <code class="docutils literal notranslate"><span class="pre">dep</span></code> gemäss der Beschreibung im Makefile</p></li>
<li><p>schreiben Sie die Suffix Regel für die Übersetzung von <code class="docutils literal notranslate"><span class="pre">.png</span> <span class="pre">&lt;-</span> <span class="pre">.dot</span></code> gemäss Vorgabe im <code class="docutils literal notranslate"><span class="pre">Makefile</span></code> (als Inspiration, siehe auch die
<code class="docutils literal notranslate"><span class="pre">%.c.dep:</span> <span class="pre">%.c</span></code> Suffix Regel weiter unten im <code class="docutils literal notranslate"><span class="pre">Makefile</span></code>) erklären
Sie was die Regel macht</p></li>
<li><p>schreiben Sie die Suffix Regel für die Übersetzung von<code class="docutils literal notranslate"> <span class="pre">.dot</span> <span class="pre">&lt;-</span> <span class="pre">.dep</span></code> gemäss Vorgabe im <code class="docutils literal notranslate"><span class="pre">Makefile</span></code> erklären Sie was die Regel
macht</p></li>
</ul>
<p>Die Umsetzung der obigen Änderungen sind erfolgreich, wenn Sie
folgende Shell Command Line erfolgreich ausführen können und in
2022-03-01 14:30:52 +01:00
Firefox die Abhängigkeiten der C-Files von den Include Files
2022-02-17 14:51:10 +01:00
dargestellt wird.</p>
<p><code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">dep-clean</span> <span class="pre">dep</span> <span class="pre">&amp;&amp;</span> <span class="pre">firefox</span> <span class="pre">src/*.png.</span></code></p>
</section>
2022-03-01 14:30:52 +01:00
<section id="resultate-analysieren-und-erklaren">
<h3>4.2 Resultate analysieren und erklären<a class="headerlink" href="#resultate-analysieren-und-erklaren" title="Permalink to this headline"></a></h3>
<ul class="simple">
<li><p>Analysieren Sie die in der vorherigen Aufgabe erstellten grafischen Darstellungen.</p></li>
<li><p>Erklären Sie was dargestellt wird und stellen Sie den Bezug zum zugehörigen C-Code her.</p></li>
</ul>
</section>
2022-02-17 14:51:10 +01:00
</section>
<section id="bewertung">
<span id="grading"></span><h2>5. Bewertung<a class="headerlink" href="#bewertung" title="Permalink to this headline"></a></h2>
<p>Die gegebenenfalls gestellten Theorieaufgaben und der funktionierende Programmcode müssen der Praktikumsbetreuung gezeigt werden. Die Lösungen müssen mündlich erklärt werden.</p>
<table class="colwidths-auto docutils align-default">
<thead>
<tr class="row-odd"><th class="text-left head"><p>Aufgabe</p></th>
<th class="text-left head"><p>Kriterium</p></th>
<th class="text-left head"><p>Punkte</p></th>
</tr>
</thead>
<tbody>
<tr class="row-even"><td class="text-left"><p>1</p></td>
<td class="text-left"><p>Sie können das funktionierende Programm inklusive funktionierende Tests demonstrieren und erklären.</p></td>
<td class="text-left"><p></p></td>
</tr>
<tr class="row-odd"><td class="text-left"><p>1</p></td>
<td class="text-left"><p>Module einbinden, Header Files schreiben</p></td>
<td class="text-left"><p>2</p></td>
</tr>
<tr class="row-even"><td class="text-left"><p>2</p></td>
<td class="text-left"><p>Sie können das funktionierende Makefile demonstrieren und erklären.</p></td>
<td class="text-left"><p></p></td>
</tr>
<tr class="row-odd"><td class="text-left"><p>2</p></td>
<td class="text-left"><p>Neue Regeln hinzufügen</p></td>
<td class="text-left"><p>2</p></td>
</tr>
</tbody>
</table>
</section>
<section id="anhang">
<span id="appendix"></span><h2>6. Anhang<a class="headerlink" href="#anhang" title="Permalink to this headline"></a></h2>
<section id="verwendete-zusatzliche-sprach-elemente">
<h3>6.1 Verwendete zusätzliche Sprach Elemente<a class="headerlink" href="#verwendete-zusatzliche-sprach-elemente" title="Permalink to this headline"></a></h3>
<table><tr><td>
<p><strong>Sprach Element</strong></p>
</td><td>
<p><strong>Beschreibung</strong></p>
</td></tr>
<tr><td>
2022-03-01 14:30:52 +01:00
<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="n">fprintf</span><span class="p">(</span><span class="n">stderr</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;v=%d&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">v</span><span class="p">)</span><span class="w"></span>
2022-02-17 14:51:10 +01:00
</pre></div>
</div>
</td><td>
<p>Formatierte Ausgabe auf den Standard Error Stream. Siehe <em><strong>man 3
stderr</strong></em> und <em><strong>man 3 fprintf</strong></em>.</p>
</td></tr>
</table>
</section>
<section id="verarbeitung-und-verwendete-file-formate-a-name-file-formats-a">
<h3>6.2 Verarbeitung und verwendete File Formate <a name="file_formats"></a><a class="headerlink" href="#verarbeitung-und-verwendete-file-formate-a-name-file-formats-a" title="Permalink to this headline"></a></h3>
<p>Das Programm in diesem Praktikum ist Teil für die graphische
Darstellung von <code class="docutils literal notranslate"><span class="pre">#include</span></code> File Abhängigkeit von C Files.</p>
<p>Den ersten Schritt für die Darstellung der <code class="docutils literal notranslate"><span class="pre">#include</span></code> File
Abhängigkeiten bietet der Compiler. Der Compiler kann mittels der <code class="docutils literal notranslate"><span class="pre">-H</span></code>
Command Line Option auf <code class="docutils literal notranslate"><span class="pre">stderr</span></code> ein Text File generieren, welches die
tatsächlich verwendeten Header Files auflistet. Zusätzlich wird im
Resultat die Verschachtelungstiefe der Includes angegeben.</p>
<p>Im zweiten Schritt übersetzt das Programm (<code class="docutils literal notranslate"><span class="pre">dep2dot</span></code>) dieses
Praktikums solche Dependency Files (<code class="docutils literal notranslate"><span class="pre">dep</span></code>) in eine Text Repräsentation
der Abhängigkeiten (<code class="docutils literal notranslate"><span class="pre">dot</span></code>) welche in graphische Darstel-lung (<code class="docutils literal notranslate"><span class="pre">png</span></code>)
übersetzt werden kann.</p>
<p>Als Tool zur Übersetzung der <code class="docutils literal notranslate"><span class="pre">dot</span></code> Files in das <code class="docutils literal notranslate"><span class="pre">png</span></code> Format dient das
<code class="docutils literal notranslate"><span class="pre">dot</span></code> Tool. Dieses Tool muss gegebenenfalls installiert werden:</p>
<p><code class="docutils literal notranslate"><span class="pre">sudo</span> <span class="pre">apt</span> <span class="pre">install</span> <span class="pre">graphviz</span></code></p>
<p>Die <code class="docutils literal notranslate"><span class="pre">png</span></code> Files können dann z.B. in der Programm Dokumentation
integriert werden (Darstellung zu Test Zwecken z.B. mittels <code class="docutils literal notranslate"><span class="pre">firefox</span> <span class="pre">file.png</span></code>).</p>
<section id="dep-file">
<h4>6.2.1 dep File<a class="headerlink" href="#dep-file" title="Permalink to this headline"></a></h4>
<p>Siehe: <code class="docutils literal notranslate"><span class="pre">man</span> <span class="pre">gcc</span></code></p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>-H Print the name of each header file used, <span class="k">in</span> addition to other
normal activities. Each name is indented to show how deep <span class="k">in</span> the
<span class="c1">#include stack it is. [...]</span>
</pre></div>
</div>
<p>Das File wird auf <code class="docutils literal notranslate"><span class="pre">stderr</span></code> ausgegeben.</p>
<p><strong>Beispiel File</strong> (für Abhängigkeiten des <code class="docutils literal notranslate"><span class="pre">main.c</span></code> Files des <code class="docutils literal notranslate"><span class="pre">dep2dot</span></code> Programms)</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>. /usr/include/stdio.h
.. /usr/include/x86_64-linux-gnu/bits/libc-header-start.h
... /usr/include/features.h
.... /usr/include/x86_64-linux-gnu/sys/cdefs.h
..... /usr/include/x86_64-linux-gnu/bits/wordsize.h
..... /usr/include/x86_64-linux-gnu/bits/long-double.h
.... /usr/include/x86_64-linux-gnu/gnu/stubs.h
..... /usr/include/x86_64-linux-gnu/gnu/stubs-64.h
.. /usr/lib/gcc/x86_64-linux-gnu/7/include/stddef.h
.. /usr/include/x86_64-linux-gnu/bits/types.h
... /usr/include/x86_64-linux-gnu/bits/wordsize.h
... /usr/include/x86_64-linux-gnu/bits/typesizes.h
.. /usr/include/x86_64-linux-gnu/bits/types/__FILE.h
.. /usr/include/x86_64-linux-gnu/bits/types/FILE.h
.. /usr/include/x86_64-linux-gnu/bits/libio.h
... /usr/include/x86_64-linux-gnu/bits/_G_config.h
.... /usr/lib/gcc/x86_64-linux-gnu/7/include/stddef.h
.... /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h
... /usr/lib/gcc/x86_64-linux-gnu/7/include/stdarg.h
.. /usr/include/x86_64-linux-gnu/bits/stdio_lim.h
.. /usr/include/x86_64-linux-gnu/bits/sys_errlist.h
. /usr/include/stdlib.h
.. /usr/include/x86_64-linux-gnu/bits/libc-header-start.h
.. /usr/lib/gcc/x86_64-linux-gnu/7/include/stddef.h
.. /usr/include/x86_64-linux-gnu/bits/floatn.h
... /usr/include/x86_64-linux-gnu/bits/floatn-common.h
.... /usr/include/x86_64-linux-gnu/bits/long-double.h
.. /usr/include/x86_64-linux-gnu/bits/stdlib-float.h
. src/error.h
.. /usr/lib/gcc/x86_64-linux-gnu/7/include/stddef.h
. src/data.h
.. /usr/lib/gcc/x86_64-linux-gnu/7/include/stddef.h
. src/output.h
Multiple include guards may be useful <span class="k">for</span>:
/usr/include/x86_64-linux-gnu/bits/stdlib-float.h
/usr/include/x86_64-linux-gnu/bits/sys_errlist.h
/usr/include/x86_64-linux-gnu/bits/typesizes.h
/usr/include/x86_64-linux-gnu/gnu/stubs-64.h
/usr/include/x86_64-linux-gnu/gnu/stubs.h
</pre></div>
</div>
</section>
<section id="dot-file">
<h4>6.2.2 dot File<a class="headerlink" href="#dot-file" title="Permalink to this headline"></a></h4>
<p><strong>Graphviz</strong> ist ein mächtiges Tool-Set welches Graphen, definiert in
einem <code class="docutils literal notranslate"><span class="pre">dot</span></code>-Text File, automatisch anordnet und in <code class="docutils literal notranslate"><span class="pre">png</span></code>, <code class="docutils literal notranslate"><span class="pre">gif</span></code> und
andere Formate übersetzt.</p>
<p>Siehe die offizielle Web-Page
<a class="reference external" href="https://www.graphviz.org/">https://www.graphviz.org/</a>.</p>
<p>Es gibt als Teil dieses Tool-Sets verschiedene Übersetzer. Der hier
verwendete ist der Basis-übersetzer: <code class="docutils literal notranslate"><span class="pre">dot</span></code>.</p>
<p>Das <code class="docutils literal notranslate"><span class="pre">dot</span></code>-File Format kennt viele Möglichkeiten die Knoten und Kanten
2022-03-01 14:30:52 +01:00
eines Graphen und deren Anordnung anzugeben.</p>
2022-02-17 14:51:10 +01:00
<p>Der Vorteil eines solchen Tool-Sets ist, dass man den Inhalt (den
Graphen) einfach definieren kann und sich nicht um das komplexe
Problem der ansprechenden Visualisierung kümmern muss.</p>
<p><strong>Beispiel File</strong> (<code class="docutils literal notranslate"><span class="pre">dot</span> <span class="pre">-Tpng</span> <span class="pre">sample.dot</span> <span class="pre">&gt;</span> <span class="pre">sample.png</span></code>)</p>
2022-03-01 14:30:52 +01:00
<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="n">digraph</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w"> </span><span class="n">node</span><span class="w"> </span><span class="p">[</span><span class="n">shape</span><span class="o">=</span><span class="n">box</span><span class="p">]</span><span class="w"></span>
<span class="w"> </span><span class="n">A</span><span class="w"> </span><span class="p">[</span><span class="n">label</span><span class="o">=</span><span class="s">&quot;a.c&quot;</span><span class="p">];</span><span class="w"></span>
<span class="w"> </span><span class="n">B</span><span class="w"> </span><span class="p">[</span><span class="n">label</span><span class="o">=</span><span class="s">&quot;a.h&quot;</span><span class="p">];</span><span class="w"></span>
<span class="w"> </span><span class="n">C</span><span class="w"> </span><span class="p">[</span><span class="n">label</span><span class="o">=</span><span class="s">&quot;b.h&quot;</span><span class="p">];</span><span class="w"></span>
2022-02-17 14:51:10 +01:00
2022-03-01 14:30:52 +01:00
<span class="w"> </span><span class="n">subgraph</span><span class="w"> </span><span class="n">cluster_c0</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w"> </span><span class="n">label</span><span class="o">=</span><span class="s">&quot;main&quot;</span><span class="p">;</span><span class="w"> </span><span class="n">color</span><span class="o">=</span><span class="n">black</span><span class="p">;</span><span class="w"></span>
<span class="w"> </span><span class="n">A</span><span class="p">;</span><span class="w"></span>
<span class="w"> </span><span class="p">}</span><span class="w"></span>
2022-02-17 14:51:10 +01:00
2022-03-01 14:30:52 +01:00
<span class="w"> </span><span class="n">subgraph</span><span class="w"> </span><span class="n">cluster_c1</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w"> </span><span class="n">label</span><span class="o">=</span><span class="s">&quot;others&quot;</span><span class="p">;</span><span class="w"> </span><span class="n">style</span><span class="o">=</span><span class="n">filled</span><span class="p">;</span><span class="w"> </span><span class="n">color</span><span class="o">=</span><span class="n">lightgrey</span><span class="p">;</span><span class="w"></span>
<span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">B</span><span class="p">;</span><span class="w"> </span><span class="n">C</span><span class="p">;</span><span class="w"> </span><span class="n">rank</span><span class="o">=</span><span class="n">same</span><span class="p">;</span><span class="w"> </span><span class="p">}</span><span class="w"></span>
<span class="w"> </span><span class="p">}</span><span class="w"></span>
2022-02-17 14:51:10 +01:00
2022-03-01 14:30:52 +01:00
<span class="w"> </span><span class="n">A</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">B</span><span class="p">;</span><span class="w"></span>
<span class="w"> </span><span class="n">A</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">C</span><span class="p">;</span><span class="w"></span>
<span class="w"> </span><span class="n">B</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">C</span><span class="p">;</span><span class="w"></span>
<span class="p">}</span><span class="w"></span>
2022-02-17 14:51:10 +01:00
</pre></div>
</div>
2022-03-01 14:30:52 +01:00
<figure class="align-center" id="bsp-dot">
<a class="reference internal image-reference" href="../_images/bsp_dot.png"><img alt="../_images/bsp_dot.png" src="../_images/bsp_dot.png" style="width: 210px;" /></a>
</figure>
2022-02-17 14:51:10 +01:00
</section>
<section id="png-file">
<h4>6.2.3 png File<a class="headerlink" href="#png-file" title="Permalink to this headline"></a></h4>
<p>Das <code class="docutils literal notranslate"><span class="pre">png</span></code> Format ist ein verlustfrei komprimiertes Raster Graphik
Format. Es wird oft in Web Pages verwendet.</p>
<hr class="docutils" />
2022-03-01 14:30:52 +01:00
<p>Version: 22.02.2022</p>
2022-02-17 14:51:10 +01:00
</section>
</section>
</section>
</section>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<p class="logo">
<a href="../index.html">
<img class="logo" src="../_static/logo.png" alt="Logo"/>
<h1 class="logo logo-name">SNP Labs</h1>
</a>
</p>
<h3>Navigation</h3>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../P01_Erste_Schritte_mit_C/README.html">01 - Erste Schritte mit C</a></li>
<li class="toctree-l1"><a class="reference internal" href="../P02_Funktionen_Datentyp_enum/README.html">02: Funktionen, Datentyp “enum”</a></li>
<li class="toctree-l1"><a class="reference internal" href="../P03_Bit_Operation_struct_typedef/README.html">03 - Bit Operationen, Struct, Typedef</a></li>
<li class="toctree-l1"><a class="reference internal" href="../P05_TicTacToe/README.html">05 - Arrays/Strings/TicTacToe</a></li>
<li class="toctree-l1"><a class="reference internal" href="../P06_Personen_Verwaltung_Linked_List/README.html">06 - Personen Verwaltung Linked List</a></li>
<li class="toctree-l1"><a class="reference internal" href="../P07_Prozesse_und_Threads/README.html">07 - Prozesse und Threads</a></li>
<li class="toctree-l1"><a class="reference internal" href="../P08_Sync/README.html">08 - Synchronisationsprobleme</a></li>
<li class="toctree-l1"><a class="reference internal" href="../P09_File_Operations/README.html">09 - File Operations</a></li>
<li class="toctree-l1"><a class="reference internal" href="../P10_IPC/README.html">10 - IPC</a></li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../index.html">Documentation overview</a><ul>
</ul></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
</div>
<script>$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&copy;2022, stsh.
|
2022-03-01 14:30:52 +01:00
Powered by <a href="http://sphinx-doc.org/">Sphinx 4.3.2</a>
2022-02-17 14:51:10 +01:00
&amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
|
<a href="../_sources/P04_Modularisieren_von_C_Code/README.md.txt"
rel="nofollow">Page source</a>
</div>
</body>
</html>