C++Guns – RoboBlog blogging the bot

22.08.2017

C++ für Anfänger&Profis - Container mit Ganzzahl

Filed under: Allgemein — Tags: — Thomas @ 15:08

Im zweiten Beispiel beschäftigen wir uns damit, wie es möglich ist, beliebig viele Zahlen gleichzeitig zu speichern. Dazu wird ein Container benötigt. C++ bietet hierfür unter anderem die Klasse vector an. Im folgenden Beispiel wird ein vector vom Typ int, der Länge 5 angelegt und ihn mit den Zahlen 1 bis 5 befüllt. Zu beachten ist, dass C++ von 0 ab zählt. Das heißt, die erste Zahl im vector steht an Position 0. Und die fünfte Zahl an Position 4.

Die Variable a vom Typ int kann hingegen nur eine einzige Zahl, zur selben Zeit, speichern.

// Testausgabe
#include <iostream>
// Datencontainer
#include <vector>

using namespace std;

int main() {    
    int a = 1;

    vector<int> b(5);
    b.at(0) = 1;
    b.at(1) = 2;
    b.at(2) = 3;
    b.at(3) = 4;
    b.at(4) = 5;

    cout << "Variable a ist " << a << endl;
    cout << "Variable b bei Index 4 ist " << b.at(4) << endl;
}

In Zeile 9 wird eine ganzzahlige Variable namens a vom Typ int deklariert und mit dem Wert 1 initialisiert.

In Zeile 11 wird ein Container Variable names b vom Typ vector deklaiert und mit Größe von 5 initialisiert. Die einzelnen Elemente werden default initialisiert, in diesem Fall mit dem Wert 0.
In Zeile 12 bis 16 wird jedem Element im vector Container ein spezieller Wert zugewiesen. Der Zugriff auf ein spezielles Element erfolgt über die Funktion at(), welche den Index des Elements entgegen nimmt. Der erste Index ist die 0. Der fünfte Index die 4.
In Zeile 18 und 19 findet eine Kontrollausgabe statt.

Troubleshooting
===============

Der Zugiff auf ein vector Element welches nicht existiert führt zu einer Fehlermeldung und das Beendes des Programms. todo

21.08.2017

C++ für Anfänger&Profis - Hello World! - Details

Filed under: Allgemein — Tags: — Thomas @ 15:08

Wie anfangs erwähnt gibt es für jedes Beispiel eine extra Seite mit Details. Über Performance kann ich bei einem Hello World! Programm wenig sagen, aber dennoch gibt es ein paar Sachen zu erwähnen. Schauen wir uns den Code noch einmal an:

#include <iostream>
#include <vector>

using namespace std;

int main() {
    cout << "Hello World!" << endl;
}

Die #include Anweisungen sind gang und gäbe. Aber bald nicht mehr nötig. Module ersetzen die uralten Proprocessor Direktiven [1].
Der Rückgabetyp von main ist int und nicht void! Das ist so im Standard festgelegt und war noch nie anders.
Die main Funktion darf keine, zwei, oder sogar drei Argumente haben. Das dritte Argument ist Compiler Implementationsabhängig und könnte zu den Umgebungsvariablen zeigen.
cout ist eine mit extern deklarierte globale Variable. Dabei wird doch immer gesagt, man solle so etwas nicht tun. Neben cout gibt es noch wcout, cerr, wcerr, clog, wclor, cin, wcin. Das w steht für wide character.
Die Funktion endl bewirkt nicht nur ein Zeilenumbruch, sondern auch ein flush.
Als einzige Funktion darf main kein return enthalten. Ist es nicht explicit enthalten, wird implicit return 0 benutzt.

[1] https://gcc.gnu.org/wiki/cxx-modules

20.08.2017

C++ für Anfänger&Profis - Hello World!

Filed under: Allgemein — Tags: — Thomas @ 07:08

Das traditionell erstes Programm in einer neuen Programmiersprache gibt den Satz "Hello World!" am Bildschirm aus. Daran wollen wir uns halten. Ohne Umschweife hier der Code. Eintippen, compilieren, starten und freuen.

#include <iostream>
#include <vector>

using namespace std;

int main() {
    cout << "Hello World!" << endl;
}

Da es das erste Beispiel ist, werde ich hier jede Zeile Code und jedes kryptische Zeichen erklären.
In den ersten beiden Zeilen stehen #include Anweisungen. Diesen binden die Dateien iostream und vector von C++ ein. Die Datei iostream bietet Funktionen für die Textausgabe an, während vector einen Datencontainer anbietet. Dieser wird im nächsten Beispiel benötigt.

Zeile 4 sagt aus, dass nun der Namensraum std genutzt werden soll. Alle C++ Funktionen liegen in diesem Namensraum. Das dient zur Vermeidung von Namenskonflikten, wenn später andere Frameworks genutzt werden sollen, die gleiche Funktionsnamen wie in C++ anbieten.

