Sitzung: Jeden Freitag in der Vorlesungszeit ab 16 Uhr c. t. im MAR 0.005. In der vorlesungsfreien Zeit unregelmäßig (Jemensch da?). Macht mit!

C-Kurs/Refactoring

< C-Kurs
Version vom 22. September 2009, 18:24 Uhr von DStulle (Diskussion | Beiträge) (Teil 2: zusatzteil Markiert)

Teil 1

Das gegebene Programm ist eine Hashtabelle. Leider ist es etwas unübersichtlich, da es eine Funktion enthält, die ca. 150 Zeilen lang ist. Schaffe mehr Übersicht indem du zusammengehörige Codefragmente oder mehrfach im Quelltext auftauchen in kleinere Funktionen auslagerst. Wie zum Beispiel diese:

static int calcHashKey(const char *pszHash);
static PHASHITEM getItemFromHash(const char *pszHash);
static void execGetHash(const char *pszHash);
static void execRemoveHash(const char *pszHash);
static void execInsertHash(const char *pszHash, char *pszData);
static int parseCmd(const char *pszCmdLine);


Halte dich dabei an die Namenskonvention der Ungarischen Notation und Camel Case.

Hier ist die Vorlage: HashTableRefactor.c

Teil 2

Den Algorithmus zum Codieren eines Strings nach base64 aus einer anderen Aufgabe kann man auch noch etwas eleganter und knapper schreiben.

Das Programm erwatet genau einen Kommandozeilenparameter und convertiert diesen nach Base64.

$ ./base64 "Das ist ein Test"
RGFzIGlzdCBlaW4gVGVzdA==

Hier ist die Vorlage: base64_refactor.c

Schreibe eine Funktion encode_block(), die die vier gegebenen encode_*_output() Funktionen ersetzt.

/**
 * Encodes three input chars into four output chars based on the base64 scheme.
 * @param in chararray with input characters
 * @param out chararray where the output is written to
 * @param len number of chars to be used from input
 */
void encode_block( unsigned char in[3], unsigned char out[4], int len )
{
  /* ... */
}

Ersetze die Aufrufe der vier Funktionen an den drei Stellen im Code durch einen Aufruf der Funktion encode_block().

Zusatz

Vereinfache den Code so, dass die Funktion encode_block() nur einmal aufgerufen wird. Lagere den Algorithmus zum Codieren in eine Funktion encode() aus. Initialisierung und Benutzerinteraktion soll in der main() umgesetzt werden.

/**
 * Encodes the input string into an output string based on the base64 scheme.
 * @param length size of input string
 * @param input string with input characters
 * @param output string where the output is written to. It has to be long enough to hold the output
 */
void encode(int length, char *input, char *output)
{
  /* ... */
}