Praxisorientierte Einführung in C++ (Variadische Funktionen)

Ähnliche Dokumente
Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 29

Polymorphismus 44. Function.hpp. #include <string>

Polymorphismus 179. Function.h. #include <string>

Objektorientierte Programmierung mit C++ SS 2007

Vorlesungsprüfung Programmiersprache 1

Überladene Funktionen und Operatoren

Programmieren in C++ Templates

Informatik I (D-ITET)

Auswahlen (Selektionen)

Computergrundkenntnisse und Programmieren, WS 07/08, Übung 11: Klassen der Standardbibliothek 2

Programmiertechnik. Teil 4. C++ Funktionen: Prototypen Overloading Parameter. C++ Funktionen: Eigenschaften

Schriftlicher Test (120 Minuten) VU Einführung ins Programmieren für TM. 23. Januar 2017

Objektorientierte Programmierung

Schriftlicher Test (120 Minuten) VU Einführung ins Programmieren für TM. 25. Jänner 2016

Ein paar Kleinigkeiten zum Einstieg

C++ Teil 5. Sven Groß. 12. Nov IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Nov / 16

C++ vs. Java. Hello world! Java C++ class HelloWorld { static public void main(string args) { System.out.println("Hello World!

C++ Teil 4. Sven Groß. 30. Apr IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Apr / 16

Propädeutikum. Dipl.-Inf. Frank Güttler M. Sc. Stephan Fischer

Praxisorientierte Einführung in C++ Lektion: "Namespaces"

JAVA BASICS. 2. Primitive Datentypen. 1. Warum Java? a) Boolean (logische Werte wahr & falsch)

Ein kleiner Blick auf die generische Programmierung

Kapitel 13. Definition von Klassen. OOP Thomas Klinker 1

Lösungen Übung 5. Programmieren in C++ 1. Aufgabe. #include <iostream.h> #include <stdarg.h>

Einführung in C. Alexander Batoulis. 5. Mai Fakutltät IV Technische Universität Berlin

9. Funktionen Teil II

C++ Notnagel. Ziel, Inhalt. Programmieren in C++

Wiederholung, Abbruch von Schleifen, switch-anweisung Datentypen, char, formatierte Ausgabe

Metaprogrammierung in C/C++

C++ Teil 5. Sven Groß. 13. Mai Sven Groß (IGPM, RWTH Aachen) C++ Teil Mai / 18

Einführung Sprachfeatures Hinweise, Tipps und Styleguide Informationen. Einführung in C. Patrick Schulz

JAVA BASICS. 2. Primitive Datentypen. 1. Warum Java? a) Boolean (logische Werte wahr & falsch)

Einführung in die Programmierung Wintersemester 2008/09

Delegates. «Delegierter» Methoden Schablone Funktionszeiger. Dr. Beatrice Amrhein

Funktionales C++ zum Ersten

Einstieg in die Informatik mit Java

! können default arguments haben: ein Endstück der Argumentliste einer Deklaration mit Wertevorgaben

Programmieren - C++ Templates

Vererbung I. Kfz Eigenschaften und Methoden der Klasse Kfz Lkw. Pkw. Eigenschaften und Methoden der Klasse Kfz

Verwenden Sie für jede Aufgabe die C++ IDE von Eclipse (pro Aufgabe ein Projekt).

PVK Informatik I 1.Teil. Grundlagen Variablen Operatoren Fallunterscheidung Schleifen Kurzschreibweise Pointer Array Dynamische Strukturen Funktionen

C++ Teil 6. Sven Groß. 27. Mai Sven Groß (IGPM, RWTH Aachen) C++ Teil Mai / 14

Einstieg in die Informatik mit Java

Variablen, Konstanten und Datentypen

JAVA BASICS. 2. Primitive Datentypen. 1. Warum Java? a) Boolean (logische Werte wahr & falsch)

Repetitorium Programmieren I + II

Abend 4 Übung : Erweitern von Klassen durch Vererbung

Programmierung und Angewandte Mathematik

Wiederholung Wozu Methoden? Methoden Schreiben Methoden Benutzen Rekursion?! Methoden. Javakurs 2012, 3. Vorlesung

Ziele sind das Arbeiten mit Funktionen (Modularisierung, Parameterübergabe), sowie - Reihentyp (Array)

Standardbibliotheken. Datentyp bool. Eingaben 2/2. Eingaben 1/2. In C gibt es keinen logischen Datentyp

Objektorientierte Anwendungsentwicklung

Praxisorientierte Einführung in C++ Lektion: "Klassen Templates"

Wo und wie lange leben Objekte? globale Objekte lokale Objekte dynamische Objekte

Die C++ Standard Template Library Andreas Obrist

Klausur in Programmieren

Hochschule Darmstadt Informatik-Praktikum SS 2018 EIT Bachelor 3. Aufgabenblatt Funktionen - Unterprogramme

Übung Notendarstellung

Klausur: Grundlagen der Informatik I, am 06. Februar 2009 Gruppe: A Dirk Seeber, h_da, Fb Informatik. Nachname: Vorname: Matr.-Nr.