In Zeile 6 geht nun das Hauptprogramm los, das immer eine Funktion namens main ist. Alle Codezeilen, die in dem Paar geschweifter Klammern zwischen Zeile 6 und 8 stehen, gehören zur main Funktion und werden ausgeführt. Die Zeile 7 wird mit vier Leerzeichen eingerückt um dem Leser deutlich zu machen, dass sie im Hauptprogramm stehen. Für den Compiler haben diese Leerzeichen keine Bedeutung.

Zeile 7 ist das Kernstück vom Programm, welche die eigentliche Textausgabe macht. Die Variable cout wird von C++ bereit gestellt und soll sozusagen den Bildschirm repräsentieren, auf welcher der Text erscheinen soll. Die beiden nachfolgenden spitzen Klammern << sind Stream Operatoren. Mit ihnen schiebt man sozusagen den Text auf den Bildschirm. Gleich darauf folgt der eigentliche Text "Hello World!" in doppelten Hochkomma eingeschlossen. Jeder Text der im Programm so verarbeitet werden soll, muss mit doppelten Hochkomma eingeschlossen sein. Damit wird dieser Text zu einem string, der vom Computer verarbeitet werden kann.

Das Ende vom Zeile 7 besteht aus einem zweiten Stream Operator und der Funktion endl, welche einfach ein Zeilenumbruch einfügt.

Beachte wann ein Semikolon gesetzt wird. Einmal bei der using Anweisung und einmal bei cout. Nicht benötigt wird das Semikolon bei der #include Anweisung und bei der öffnenden und schließenden geschweiften Klammern der main Funktion.

Gratulation, dein erstes C++ Programm!

C++ für Anfänger&Profis - Grundsätzliches

Filed under: Allgemein — Tags: — Thomas @ 07:08

Ein paar grundsätzliche Worte über die Sprache C++. Anders als z.B. Python oder PHP ist C++ eine statisch, stark typisierte Sprache.
Das heißt, dass zum Zeitpunkt, wenn der Compiler den Code compiliert, jede Variable einen Type haben muss. Damit ist es möglich Fehler schon während der Entwicklung zu entdecken, bevor das lauffähige Programm existiert. Und nicht erst Jahre später, oder sogar beim Endanwender. Weiterhin eröffnet diese Typisierung viele Optimierungsmöglichkeiten um den beachtlichen Geschwindigkeitsvorteil von C++ nutzen zu können.
So ist es z.B. nicht möglich, einer Variablen, welche eine ganze Zahl darstellen soll, einen Text zuzuweisen. Dafür ist es auf der anderen Seite aber auch nicht direkt möglich, einer Variablen, welche ein Text darstellen soll, eine ganze Zahl zuzuweisen. Diese Absicht muss im Code durch eine zusätzliche Funktion dargestellt werden.
Dadurch entstehen bei der Typ Prüfung während des Compiliervorgangs keine Fehler. Die Intention des Programmierers wird deutlich und der Code bleibt sauber.

So gut wie jede Zeile in C++ wird mit einem Semikolon abgeschlossen. Das bereitet den meisten Anfänger Probleme, was ich aber gar nicht nachvollziehen kann. So wird in der deutschen Sprache jeder Satz mit einem Satzzeichen beendet PUNKT. Analog dazu wird in C++ eine Zeile Code mit einem Semikolon beendet;

Der Compiler an sich ist neben der Entwicklungsumgebung das wichtigste Programm. Es muss nicht nur der komplette Code analysiert und in ein lauffähiges Programm umgewandelt werden, es müssen auch Programmierfehler behandelt werden. Leider ist die Compilerausgabe in dieser Hinsicht sehr kryptisch. Aus diesem Grund gibt es im Anhang eine Liste aller gängigen Fehlermeldungen des GNU C++ Compilers, ihre Bedeutung, Code Beispiele wie sie entstanden sind und wie man sie korrigiert.
Dies sollte man nicht als Schwäche, sondern als Stärke sehen. Jede Fehlermeldung gibt, einmal entschlüsselt, klare Angaben dazu was, wo schief lief. Und oft sogar Hilfestellung, wie es richtig wäre.

Weiterhin kommen viele mit den eingesetzten Klammern nicht zurecht. Es werden die drei unterschiedlichen Klammern () [] {} und die spitzen Pfeile < > überall im Code verwendet. Jede hat ihre klar definierte Bedeutung. So eröffnen die geschweiften Klammern {} einen neuen Codeabschnitt. Die runden Klammern () werden für den Aufruf einer Funktion benutzt, mit denen es möglich ist weitere Laufzeit Variablen zu übergeben. Mit einem Paar der spitzen Pfeile < > ist es möglich Compilezeit Variablen zu übergeben. Wohingegen die eckigen [] Klammern den Zugriff auf einem Datencontainer erlauben.

