Skip to content
Snippets Groups Projects
Commit 9e4a480b authored by Peter Gerwinski's avatar Peter Gerwinski
Browse files

Übungsaufgaben 9.1.2020

parent 78a560b4
Branches
No related tags found
No related merge requests found
#include <stdio.h>
#include <stdint.h>
typedef struct
{
uint32_t a;
uint64_t b;
uint8_t c;
} three_numbers;
int main (void)
{
three_numbers xyz = { 1819042120, 2410670883059281007, 0 };
printf ("%s\n", &xyz);
return 0;
}
#include <stdio.h>
#include <stdint.h>
void output (uint16_t *a)
{
for (int i = 0; a[i]; i++)
printf (" %d", a[i]);
printf ("\n");
}
int main (void)
{
uint16_t prime_numbers[] = { 2, 3, 5, 7, 11, 13, 17, 0 };
uint16_t *p1 = prime_numbers;
output (p1);
p1++;
output (p1);
char *p2 = prime_numbers;
output (p2);
p2++;
output (p2);
return 0;
}
#include <stdio.h>
#include <string.h>
typedef struct
{
char first_name[10];
char family_name[20];
char day, month;
int year;
} person;
int main (void)
{
person sls;
sls.day = 26;
sls.month = 7;
sls.year = 1951;
strcpy (sls.first_name, "Sabine");
strcpy (sls.family_name, "Leutheusser-Schnarrenberger");
printf ("%s %s wurde am %d.%d.%d geboren.\n",
sls.first_name, sls.family_name, sls.day, sls.month, sls.year);
return 0;
}
File added
% hp-uebung-20200109.pdf - Exercises on Low-Level Programming
% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020 Peter Gerwinski
%
% This document is free software: you can redistribute it and/or
% modify it either under the terms of the Creative Commons
% Attribution-ShareAlike 3.0 License, or under the terms of the
% GNU General Public License as published by the Free Software
% Foundation, either version 3 of the License, or (at your option)
% any later version.
%
% This document is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% GNU General Public License for more details.
%
% You should have received a copy of the GNU General Public License
% along with this document. If not, see <http://www.gnu.org/licenses/>.
%
% You should have received a copy of the Creative Commons
% Attribution-ShareAlike 3.0 Unported License along with this
% document. If not, see <http://creativecommons.org/licenses/>.
% README: Speicherformate von Zahlen, Zeigerarithmetik, Personen-Datenbank
\documentclass[a4paper]{article}
\usepackage{pgscript}
\begin{document}
\thispagestyle{empty}
\section*{Hardwarenahe Programmierung\\
Übungsaufgaben -- 9.\ Januar 2020}
Diese Übung enthält Punkteangaben wie in einer Klausur.
Um zu "`bestehen"', müssen Sie innerhalb von 90 Minuten
unter Verwendung ausschließlich zugelassener Hilfsmittel
15 Punkte (von insgesamt \totalpoints) erreichen.
\exercise{Speicherformate von Zahlen}
Wir betrachten das folgende Programm (\gitfile{hp}{20200109}{aufgabe-1.c}):
\begin{lstlisting}
#include <stdio.h>
#include <stdint.h>
typedef struct
{
uint32_t a;
uint64_t b;
uint8_t c;
} three_numbers;
int main (void)
{
three_numbers xyz = { 1819042120, 2410670883059281007, 0 };
printf ("%s\n", &xyz);
return 0;
}
\end{lstlisting}
Das Programm wird für einen 32-Bit-Rechner compiliert und ausgeführt.\\
(Die \lstinline[style=cmd]{gcc}-Option \lstinline[style=cmd]{-m32} sorgt dafür,
daß \lstinline[style=cmd]{gcc} Code für einen 32-Bit-Prozessor erzeugt.)
\begin{lstlisting}[style=terminal]
$ ¡gcc -Wall -m32 aufgabe-2.c -o aufgabe-2¿
aufgabe-2.c: In function "main":
aufgabe-2.c:14:13: warning: format "%s" expects argument of type "char *", but
argument 2 has type "three_numbers * {aka struct <anonymous> *}" [-Wformat=]
printf ("%s\n", &xyz);
^
$ ¡./aufgabe-2¿
Hallo, Welt!
\end{lstlisting}
\begin{enumerate}[\quad(a)]
\item
Erklären Sie die beim Compilieren auftretende Warnung.
\points{2}
\item
Erklären Sie die Ausgabe des Programms.
\points{4}
\item
Welche Endianness hat der verwendete Rechner?
Wie sähe die Ausgabe auf einem Rechner mit entgegengesetzter Endianness aus?
\points{2}
\item
Dasselbe Programm wird nun für einen 64-Bit-Rechner compiliert und ausgeführt.\\
(Die \lstinline[style=cmd]{gcc}-Option \lstinline[style=cmd]{-m64} sorgt dafür,
daß \lstinline[style=cmd]{gcc} Code für einen 64-Bit-Prozessor erzeugt.)
\begin{lstlisting}[style=terminal,gobble=8]
$ ¡gcc -Wall -m64 aufgabe-2.c -o aufgabe-2¿
aufgabe-2.c: In function "main":
aufgabe-2.c:14:13: warning: format "%s" expects argument of type "char *",
but argument 2 has type "three_numbers * {aka struct <anonymous> *}"
[-Wformat=]
printf ("%s\n", &xyz);
^
$ ¡./aufgabe-2¿
Hall5V
\end{lstlisting}
(Es ist möglich, daß die konkrete Ausgabe auf Ihrem Rechner anders aussieht.)\par
Erklären Sie die geänderte Ausgabe des Programms.
\points{3}
\end{enumerate}
\clearpage
\exercise{Zeigerarithmetik}
Wir betrachten das folgende Programm (\gitfile{hp}{20200109}{aufgabe-2.c}):
\begin{lstlisting}
#include <stdio.h>
#include <stdint.h>
void output (uint16_t *a)
{
for (int i = 0; a[i]; i++)
printf (" %d", a[i]);
printf ("\n");
}
int main (void)
{
uint16_t prime_numbers[] = { 2, 3, 5, 7, 11, 13, 17, 0 };
uint16_t *p1 = prime_numbers;
output (p1);
p1++;
output (p1);
char *p2 = prime_numbers;
output (p2);
p2++;
output (p2);
return 0;
}
\end{lstlisting}
Das Programm wird compiliert und ausgeführt:
\begin{lstlisting}[style=terminal]
$ ¡gcc -Wall aufgabe-2.c -o aufgabe-2¿
aufgabe-2.c: In function 'main':
aufgabe-2.c:20:13: warning: initialization from
incompatible pointer type [enabled by default]
aufgabe-2.c:21:3: warning: passing argument 1 of 'output' from
incompatible pointer type [enabled by default]
aufgabe-2.c:4:6: note: expected 'uint16_t *' but argument is of type 'char *'
aufgabe-2.c:23:3: warning: passing argument 1 of 'output' from
incompatible pointer type [enabled by default]
aufgabe-2.c:4:6: note: expected 'uint16_t *' but argument is of type 'char *'
$ ¡./aufgabe-2¿
2 3 5 7 11 13 17
3 5 7 11 13 17
2 3 5 7 11 13 17
768 1280 1792 2816 3328 4352
\end{lstlisting}
\begin{enumerate}[\quad(a)]
\item
Erklären Sie die Funktionsweise der Funktion \lstinline{output ()}.
\points{2}
\item
Begründen Sie den Unterschied zwischen der ersten (\lstinline[style=terminal]{2 3 5 7 11 13 17})\\
und der zweiten Zeile (\lstinline[style=terminal]{3 5 7 11 13 17}) der Ausgabe des Programms.
\points{2}
\item
Erklären Sie die beim Compilieren auftretenden Warnungen\\
und die dritte Zeile (\lstinline[style=terminal]{2 3 5 7 11 13 17}) der Ausgabe des Programms.
\points{3}
\item
Erklären Sie die vierte Zeile (\lstinline[style=terminal]{768 1280 1792 2816 3328 4352})
der Ausgabe des Programms.\\
% Welche Endianness hat der verwendete Rechner?\\
% Wie sähe die Ausgabezeile bei umgekehrter Endianness aus?
%
% 2 0 3 0 5 0 7 0 11 --> 2 3 5 7 11
% 0 3 0 5 0 7 0 11 --> 768 1280 ...
%
% 0 2 0 3 0 5 0 7 0 11 --> 2 3 5 7 11
% 2 0 3 0 5 0 7 0 11 --> 768 1280 ...
%
% --> Endianness nicht erkennbar!
%
Sie dürfen einen Little-Endian-Rechner voraussetzen.
\points{4}
\end{enumerate}
\goodbreak
\exercise{Personen-Datenbank}
Wir betrachten das folgende Programm (\gitfile{hp}{20200109}{aufgabe-3.c}):
\begin{lstlisting}
#include <stdio.h>
#include <string.h>
typedef struct
{
char first_name[10];
char family_name[20];
char day, month;
int year;
} person;
int main (void)
{
person sls;
sls.day = 26;
sls.month = 7;
sls.year = 1951;
strcpy (sls.first_name, "Sabine");
strcpy (sls.family_name, "Leutheusser-Schnarrenberger");
printf ("%s %s wurde am %d.%d.%d geboren.\n",
sls.first_name, sls.family_name, sls.day, sls.month, sls.year);
return 0;
}
\end{lstlisting}
Die Standard-Funktion \lstinline{strcpy()} bewirkt ein Kopieren eines Strings
von rechts nach links, hier also z.\,B.\ die Zuweisung der String-Konstanten
\lstinline{"Sabine"} an die String-Variable \lstinline{sls.first_name[]}.
Das Programm wird für einen 32-Bit-Rechner compiliert und ausgeführt.\\
(Die \lstinline[style=cmd]{gcc}-Option \lstinline[style=cmd]{-m32} sorgt dafür,
daß \lstinline[style=cmd]{gcc} Code für einen 32-Bit-Prozessor erzeugt.)
\begin{lstlisting}[style=terminal]
$ ¡gcc -Wall -O -m32 aufgabe-2.c -o aufgabe-2¿
$ ¡./aufgabe-2¿
Sabine Leutheusser-Schnarrenberger wurde am 110.98.1701278309 geboren.
Speicherzugriffsfehler
\end{lstlisting}
\begin{enumerate}[\quad(a)]
\item
Erklären Sie die Ausgabe des Programms einschließlich der Zahlenwerte.
\points{4}
\item
Welche Endianness hat der verwendete Rechner?
Begründen Sie Ihre Antwort.
\points{1}
\item
Wie sähe die Ausgabe auf einem Rechner mit entgegengesetzter Endianness aus?
\points{2}
\item
Erklären Sie den Speicherzugriffsfehler.
(Es kann sein, daß sich der Fehler auf Ihrem Rechner nicht bemerkbar macht.
Er ist aber trotzdem vorhanden.)
\points{2}
\end{enumerate}
\begin{flushright}
\textit{Viel Erfolg!}
\end{flushright}
\makeatletter
\immediate\write\@mainaux{\string\gdef\string\totalpoints{\arabic{points}}}
\makeatother
\end{document}
File added
File added
../common/pgscript.sty
\ No newline at end of file
......@@ -44,6 +44,7 @@ Vortragsfolien und Beispiele:
* [05.12.2019: Löschen aus Strings, Hexdumps](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191205/hp-uebung-20191205.pdf)
* [12.12.2019: Kondensator, hüpfender Ball](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191212/hp-uebung-20191212.pdf)
* [19.12.2019: Trickprogrammierung, Thermometer-Baustein an I²C-Bus](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191219/hp-uebung-20191219.pdf)
* [09.01.2020: Speicherformate von Zahlen, Zeigerarithmetik, Personen-Datenbank](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20200109/hp-uebung-20200109.pdf)
Musterlösungen:
---------------
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment