Wertetyp vs Refernztyp

In der prozeduralen und objektorientierten Programmierung wird zwischen Wertetypen und Referenztypen unterschieden.
Beispielsweise sind in den Programmiersprachen C# und Java primitive Datentypen, Enumeratoren und Strukturen Wertetypen. Klassenobjekte sind hingegen Referenztypen.
In C/C++ dienen Pointer (Zeiger) als Refernztyp, welche die Adresse speichert, die auf einen veränderbaren Wert verweist. Über den Pointer kann die Adresse dann von Funktion zu Funktion überreicht werden.
So kann aus jeder Funktion heraus, die den Zeiger zur Verfügung hat, der Wert verändert werden, auf den die Adresse zeigt. Der geänderte Wert ist über diese Adresse wieder abrufbar, von allen Funktionen aus, die die Refernz bekommen haben. Ein Zeiger in C ist also eine Referenz.

Ähnlich verhält es sich bei Klassenobjekten in C# und Java. Für diese wird ein Speicherplatz im Heap des Arbeitsspeichers angefordert, welcher sich über die Speicheradresse ansprechen und verändern (bzw. überschreiben) lässt. Auch die Klassenobjekte in C++ werden im Heap gespeichert.
Der Heap kann beliebig angesprochen werden, jedoch muss der Speicher bei Bedarf geordert und spätestens bei Programmende wieder freigegeben werden.
In C++ muss sich darum der Programmierer selbst kümmern; C#, Java und die meisten objektorientierten Skriptsprachen haben hierfür eine automatische Speicherbereinigung (Garbage Collector).

Wertetypen werden nicht über eine Speicheradresse an eine Funktion übergeben, sondern als Wert. Diese Werte werden kopiert und auf den Stack im Arbeitsspeicher gelegt.
Je mehr die Funktionsaufrufe verschachtelt sind, um so größer wird auch der Stack.
Diese Vorgehensweise ist durchaus sinnvoll, denn auf den Stack kann zwar nicht beliebig, sondern nur über das aktuellste (oberste) Stack-Element zugegriffen werden, da jedoch auch vor allem die
Funktionsvariablen (Parameter) benötigt werden, erfolgt der Zugriff daher i.d.R. sehr schnell.
Bei jeder Parameterübergabe mit Wertetypen werden die Werte daher kopiert und der Stack wächst. Die Werte sind (zumindest noch bei Funktionsaufruf) redundant auf dem Stack.
Werden die Parameter in der Funktion verändert, hat dies keine Auswirkungen auf die Variablen, welche außerhalb der Funktion als Parameter übergeben wurden.

In einigen Fällen ist es vom Programmierer erwünscht, dass auch Wertetypen innerhalb der Funktion geändert werden können. Wertetypen können als Referenz übergeben werden. Dann sind diese in C/C++ als Pointer zu übergeben, in C# und Java mit dem Schlüsselwort ref.

Ein Beispiel-Programm mit Funktionsaufrufen und Parameterübergaben als Werte- und Referenztyp:

[csharp] class Program
{
static void Main(string[] args)
{
Program program = new Program();
}

public Program()
{
int a = 45;
int b = 34;

this.Sum(a, b);
Console.WriteLine(„a = “ + a.ToString() + „; b = “ + b.ToString());

this.Sum2(ref a, ref b);
Console.WriteLine(„a = “ + a.ToString() + „; b = “ + b.ToString());
}

// Normalfall: By Value – die Variable a kann nicht überschrieben werden
private void Sum(int param1, int param2)
{
param1 = param1 + param2;
}

// Sonderfall: By Reference – die Variable a wird überschrieben
private void Sum2(ref int param1, ref int param2)
{
param1 = param1 + param2;
}
}
[/csharp]

Ausgabe:

a = 45; b = 34
a = 79; b = 34

Die Ausgabe des Programms zeigt, dass nur die Methode mit der als Referenz übergebenen Parameter die Variablen im Konstruktor verändert.

Alternativ zum Schlüsselwort ref kann auch das Schlüsselwort out verwendet werden.
Während ein mit ref bezeichneter Parameter vor Paramterübergabe definitiv initialisiert werden muss damit er verwendet werden kann, initialisiert sich ein mit out bezeichneter Parameter bei Methodenaufruf selber und muss daher nicht im Vorfeld initialisiert worden sein.
Hiervon abgesehen besteht kein wesentlicher Unterschied zwischen den Schlüsselwörtern ref und out, daher kann auch keine Überladung mit Unterscheidung dieser beiden Schlüsselwörter geschehen.