C++ zählt von 0 ab. Das erste Element in einer Liste liegt nicht an Position 1, sondern an Position 0. Für die meisten wird das die unangenehmste Umgewöhnung sein. Der Grund steckt tief in dem Hardware Aufbau eines Computers. Und auch ältere Sprachen wie Assembler haben diese Eigenschaft. Kurz gesagt speichern alle Datencontainer die Adresse ihres ersten Elements ab. Und da das erste Element schon an dieser Adresse liegt, würde das addieren einer 1 auf diese Adresse auf das zweite Element zeigen. Das addieren einer 0 hingegen ändert die Adresse nicht. Daher fängt C++ bei 0 an zu zählen.

Es gibt im Prinzip drei fundamentale Datentypen. Einen für ganze Zahlen int, einen für Gleitkommazahlen double, und einen für Text string. Alle andere Datentypen können aus diesem zusammengestellt werden.

C++ für Anfänger&Profis - Qt Creator

Filed under: Allgemein — Tags: — Thomas @ 06:08

Bilder von download, installation, und erstes Projekt Hello world

C++ für Anfänger&Profis - Die Entwicklungsumgebung

Filed under: Allgemein — Tags: — Thomas @ 06:08

Die eingesetzte Entwicklungsumgebung hat für mich einen großen Stellenwert beim Programmieren. Sie muss einfach zu installieren sein und einen Compiler mitbringen. Es braucht auf alle Fälle eine gute und schnelle Autovervollständigung, Syntaxhervorhebung, Fehlererkennung und Vorschläge zur Korrektur des Codes, automatische Einrückung, sowie Projekt Management.
Die Entwicklungsumgebung muss portabel für alle gängigen Computersysteme existieren und ab und zu auch mal ein Update bekommen.

Was ich nicht möchte ist, wenn die Leute anfangen im Texteditor zu programmieren. Damit legt man sich nur selbst Steine in den Weg. Die Syntax von C++ ist zugegebenermaßen schwerer als bei anderen Sprachen, aber aus diesem Grund wurden ja Entwicklungsumgebungen erfunden.

Empfehlen kann ich die Entwicklungsumgebung Qt Creator von The Qt Company welcher als kostenloser Download zur Verfügung gestellt wird. Neben einer Open Source Möglichkeit wird auch eine kommerzielle Version angeboten.

[1] https://www.qt.io/download-open-source/

C++ für Anfänger&Profis - Vorwort

Filed under: Allgemein — Tags: — Thomas @ 05:08

Es gibt so viele Bücher über C++, aber 99% davon lehren nur schlechtes C. Der Unterschied zwischen diesen beiden Sprache ist fundamental, aber von dem Laien nicht ersichtlich.
Die wenigen Bücher die sie wirklich mit C++ beschäftigen, und darunter die, welche modernes C++ behandeln, wie C++11, C++14 und C++17, die sind oft von dem Machern der Sprache geschrieben und für den Anfänger nicht verständlich. Ja, meinst kann der normale Programmierer damit auch nichts anfangen.

Aus diesem Grund versuche ich in dieser Reihe C++ für Anfänger&Profis zu zeigen, dass C++ eben keine steile Lernkurve hat und für die normalen Sachen genauso einfach zu bedienen ist, wie andere moderne Sprachen. Sollte aber fanzy C++ Performance und Techniken gefordert sein, so ist es jederzeit möglich das einzubauen. Aus diesem Grund werde ich die Beispiele jeweils zwei mal behandeln. Einmal mit Code der auf Verständlichkeit ausgelegt ist. Und einmal mit Code der aus Performance kritischer Sicht geschrieben ist.

Da mein Spezialgebiet Algorithmen und Datenstrukturen ist, werde ich die Beispiele entsprechend ausrichten.

14.08.2017

sshd_config AllowUsers AllowGroups

Filed under: Allgemein — Tags: — Thomas @ 11:08

Multiuser System. Nicht alle dürfen auf alle Verzeichnisse zugreifen. Nicht alle drüfen sich vom WAN einloggen, nur vom LAN.

Geschütze Verzeichnisse nur durch eine besondere Gruppe 'intern' les- und schreibbar machen. Alle anderen haben kein Zugriff.

chmod -R 770 chgrp -R intern

Diesen Usern Gruppe 'intern' als Standardgruppe zuordnen

usermod -g intern user1

Und dafür sorgen, dass das Gruppenschreibrecht default aktiviert ist

umask 0002

In sshd_config nun User dieser Gruppe beschränkten Zugriff einstellen

Match Group intern
AllowUsers *@192.168.0.0/24 specialuser1

Dabei 'specialuser1' in der Gruppe 'intern' erlauben vom WAN zu connecten.

Alternative:
Alle user die kein ssh login haben sollen in eine spezielle Gruppe packen und allow list separat anbegen:
#The allow/deny directives are processed in the following order: DenyUsers, AllowUsers, DenyGroups, and finally AllowGroups.
AllowUsers kater
DenyGroups nossh

Powered by WordPress