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/(Pointer) Swapping: Unterschied zwischen den Versionen

 
(5 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
# Schreibe eine Funtion swap, die zwei Integers vertauscht.<br> Hinweis: Du musst Zeiger auf die Integer-Variablen übergeben.<br>Definiere zwei Integer-Variablen, gib sie auf dem Bildschirm aus, vertausche sie und gib sie erneut aus.
+
# Schreibe eine Funktion swap, die zwei Integer vertauscht.<br> Hinweis: Du musst Zeiger auf die Integer-Variablen übergeben.<br>Definiere zwei Integer-Variablen, gib sie auf dem Bildschirm aus, vertausche sie und gib sie erneut aus.
# a) Schreibe eine Funktion print_int_array, die ein Integer-Array auf dem Bildschirm ausgibt.<br>b) Vertausche die Elemente zweier gleichlanger Integer-Arrays elementweise. Benutze dazu die Funktion swap aus der ersten Aufgabe. Gib die Arrays vor und nach dem Vertauschen mittels print_int_array aus.  
+
# a) Schreibe eine Funktion print_int_array, die ein Integer-Array auf dem Bildschirm ausgibt.<br>b) Vertausche die Elemente zweier gleichlanger Integer-Arrays elementweise. Benutze dazu die Funktion swap aus der ersten Aufgabe.<br> Gib die Arrays vor und nach dem Vertauschen mittels print_int_array aus.  
# Schreibe nun eine Funktion, die zwei Integer-Pointer vertauscht. Benutze nicht calloc, sondern definiere zwei Integer-Variablen i und j und speichere deren Adressen in zwei Pointer-Variablen p1 und p2. Gib vor und nach dem Tauschen p1 und p2 aus, dereferenziere p1 und p2 und gib das Ergebnis ebenfalls vor und nach dem Vertauschen aus. Gib ausserdem i und j aus.<br>Welche Ergebnisse erwartest du?<br>Mache dir am Besten, bevor du mit dem Programmieren beginnst, eine kleine Zeichnung auf Papier und diskutiere sie mit einem Tutor.  
+
# Schreibe nun eine Funktion, die zwei Integer-Pointer vertauscht.<br>Benutze nicht calloc, sondern definiere zwei Integer-Variablen i und j und speichere deren Adressen in zwei Pointer-Variablen p1 und p2.<br>Gib vor und nach dem Tauschen p1 und p2 aus, dereferenziere p1 und p2 und gib das Ergebnis ebenfalls vor und nach dem Vertauschen aus. Gib ausserdem i und j aus.<br>Welche Ergebnisse erwartest du?<br>Mache dir am Besten, bevor du mit dem Programmieren beginnst, eine kleine Zeichnung auf Papier und diskutiere sie mit einem Tutor.  
# Die Funktion aus Aufgabe 2 hat den Nachteil, für große Arrays sehr ineffizient zu sein, da die swap-Funktion für jedes einzelne Element aufgerufen werden muss.<br>Schreibe ein Programm, das zwei Integer-Arrays (nicht deren Inhalte!) vertauscht.<br>Verwende der Einfachheit halber calloc, um die Arrays anzulegen.<br>Benutze zur Ausgabe wieder die Funktion print_int_array aus Aufgabe 2.<br>Hinweis: Wenn du Aufgabe 3 gelöst hast, ist die Aufgabe einfach. Zum Verständnis kann es wieder hilfreich sein, das Problem auf Papier aufzumalen.
+
# Die Funktion aus Aufgabe 2 hat den Nachteil, für große Arrays sehr ineffizient zu sein, da die swap-Funktion für jedes einzelne Element aufgerufen werden muss.<br>Dein Bildschirm ist so ein Beispiel für ein großes Array. Da macht man es so, dass man Pointer auf zwei Arrays speichert, eins zum Anzeigen, und eins, in das offscreen die neuen Bildinhalte geschrieben werden, ohne dass der Benutzer das mitbekommt. Und dann werden die beiden Pointer einfach getauscht: Das Schreiben erfolgt nun in das Array, das vorher angezeigt wurde, und umgekehrt<br>Erstelle ein Programm, das zwei Pointer auf Integer-Arrays (und nicht mehr die Inhalte der Arrays wie in 2.) vertauscht.<br>Benutze zur Ausgabe wieder die Funktion print_int_array aus Aufgabe 2.<br>Hinweis: Wenn du Aufgabe 3 gelöst hast, ist diese Aufgabe einfach.<br>Zum Verständnis kann es wieder hilfreich sein, das Problem auf Papier aufzumalen.
# Mache die swap-Funktion aus Aufgabe 3 generisch, so dass sie für beliebige Typen von Pointern funktioniert.<br> Benutze hierzu void-Pointer. Vergiss das Casten beim Aufruf nicht!<br>Teste die Funktion zunächst mit Integer- , dann mit Float-Pointern.  
+
# Mache die swap-Funktion aus Aufgabe 3 generisch, so dass sie für beliebige Typen von Pointern funktioniert.<br> Benutze hierzu void-Pointer. Vergiss das Casten beim Aufruf nicht!<br>Teste die Funktion zunächst mit Integer-, dann mit Float-Pointern.  
# Dein Ziel ist, egal für welche Typen von Argumenten, immer eine einheitliche Funktion swap() aufrufen zu können, und nicht swap_int, swap_float... Wie würdest das Problem in Java lösen, wo es keine void-Pointer gibt? Was müsstest du der swap-Methode als Argument übergeben, um zwei Arrays zu tauschen?<br>Warum funktioniert das mit dem Generischmachen leider so nicht für die swap-Funktion aus Augabe 1? Wenn es dir nicht sofort klar ist, probiere es aus und sieh dir die Fehlermeldung des Compilers an. Funktioniert der Ansatz, den du in Java gewählt hast, auch in c?
+
# Dein Ziel ist, egal für welche Typen von Argumenten, immer eine einheitliche Funktion swap() aufrufen zu können, und nicht swap_int, swap_float...<br>Wie würdest das Problem in Java lösen, wo es keine void-Pointer gibt? Was müsstest du der swap-Methode als Argument übergeben, um zwei Arrays zu tauschen?<br>Warum funktioniert das mit dem Generischmachen leider so nicht für die swap-Funktion aus Augabe 1?<br>Wenn es dir nicht sofort klar ist, probiere es aus und sieh dir die Fehlermeldung des Compilers an.<br>Funktioniert der Ansatz, den du in Java gewählt hast, auch in c?

Aktuelle Version vom 5. März 2013, 17:37 Uhr

  1. Schreibe eine Funktion swap, die zwei Integer vertauscht.
    Hinweis: Du musst Zeiger auf die Integer-Variablen übergeben.
    Definiere zwei Integer-Variablen, gib sie auf dem Bildschirm aus, vertausche sie und gib sie erneut aus.
  2. a) Schreibe eine Funktion print_int_array, die ein Integer-Array auf dem Bildschirm ausgibt.
    b) Vertausche die Elemente zweier gleichlanger Integer-Arrays elementweise. Benutze dazu die Funktion swap aus der ersten Aufgabe.
    Gib die Arrays vor und nach dem Vertauschen mittels print_int_array aus.
  3. Schreibe nun eine Funktion, die zwei Integer-Pointer vertauscht.
    Benutze nicht calloc, sondern definiere zwei Integer-Variablen i und j und speichere deren Adressen in zwei Pointer-Variablen p1 und p2.
    Gib vor und nach dem Tauschen p1 und p2 aus, dereferenziere p1 und p2 und gib das Ergebnis ebenfalls vor und nach dem Vertauschen aus. Gib ausserdem i und j aus.
    Welche Ergebnisse erwartest du?
    Mache dir am Besten, bevor du mit dem Programmieren beginnst, eine kleine Zeichnung auf Papier und diskutiere sie mit einem Tutor.
  4. Die Funktion aus Aufgabe 2 hat den Nachteil, für große Arrays sehr ineffizient zu sein, da die swap-Funktion für jedes einzelne Element aufgerufen werden muss.
    Dein Bildschirm ist so ein Beispiel für ein großes Array. Da macht man es so, dass man Pointer auf zwei Arrays speichert, eins zum Anzeigen, und eins, in das offscreen die neuen Bildinhalte geschrieben werden, ohne dass der Benutzer das mitbekommt. Und dann werden die beiden Pointer einfach getauscht: Das Schreiben erfolgt nun in das Array, das vorher angezeigt wurde, und umgekehrt
    Erstelle ein Programm, das zwei Pointer auf Integer-Arrays (und nicht mehr die Inhalte der Arrays wie in 2.) vertauscht.
    Benutze zur Ausgabe wieder die Funktion print_int_array aus Aufgabe 2.
    Hinweis: Wenn du Aufgabe 3 gelöst hast, ist diese Aufgabe einfach.
    Zum Verständnis kann es wieder hilfreich sein, das Problem auf Papier aufzumalen.
  5. Mache die swap-Funktion aus Aufgabe 3 generisch, so dass sie für beliebige Typen von Pointern funktioniert.
    Benutze hierzu void-Pointer. Vergiss das Casten beim Aufruf nicht!
    Teste die Funktion zunächst mit Integer-, dann mit Float-Pointern.
  6. Dein Ziel ist, egal für welche Typen von Argumenten, immer eine einheitliche Funktion swap() aufrufen zu können, und nicht swap_int, swap_float...
    Wie würdest das Problem in Java lösen, wo es keine void-Pointer gibt? Was müsstest du der swap-Methode als Argument übergeben, um zwei Arrays zu tauschen?
    Warum funktioniert das mit dem Generischmachen leider so nicht für die swap-Funktion aus Augabe 1?
    Wenn es dir nicht sofort klar ist, probiere es aus und sieh dir die Fehlermeldung des Compilers an.
    Funktioniert der Ansatz, den du in Java gewählt hast, auch in c?