Boxing / Unboxing

Eine Konvertierung eines Wertetyps zu einem Referenztyp wird als Boxing bezeichnet. Unboxing ist die entgegengesetzte Konvertierung, also einer Referenz zu einem Wert. Dabei ist in C# und Java i.d.R. explizites Casting notwendig (Vorbestimmung des Datentyps zwischen einfachen Klammern).

[csharp] int a = 1548; // Wertetyp
object o = a; // boxing
int b = (int)o; // unboxing (mit Casting)
[/csharp]

Was bedeutet "interdisziplinär"?

Eine Disziplin bedeutet einen Teilbereich aus der Wissenschaft.

Einzelne Wissenschaften sind zum Beispiel die Wirtschaftswissenschaften, Ingenieurwissenschaften, Naturwissenschaften oder auch Geisteswissenschaften.

interdisziplinär

„Inter“ bedeutet „übergreifend“. So wie ein Unternehmen, das als „Global player“ weltweit, also über mehrere Nationen, präsent ist, als inter-national bezeichnet wird.

Das bedeutet, interdisziplinäre Studiengänge – und dass sind, neben einigen anderen, insbesondere Wirtschaftsinformatik und Wirtschaftsingenieurwesen – sind Studiengänge, die zwei Disziplinen behandeln und verbinden.

Das Adjektiv „multidisziplinär“ wird in der Regel von „interdisziplinär“ abgegerenzt. Multidisziplinär ist zum Beispiel Informatik im Hauptstudium + BWL im Nebenfach. Das Studium befasst sich mit zwei Wissenschaften, aber diese beiden Wissenschaften sind nicht aufeinander abgestimmt und behandeln keine Schnittstellen zwischen beiden Disziplinen. Ein Beispiel ist ein Germanistikstudium mit Nebenfach BWL.

Ein interdisziplinäres Studium muss nicht unbedingt ein Studium in Richtung Wirtschaftswissenschaften + Natur-/Ingenieurwissenschaften darstellen, also völlig verschiedene Wissenschaften unter einen Hut bringen.

Ein anderes Beispiel ist das Studium Mechatronik. Mechatronik bezeichnet ein Zusammenspiel zwischen Mechanik/Maschinenlehre und Elektrotechnik und vermittelt als Studienfach die Lehrinhalte des Maschinenbaus (die eine Disziplin) und der Elektrotechnik (die andere Disziplin). Im Studium Mechatronik werden insbesondere auch die Schnittstellen, an welchen elektrische Energie in mechanische Bewegung (bzw. umgekehrt) umgesetzt wird, genauer thematisiert, Mechatronik ist daher interdisziplinär, wobei die beiden Disziplinen zwar verschieden, aber beide Ingenieurwissenschaften sind.

Schnittstellenfächer in der Wirtschaftsinformatik sind z.B. betriebswirtschaftliche Anwendungssysteme oder der Ein-/Verkauf von Informationssystemen. Schnittstellenfächer des Wirtschaftsingenieurwesens sind z.B. die Logistik oder der technische Ein-/Verkauf.

Lagerkräfte und Stabkräfte – Technische Mechanik

Bei gegebener Statik befindet sich die Konstruktion in Ruhe, d.h. sie bewegt sich nicht, verbiegt bzw. zerbricht nicht.

Die summierten Kräfte jeder Dimension müssen sich daher gegenseitig aufwiegen, also Null ergeben. Dies soll an Hand eines Beispiels mit Lager- und Stabkräften verdeutlicht werden.

Gegeben sind zwei Stäbe, welche von zwei Festlagern gehalten werden und einen Punkt bzw. ein Objekt fixieren.

Zwei Stäbe Technische Mechanik

Die Stäbe sind gleich lang und bilden ein gleichschenkliges Dreieck. Am Berührungspunkt C der beiden Stäbe ist zwischen den Stäben der Winkel 2*α aufgespannt.

Zwei Stäbe Technische Mechanik

Auf die Konstruktion wirkt eine gegebene Kraft F auf den zu fixierenden Punkt ein. Die Kraft wirkt schräg, in einem Winkel β zur Spiegelachse des gleichschenkligen Dreiecks. Diese Kraft müssen die Lager und Stäbe aufnehmen. In der Konstruktion befinden sich drei Lager. Die beiden Festlager, mit denen die Stäbe am Fundament befestigt sind sowie die Stabverbindung, welche beide Stäbe (und möglicherweise ein Objekt) zusammenhält.

