Programmieren (IEP/ISB/SWB/TIB) - PDF

Summary

This document contains lecture notes on programming, specifically functions in C, covering fundamental concepts like call-by-value, call-by-reference, and working with arrays. The slides also include code examples and a quiz, addressing the topic during the winter semester 2024/2025 for the Hochschule Esslingen.

Full Transcript

PROGRAMMIEREN (IEP/ISB/SWB/TIB) 11. FUNKTIONEN FORTGESCHRITTEN (ARRAYS, CALL-BY-VALUE & CALL-BY-REFERENCE) PROF. DR. DENNIS GREWE 1 LEHREVALUATION WINTERSEMESTER 2024/2025 Bitte nehmen Sie sich die Zeit für...

PROGRAMMIEREN (IEP/ISB/SWB/TIB) 11. FUNKTIONEN FORTGESCHRITTEN (ARRAYS, CALL-BY-VALUE & CALL-BY-REFERENCE) PROF. DR. DENNIS GREWE 1 LEHREVALUATION WINTERSEMESTER 2024/2025 Bitte nehmen Sie sich die Zeit für die Beantwortung der Fragen. Ihre Meinung zählt! 18.11.2024 Prof. Dr. Dennis Grewe | XI. Funktionen Fortgeschritten - Call-By-Value / Reference |Modul Programmieren IEP/ISB/SWB/TIB 2 AGENDA l Was genau ist call-by-value und call-by-reference? l Wie genau wird mit lokalen Variablen im Geltungsbereich (Scope) umgegangen? l Wie können call-by-value und call-by-reference im Kontext Funktionen eingesetzt werden? l Wie können Arrays an Funktionen übergeben werden? 18.11.2024 Prof. Dr. Dennis Grewe | XI. Funktionen Fortgeschritten - Call-By-Value / Reference |Modul Programmieren IEP/ISB/SWB/TIB 3 ZIELE l Verstehen von erweiterten Konzepten zur Erstellung von Funktionen l Verstehen des Unterschiedes von pass-by-value und pass-by-reference l Übergabe von Funktionsparameter als Wert l Übergabe von Funktionsparameter als Referenz (Adresse) l Anwenden des gelernten in kleineren Programmen 18.11.2024 Prof. Dr. Dennis Grewe | XI. Funktionen Fortgeschritten - Call-By-Value / Reference |Modul Programmieren IEP/ISB/SWB/TIB 4 QUIZ: POINTER https://partici.fi/53586015 [Bild von vecstock auf Freepik] 18.11.2024 Prof. Dr. Dennis Grewe | XI. Funktionen Fortgeschritten - Call-By-Value / Reference |Modul Programmieren IEP/ISB/SWB/TIB 5 FUNKTIONEN UND ARGUMENTE (FORTGESCHRITTEN) PASS-BY-VALUE VS. PASS-BY-REFERENCE 6 MOTIVATION l Folgendes Programmcodebeispiel zur Berechnung der Kubikzahlen ist gegeben: float cube(float f) { float ret = f * f * f; Lokale Variable f hat gleichen return ret; Wert wie i aus main Funktion, } allerdings eine andere Adresse. int main(void) { float y; for (float i = 0.; i < 10.; i = i + 1.) { printf("\n%2f^3=%8.0f", i, cube(i)); } return 0; } 18.11.2024 Prof. Dr. Dennis Grewe | XI. Funktionen Fortgeschritten - Call-By-Value / Reference |Modul Programmieren IEP/ISB/SWB/TIB 7 EINFÜHRUNG: PASS-BY-VALUE l Jeder Parameter einer Funktion wird in C standardmäßig wie eine lokale Variable behandelt. l Der Wert des Funktionsparameters wird beim Aufruf in die lokale Variable kopiert. l Dies wird als pass-by-value bezeichnet. l Die Funktion arbeitet mit diesen lokalen Variablen, die am Ende der Funktion wieder aus dem Stack gelöscht werden. l Frage: Was wenn die Funktion etwas ändern soll. Änderungen an der Kopie sind nicht sinnvoll, da sie nicht an die Umgebung zurückgegeben werden. Wir kennen bislang nur return als Möglichkeit. 18.11.2024 Prof. Dr. Dennis Grewe | XI. Funktionen Fortgeschritten - Call-By-Value / Reference |Modul Programmieren IEP/ISB/SWB/TIB 8 DEFINITION: PASS-BY-VALUE VS. PASS-BY-REFERENCE l Betrachten wir den Umgang von Variablen zu Funktionen genauer. Was wäre wenn wir statt Werte von Variablen, Referenzen auf Speicheradressen übergeben? l pass/call-by-value: Bedeutet, dass der Wert (hier: eine Kopie) einer Variablen an eine Funktion übergeben wird. l pass/call-by-reference: Bedeutet, dass die Referenz zur Variable im Speicher, und somit auch zum Wert, an eine Funktion übergeben wird. 18.11.2024 Prof. Dr. Dennis Grewe | XI. Funktionen Fortgeschritten - Call-By-Value / Reference |Modul Programmieren IEP/ISB/SWB/TIB 9 BEISPIEL: PASS-BY-VALUE – INCREMENT_PBV.C Wert der Variablen number in main wird nicht verändert. Wert in number wird kopiert und an increment-Funktion übergeben. 18.11.2024 Prof. Dr. Dennis Grewe | XI. Funktionen Fortgeschritten - Call-By-Value / Reference |Modul Programmieren IEP/ISB/SWB/TIB 10 PASS-BY-REFERENCE l Pass-by-Reference bedeutet, dass die Referenz zur Variable im Speicher und somit auch zum Wert, an eine Funktion übergeben wird. Dies bietet der Funktion die Möglichkeit den ursprünglichen Wert zu ändern. Folgende Änderungen müssen im Programmcode angepasst werden: l Beim Funktionsaufruf in main wird die Adresse der Variable mittels Adressoperator “&“ übergeben. l Funktionsprototyp muss angepasst werden, sodass eine Adresse statt eines Wertes erwartet wird. Parameter wird mittels Sternoperator “*“ als Referenzvariable definiert. 18.11.2024 Prof. Dr. Dennis Grewe | XI. Funktionen Fortgeschritten - Call-By-Value / Reference |Modul Programmieren IEP/ISB/SWB/TIB 11 BEISPIEL: PASS-BY-REFERENCE – INCREMENT_PBR.C increment-Funktion erwartet eine Adresse als Übergabeparameter – Parameter ist als Referenzvariable/Pointer “*” definiert. Übergabe der Adresse der Variable number an increment-Funktion mittels Adressoperator “&”. 18.11.2024 Prof. Dr. Dennis Grewe | XI. Funktionen Fortgeschritten - Call-By-Value / Reference |Modul Programmieren IEP/ISB/SWB/TIB 12 PASS-BY-REFERENCE l Wenn Adressen als Werte an Funktionen übergeben werden dann …: l … muss der Parametertyp ein Zeigertyp einer Referenzvariable sein. l … wird die Adresse beim Aufruf der Funktion in die lokale Pointer-Variable / Referenzvariable kopiert. l … kann mittels Dereferenzierung die Funktion auf der eigentlichen Variablen außerhalb der Funktion arbeiten. l … können Änderungen an dieser Variablen auch noch nach dem Funktionsaufruf erhalten bleiben. 18.11.2024 Prof. Dr. Dennis Grewe | XI. Funktionen Fortgeschritten - Call-By-Value / Reference |Modul Programmieren IEP/ISB/SWB/TIB 13 DEFINITION: PASS-BY-VALUE VS. PASS-BY-REFERENCE (II) l Betrachten wir den Umgang von Variablen zu Funktionen genauer. Was wäre wenn wir statt Werte von Variablen, Referenzen auf Speicheradressen übergeben? l pass/call-by-value: Bedeutet, dass der Wert (hier: eine Kopie) einer Variablen an eine Funktion übergeben wird. l pass/call-by-reference: Bedeutet, dass die Referenz zur Variable im Speicher, und somit auch zum Wert, an eine Funktion übergeben wird. Mittels Dereferenzierung kann die Funktion auf den eigentlichen Wert der Variable zugreifen. Damit bleiben Änderungen an dieser Variablen auch nach dem Funktionsaufruf erhalten. 18.11.2024 Prof. Dr. Dennis Grewe | XI. Funktionen Fortgeschritten - Call-By-Value / Reference |Modul Programmieren IEP/ISB/SWB/TIB 14 BEISPIEL: PASS-BY-VALUE – INCREMENT_PBV.C Wert der Variablen number in main wird nicht verändert. Wert in number wird kopiert und an increment-Funktion übergeben. 18.11.2024 Prof. Dr. Dennis Grewe | XI. Funktionen Fortgeschritten - Call-By-Value / Reference |Modul Programmieren IEP/ISB/SWB/TIB 15 ARRAYS UND FUNKTIONEN ARRAYS ALS PARAMETER UND RÜCKGABEWERTE (?) 16 MOTIVATION l Wir erinnern uns an das Problem aus dem Foliensatz Arrays: l Problem: Wir können keine Funktion schreiben, die zwei oder mehrere Vektoren/Punkte addiert: ??? add2DPoints(int p1_x, int p1_y, int p2_x, int p2_y) { int p3_x = p1_x + p2_x; int p3_y = p1_y + p2_y; return ???; // zwei Werte zurück geben gibt es nicht in C } l Lösung: Arrays können– ähnlich zu Variablen – auch an Funktionen übergeben werden. C erlaubt allerdings keine Arrays als Rückgabewerte. 18.11.2024 Prof. Dr. Dennis Grewe | XI. Funktionen Fortgeschritten - Call-By-Value / Reference |Modul Programmieren IEP/ISB/SWB/TIB 17 BEISPIEL l Problem: Um Grenzen von Arrays zu wahren sollte die Länge des Arrays bekannt sein. l Länge als separaten Wert übergeben l Alternative: Feste Kodierung der Größe durch Angabe in der Funktion oder Definition einer globalen Variablen l All das hat eingeschränkte Flexibilität bei fester Länge zur Folge und stellt keine elegante Lösung dar. 18.11.2024 Prof. Dr. Dennis Grewe | XI. Funktionen Fortgeschritten - Call-By-Value / Reference |Modul Programmieren IEP/ISB/SWB/TIB 18 VERSTÄNDNIS ARRAYS: PASS-BY-VALUE VS. PASS-BY-REFERENCE l Betrachten wir den Umgang von Array-Variablen zu Funktionen genauer im Kontext pass-by-value vs. pass-by-reference: l pass/call-by-value: Bedeutet, dass der Wert einer Variablen an eine Funktion übergeben wird. Sicher gegen Manipulation im Speicher, schlechte Performanz bei sehr großen Arrays, da jeder einzelne Wert kopiert werden muss. l pass/call-by-reference: Bedeutet, dass die Referenz zur Variable im Speicher, und somit auch zum Wert, an eine Funktion übergeben wird. Dies bietet der Funktion die Möglichkeit den ursprünglichen Wert zu ändern. 18.11.2024 Prof. Dr. Dennis Grewe | XI. Funktionen Fortgeschritten - Call-By-Value / Reference |Modul Programmieren IEP/ISB/SWB/TIB 19 ARRAYS SIND IMMER PASS-BY-REFERENCE IN C l In C werden Arrays immer nach dem Prinzip pass-by-reference verarbeitet. l Übergabe (auch wenn nicht mit “*“-Operator) bedeutet Startadresse als formaler Parameter l gleicher Parameter (in Funktion) referenziert das Array l KEINE Erstellung einer Kopie des Arrays l Nicht direkt ersichtlich bei der Verwendung im Vergleich zu Referenzvariablen. // pass array to functions is allowed in C ??? add2DPoints(const int array[]) { int array; return ???; } 18.11.2024 Prof. Dr. Dennis Grewe | XI. Funktionen Fortgeschritten - Call-By-Value / Reference |Modul Programmieren IEP/ISB/SWB/TIB 20 ARRAYS SIND IMMER PASS-BY-REFERENCE IN C l Übergabe von Arrays mittels Array-Deklaration: // pass array to functions is allowed in C void add2DPoints(const int array[]) { printf(“%d“, array); } Ist äquivalent zu Pointer-Deklaration: // pass array to functions is allowed in C void add2DPoints(int* array) { printf(“%d“, array); } Da bei Arrays mittels pass-by-reference, immer eine Speicheradresse übergeben wird. 18.11.2024 Prof. Dr. Dennis Grewe | XI. Funktionen Fortgeschritten - Call-By-Value / Reference |Modul Programmieren IEP/ISB/SWB/TIB 21 BEWEIS: ARRAYS UND FUNKTIONEN SIND PASS-BY-REFERENCE! Wert Wertder derVariablen x wird alsinpass-by- Variable number main value behandelt; wird 1. Element nicht verändert. Wertininarray wird wird durch number kopiert und an modifyArray() increment-Funktion verändert. übergeben. Array ist pass-by-reference. 18.11.2024 Prof. Dr. Dennis Grewe | XI. Funktionen Fortgeschritten - Call-By-Value / Reference |Modul Programmieren IEP/ISB/SWB/TIB 22 FEHLERQUELLEN ARRAYS MIT PASS-BY-REFERENCE l Während das Prinzip pass-by-reference die Performance erhöht (da keine Kopie von Werten im Hintergrund entstehen), so birgt das Prinzip potentielle Fehlerquellen: l Aufgerufene Funktionen können Array verändern l Datenkonsitenz kann nicht sichergestellt werden l Mit Hilfe von const kann das Array als Konstante definiert werden l const = nicht veränderbar; ein Array kann nicht modifiziert werden l Der Compiler überwacht Verstöße l Gleicher Parameter (in Funktion) referenziert das Array l Keine Erstellung einer Kopie des Arrays 18.11.2024 Prof. Dr. Dennis Grewe | XI. Funktionen Fortgeschritten - Call-By-Value / Reference |Modul Programmieren IEP/ISB/SWB/TIB 23 PASS-BY-REFERENCE MIT CONST à ERROR WertDurch der Variablen const ist arrayinnicht number main wird nicht verändert. modifizierbar. FehlerWert wird in zur number wird kopiert Übersetzungszeit durchund an Compiler increment-Funktion übergeben. identifiziert. 18.11.2024 Prof. Dr. Dennis Grewe | XI. Funktionen Fortgeschritten - Call-By-Value / Reference |Modul Programmieren IEP/ISB/SWB/TIB 24 ARRAY ALS RÜCKGABEPARAMETER (I) l In C, können wir Arrays als Funktionsparameter übergeben. Wie sieht es jedoch mit Arrays als Rückgabeparameter aus? // pass array to functions is allowed in C int[] modify_array(const int array[]) { array = 42; // modify value in array return array; // return array is not allowed in C } 27.10.2024 Prof. Dr. Dennis Grewe | XI. Funktionen Fortgeschritten - Call-By-Value / Reference |Modul Programmieren IEP/ISB/SWB/TIB 25 ARRAY ALS RÜCKGABEPARAMETER (II) l In C, können wir Arrays als Funktionsparameter übergeben. Wie sieht es jedoch mit Arrays als Rückgabeparameter aus? // pass array to functions is allowed in C int[] modify_array(const int array[]) { array = 42; // modify value in array return array; // return array, but this is not allowed in C } l Mögliche Lösung: Übergabe eines weiteren Array (z.B.: „Ergebnis-Array“) als Parameter an die Funktion. Mittels pass-by-value kann das „Ergebnis-Array“ durch die Funktion modifiziert werden. Die Ergebnisse können später aus dem Array verarbeitet werden (z.B.: Ausgabe auf Konsole). 27.10.2024 Prof. Dr. Dennis Grewe | XI. Funktionen Fortgeschritten - Call-By-Value / Reference |Modul Programmieren IEP/ISB/SWB/TIB 26 ARRAY ALS RÜCKGABEPARAMETER (III) l In C, können wir Arrays als Funktionsparameter übergeben. Wie sieht es jedoch mit Arrays als Rückgabeparameter aus? // pass array to functions is allowed in C void modify_array(const int array[], int result[]) { result = array + 42; // modify value in array // return array; func does not return anything } l Mögliche Lösung: Übergabe eines weiteren Array (z.B.: „Ergebnis-Array“) als Parameter an die Funktion. Mittels pass-by-value kann das „Ergebnis-Array“ durch die Funktion modifiziert werden. Die Ergebnisse können später aus dem Array verarbeitet werden (z.B.: Ausgabe auf Konsole). 27.10.2024 Prof. Dr. Dennis Grewe | XI. Funktionen Fortgeschritten - Call-By-Value / Reference |Modul Programmieren IEP/ISB/SWB/TIB 27 KOPIEREN VON ARRAYS l Arrays können nicht einfach durch das Zuweisen einer Variable kopiert werden – bedenke pass-by-reference. Eine Zuweisung kopiert nur den Startpunkt eines Arrays im Speicher: int main() { int my_array[] = {1, 2, 3}; // my_array with capacity 3 and values 1,2,3 int new_array; // new array with capacity 3 new_array = my_array; // NOT OK USING ASSIGNMENT OPERANT “=“ } l Mögliche Lösung: l Jedes Element in einem Array muss einzeln kopiert und in ein neues Array überführt werden. 27.10.2024 Prof. Dr. Dennis Grewe | XI. Funktionen Fortgeschritten - Call-By-Value / Reference |Modul Programmieren IEP/ISB/SWB/TIB 28 BEISPIEL KOPIEREN WERTE IN ARRAY: REVERSE_ARRAY.C 27.10.2024 Prof. Dr. Dennis Grewe | XI. Funktionen Fortgeschritten - Call-By-Value / Reference |Modul Programmieren IEP/ISB/SWB/TIB 29 BEISPIEL KOPIEREN WERTE IN ARRAY: REVERSE_ARRAY.C 18.11.2024 Prof. Dr. Dennis Grewe | XI. Funktionen Fortgeschritten - Call-By-Value / Reference |Modul Programmieren IEP/ISB/SWB/TIB 30 ZUSAMMENFASSUNG l Vorstellung des Konzeptes call/pass-by-reference und call/pass-by-value l Vorstellung der Herausforderungen von Übergabeparemeter mittels Wert und Adresse in Programmiersprache C l Vorstellung des Umgangs mit Arrays als Übergabeparameter, welche in der Programmiersprache C standardmäßig mittels pass-by-reference behandelt werden l Übungen im Rahmen kleinerer Programme 18.11.2024 Prof. Dr. Dennis Grewe | XI. Funktionen Fortgeschritten - Call-By-Value / Reference |Modul Programmieren IEP/ISB/SWB/TIB 31

Use Quizgecko on...
Browser
Browser