Entwickeln Sie ein C/C++-Programm für die Verwaltung einer Artikeldatei gemäß folgender Vorgaben!

1.4. Funktionen. Objektorientierte Programmierung mit C++

Klausur: Grundlagen der Informatik I, am 06. Februar 2009 Gruppe: B Dirk Seeber, h_da, Fb Informatik. Nachname: Vorname: Matr.-Nr.

Angewandte Mathematik und Programmierung

Klausur: Grundlagen der Informatik I, am 06. Februar 2009 Gruppe: A Dirk Seeber, h_da, Fb Informatik. Nachname: Vorname: Matr.-Nr.

Programmieren II Abstrakte Klassen / Virtuelle Methoden. Programmieren II Abstrakte Klassen / Virtuelle Methoden

Einführung in die Programmierung

Grundlagen der Informatik 11. Zeiger

Programmierkurs C++ Lösungen zum Übungsblatt 3. Nils Eissfeldt und Jürgen Gräfe. 2. November Aufgabe 5

C++ Teil 2. Sven Groß. 16. Apr IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Apr / 22

Herzlich willkommen!

Grundelemente objektorientierter Sprachen (1)

Lösung der OOP-Prüfung WS12/13

Überladen von Operatoren

C++ Teil 7. Sven Groß. 30. Nov Sven Groß (IGPM, RWTH Aachen) C++ Teil Nov / 13

5. Behälter und Iteratoren. Programmieren in C++ Überblick. 5.1 Einleitung. Programmieren in C++ Überblick: 5. Behälter und Iteratoren

Programmieren in C++ Überblick

Nachklausur: Grundlagen der Informatik I, am 02. April 2008 Dirk Seeber, h_da, Fb Informatik. Nachname: Vorname: Matr.-Nr.

Nachklausur: Grundlagen der Informatik I, am 02. April 2008 Dirk Seeber, h_da, Fb Informatik. Nachname: Vorname: Matr.-Nr.

Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny

Programmieren 2 C++ Überblick

Informatik - Übungsstunde

C++ Teil 12. Sven Groß. 18. Jan Sven Groß (IGPM, RWTH Aachen) C++ Teil Jan / 11

Hydroinformatik I: Klassen

Klausur: Programmieren II

C/C++-Programmierung

Konzepte der Programmiersprachen

10.4 Konstante Objekte

Praktische Informatik 3: Funktionale Programmierung Vorlesung 4 vom : Typvariablen und Polymorphie

Problem: Vererbung erlaubt die Wiederverwendung d von Programmcode, virtuelle Funktionen ermöglichen dabei den Austausch gewisser Funktionalität

Inoffizielle Lösung zur Informatik I Prüfung Frühlingssemester 2010 Freitag, 13. August May 23, 2011

DAP2-Programmierpraktikum Einführung in C++ (Teil 1)

Klausur: Informatik I am 06. Februar 2009 Gruppe: D Dirk Seeber, h_da, Fb Informatik. Nachname: Vorname: Matr.-Nr.: Punkte:

3. Semester : 1. Prüfung

7. Übung Informatik II - Objektorientierte Programmierung

Programmieren - C++ Funktions-Templates

Programmiertechnik Erweiterungen in Java 5

Thema heute: Vererbung und Klassenhierarchien. Abgeleitete Klassen. Vererbung von Daten und Funktionen. Virtuelle Funktionen

Repetitorium Programmieren I + II

Arrays (Felder/Vektoren)

Transkript:

Praxisorientierte Einführung in C++ (Variadische Funktionen) Christoph Elbrechter, Florian Paul Schmidt Universität Bielefeld April 12, 2012 Christoph Elbrechter, Florian Paul Schmidt Praxisorientierte Einführung in C++ (onen) April 12, 2012 1 / 15

überblick onen Motivation Syntax Beispiel printf-light Diskussion Alternativen Christoph Elbrechter, Florian Paul Schmidt Praxisorientierte Einführung in C++ (onen) April 12, 2012 2 / 15

Funktionen abstrahierten bislang über... Werte void draw_cicle ( int cx, int cx, int radius ); Typen template < class T> void show ( const T & t); Christoph Elbrechter, Florian Paul Schmidt Praxisorientierte Einführung in C++ (onen) April 12, 2012 3 / 15

Bisher noch nicht möglich: Abstraktion über die Anzahl von Parametern Das ist natürlich durch überladung möglich Oder Default-Parameter Christoph Elbrechter, Florian Paul Schmidt Praxisorientierte Einführung in C++ (onen) April 12, 2012 4 / 15

Überladung (nicht so schön!) überladung 1 int * create_tuple ( int a) { 2 int * p = new int [1]; 3 p [0] = a; 4 return p; 5 } 6 7 int * create_tuple ( int a, int b){ 8 int * p = new int [2]; 9 p [0]= a; p [1]= b; 10 return p; 11 } 12 int * crate_tuple ( int a,int b, int c ){... } usw. Christoph Elbrechter, Florian Paul Schmidt Praxisorientierte Einführung in C++ (onen) April 12, 2012 5 / 15