Zwei Stäbe Technische Mechanik

→ WEITERLESEN

Queue Datenstruktur in C#

Eine Queue (Warteschlange) ist eine First-in-First-out-(FIFO) Datenstruktur.
Die Datenstruktur Queue ist ein Stapel, auf welchem nach und nach Daten abgelegt werden.
Allerdings wird auf Elemente der Queue nur von unten zugegriffen. Das unterste Element ist das mit höchster Priorität, nur auf dieses als erstes hinzugefügte Element kann zugegriffen werden.

Stack

Ein Pointer (Zeiger) zeigt intern immer auf das Element, welches (relativ zu den anderen Elementen) als erstes in die Queue aufgenommen wurde.
Ein einfaches „Lösche aus der Queue“ gibt es nicht, ein Element kann aus der Queue mit Peek() herausgelesen und mit Dequeue() herausgelesen und zugleich entfernt werden.
An das Warteschlangenende angereiht werden Elemente mit Enqueue();

Funktionsweise einer Queue an Hand eines praktischen Beispiels:

Stellen Sie sich vor, Sie müssten eine Software für ein Theater schreiben. Die Software soll Ticket-Bestellungen für
Vorführungen bearbeiten. Nun sind die Vorstellungen aber sehr schnell ausgebucht, so dass viele Tickets nicht mehr ausgestellt werden können. Bei der Ticket-Bestellung gilt jedoch „wer zu erst kommt, mal zu erst“.
Die Daten aller eingehenden Bestellungen legen Sie in eine Queue (Warteschlange). Die Daten in der Queue werden vom ersten bis zum letzten Eintrag abgearbeitet, bis die Queue vollständig abgearbeitet wurde oder keine Plätze mehr verfügbar sind.

→ WEITERLESEN

Kategorien C#

Stack Datenstruktur in C#

Ein Stack (Stapel) ist eine Last-in-First-out-(LIFO) Datenstruktur.
Die Datenstruktur Stack sollte dann verwendet werden, wenn Daten gesammelt werden, jedoch immer nur ein Datenelement aktuell bearbeitet werden darf.

Das aktuelle Element ist dann das einzige, auf welches zugegriffen werden kann. Alle anderen Elemente bleiben im
Hintergrund und werden erst (und dann auch jeweils einzeln) bearbeitet, wenn das aktuelle Element abgearbeitet und vom Stapel entfernt wurde.

Ein Pointer (Zeiger) zeigt intern immer auf das Element, welches (relativ zu den anderen Elementen) als letztes auf den Stapel gelegt wurde.
Ein einfaches „Lösche aus dem Stack“ gibt es nicht, ein Element kann aus dem Stack mit Peek() herausgelesen und mit Pop() herausgelesen und zugleich entfernt werden.
Ein Element kann mit Push() auf den Stack gelegt werden.

Stack

Die Funktionsweise des Stack an Hand eines praktischen Beispiels:
Stellen Sie sich einen Stapel Teller vor, welchen sie abwaschen möchten. Sie würden sicherlich beim obersten Teller anfangen, diesen vom Stapel nehmen und abwaschen. Erst dann können Sie den nächsten Teller vom Stapel nehmen.

→ WEITERLESEN

Kategorien C#

Gelenke in der Technischen Mechanik

Gelenke dienen ähnlich wie Lager der Fixierung einer Konstruktion. Ein Gelenk soll jedoch nicht alle inneren Kräfte übertragen, sondern einer bestimmten Kraft nachgeben. So kann eine Beweglichkeit in einer Konstruktion bzw. in einem Tragwerk erreicht werden.

Innere Kräfte, die bestimmte Gelenke nicht übertragen sollen:

Moment: Momente sind die aus gegenläufigen Kräften mit Hebel resultierende Drehkraft

Querkraft: Die Querkraft wirkt vertikal aus Sicht des Koordinatensystems, daher wird sie auch Vertikalkraft genannt

Normalkraft: Die Normalkraft wirkt senkrecht zur Querkraft, also horizontal.

→ WEITERLESEN

Hashtable in C#

Hashtables (Hash-Tabellen) sind Datenstrukturen, die den Arrays sehr ähnlich sind.
Hashtables können in C# ähnlich wie eine ArrayList verwendet werden, der Zugriff erfolgt über einen Index.
Der Index ist ein spezieller Key, welcher eine Zahl (z.B. vom Typ Float oder Integer) genauso wie ein String sein darf.

[csharp] // Beispiele, Syntax: hashtablename[key] = value;

ht_pass[32.3] = „juhu“;
ht_pass[5] = „tobias“;
ht_pass[„zoo“] = 45.3;
[/csharp]

Wozu werden Hashtables benötigt?

Hashtables sind sinnvoll, wenn sich Listen bzw. Arrays verknüpfen bzw. verschachteln lassen. So kann der Wert eines Listenfeldes der Schlüssel zu einem Wert eines anderen Feldes sein. Zwar ließe sich das auch mit einem normalen Array
(und somit Integer-Werten als Index) realisieren, dann wären jedoch einige zusätzliche Listen/Tabellen nötig, um von einer
Zahl auf einen speziellen Schlüssel und von diesem Schlüssel wieder auf eine anderen Zahlenschlüssel zu verweisen.

C# bietet natürlich einen gewissen Komfort bei Benutzung von Hashtables (wie bei vielen anderen Dingen auch). In der Programmiersprache C haben Programmierer eigene Hash-Funktionen entwickelt, um z.B. einen Text als Zahl umzuschlüsseln (z.B. „Hallo“ -> „2342424“, „Schule“ -> „792942“ usw.), um diesen dann als Index (Schlüssel) für ein Array zu benuten. Vorteil: Um einen Wert zu suchen, musste nicht unbedingt das ganze Array durchlaufen und im
schlimmsten Falle alle Felder iteriert werden. Man musste sich nur die Schlüssel für bestimmte Werte merken, diese in eine Zahl konvertieren, auf den Wert im Feld mit dem Schlüssel zugreifen und es auslesen. Daraus ergibt sich ein sehr großer Geschwindigkeitsvorteil.
Der Nachteil liegt in der Größe des Arrays, dieses muss nämlich so groß sein bzw. so einen hohen Index haben, wie eine Zahl, die aus einem Text resultiert, werden kann. Außerdem könnte es vorkommen, dass Werte nicht abgespeichert werden können, da zwei oder mehrere unterschiedliche Texte trotz ausgereiften Algorithmus den selben Index ergeben. Ausweichmöglichkeiten sind zwar vorhanden (den Index verschieben, bis ein freies Feld gefunden wurde), macht die Sache jedoch trotzdem nicht viel unproblematischer.

Die Hashtables in C# sind weitaus dynamischer, denn intern ist ein Hahstable auch nur so groß, wie es notwendig ist. Der Zugriff ist jedoch absolut schnell, konstant schnell! Unabhängig von der Größe des Hashtable ist die Zugriffszeit konstant.

→ WEITERLESEN

Kategorien C#

Ebenes Fachwerk

Für Konstruktionen, die sehr stabil sein müssen, werden Fachwerke (oder fachwerkähnliche Konstruktionen) verwendet. Fachwerke werden z.B. im Hochhaus-, Dach- und Brückenbau verwendet. Ein Fachwerk ist eine Stabkonstruktion. Die Stäbe des Fachwerks sollen ausschließlich auf Druck und Zug in Stabrichtung belastet werden und nicht etwa auf Biegung.

Ein beispielhaftes (ebenes) Fachwerk für eine Brücke:

Fachwerk
Das Fachwerk besteht aus 15 Stäben. Die Fächer (Zwischenräume) bestehen aus gleichschenkligen Dreiecken.
Typisch für eine Brücke, ist es auf der einen Seite durch ein Festlager, auf der anderen Seite durch ein Loslager fixiert. Das Loslager soll die aus einer temperaturabhängigen Ausdehnung resultierende Spannung abbauen.

→ WEITERLESEN

Lagerung – Loslager vs Festlager

Grundsätzlich soll eine Lagerung eine Konstruktion fixieren. Das typische Lager ist daher das Festlager, welches die Konstruktion in alle Richtungen fixiert.

Da Bauteile sich jedoch ausdehnen oder mechanisch beweglich sein müssen, sind nicht im jeden Fall Festlager einsetzbar.
Loslager fixieren eine Konstruktion nur (Zweidimensionalität) in einer bzw. (Dreidimensionalität) in zwei Richtungen.

Loslager und Festlager

Loslager kommen z.B. bei der Lagerung einer Welle zum Einsatz oder im Stahl-Brückenbau.

Fest- und Loslager übertragen keine Momente. Eine momentübertragende Lagerung ist hingegen die Einspannung.

Ein Lager im Sinne der Technischen Mechanik wird auch als Auflager bezeichnet.