Einen guten Ausweg bieten hier sog. variadische Funktionen Diese bieten darüber hinaus auch noch die Möglichkeit über die Typen der Parameter zu abstrahieren (aber eher krude) Christoph Elbrechter, Florian Paul Schmidt Praxisorientierte Einführung in C++ (onen) April 12, 2012 6 / 15

Syntax RueckgabeTyp bezeichner ( ParameterListe,...) Man beachte die Punkte, sie sind Teil der Syntax in diesem Fall ParameterListe darf hier nicht leer sein, muss also mindestens ein Typ Bezeichner -Paar enthalten Beispiel: void printf ( const char *fmt,...); Christoph Elbrechter, Florian Paul Schmidt Praxisorientierte Einführung in C++ (onen) April 12, 2012 7 / 15

Implementation an einem Beispiel on 1 int * create_tuple ( int n,...){ 2 va_list l; 3 va_start (l, n); 4 int *p = new int [n]; 5 for ( int i =0;i<n ;++ i){ 6 p[i] = va_arg (l,int ); 7 } 8 va_end (l); 9 return p; 10 } 11 12 int main (){ 13 int * t1 = create_tuple (5,1,2,3,4,5); 14 int * t2 = create_tuple (2,10,20); 15 } Christoph Elbrechter, Florian Paul Schmidt Praxisorientierte Einführung in C++ (onen) April 12, 2012 8 / 15

Implementation für unterschiedliche Parametertypen Problem: Innerhalb der Implementation kann nicht ermittelt werden um welchen Typ es sich tatsächlich handelt Ausweg durch Format-String Hier demonstriert an einer light-version von printf Christoph Elbrechter, Florian Paul Schmidt Praxisorientierte Einführung in C++ (onen) April 12, 2012 9 / 15

printf() - Light 1 using namespace std ; 2 void printf_light ( const char *fmt,...){ 3 va_list l; 4 va_start (l, fmt ); 5 while (* fmt ){ 6 switch (* fmt ){ 7 case i : cout << va_arg (l, int ); break ; 8 case d : cout << va_arg (l, double ); break ; 9 case l : cout << va_arg (l, long ); break ; 10 case u : cout << va_arg (l, unsigned int ); break ; 11 case x : cout << va_arg (l, unsigned long ); break ; 12 case p : cout << va_arg (l, void *); break ; 13 default : 14 cerr << " unknown format char!" << endl ; 15 va_end ( l); return ; 16 } 17 fmt ++; cout <<, ; 18 } 19 cout << std :: endl ; va_end ( l); 20 } Christoph Elbrechter, Florian Paul Schmidt Praxisorientierte Einführung in C++ (onen) April 12, 2012 10 / 15

Verwendung... Benutzung von printf() - Light 21 int main (){ 22 printf_light (" iid ",42,666,4.3); 23 24 vector <int > * v = new vector <int >(7); 25 printf_light ("up",v-> size (),v); 26 } Ausgabe: 42,666,4.3, 7,0 x804b008, Christoph Elbrechter, Florian Paul Schmidt Praxisorientierte Einführung in C++ (onen) April 12, 2012 11 / 15

Grösstes Problem: onen unterstützen nur POD-Typen (und davon nicht mal alle richtig) Unterstützte Typen: int,uint,long,ulong,double,void* Theoretisch können ja Pointer auf beliebige Typen über das void* Interface geschleust werden Allerdings: Fehlerträchtig + Umständlich Christoph Elbrechter, Florian Paul Schmidt Praxisorientierte Einführung in C++ (onen) April 12, 2012 12 / 15

Weitere Nachteile: Laufzeit-parsen von eigentlich festen Typen relativ ineffizient Programmabsturz falls nicht POD-Referenz/Objekt übergeben wird Aber das richtige printf und die verwandte Funktion sprintf ist relativ mächtig und kompakt, wenn formatierte Ausgaben erstellt werden sollen Christoph Elbrechter, Florian Paul Schmidt Praxisorientierte Einführung in C++ (onen) April 12, 2012 13 / 15

Alternativen: Daten in einen Container packen void show ( std :: vector <int > data ); Templates Template 27 template < class A, class B, class C, class D, class E> 28 void show ( const A &a, const B& b usw..){ 29 std :: cout << a <<, << b <<, << usw.. 30 } (Im C++-1x-Standard wird es dann auch variadische Template geben) Christoph Elbrechter, Florian Paul Schmidt Praxisorientierte Einführung in C++ (onen) April 12, 2012 14 / 15

Alternativen: überladen von Operatoren std :: cout << 3 << 4.5 << " hallo " << std :: endl Aber das ist nur syntaktischer Zucker für konsekutive Funktionsaufrufe Arbiträre Datentypen QVariant, boost::any Eigentlich sind variadische Funktionen nicht soooo beliebt bei C++-Programmierern Christoph Elbrechter, Florian Paul Schmidt Praxisorientierte Einführung in C++ (onen) April 12, 2012 15 / 15