Übung01

Keinen Plan

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Übung01
eee hallo erstmal.
Hab mich grade ein wenig mit der 1. Amer übung befasst und habe keine Ahnung.

  1. was ich bei dem output und input operator genau machen soll.
    naja ich soll in irgendwas reinschreiben in dem bestimmten Format was unten steht und beim lesen dieses bestimmte Format beachten.
  2. Wie soll ich zwei Bilder voneinader Abziehen/Addieren?
    Kann es sein das man einfach das Array durchgehen muss und alle Werte miteinander adieren soll? und dann das neu entstandene Array zurückgibt.
  3. Wie hab ich mir ein 1, 2 bzw 3 Dimensionales Bild vorzustellen und was mache ich im Konstruktor mit dem size operator.
  4. Keine Ahnung Keine Ahnung

ok hab über den Konstrukter mal nachgedacht und bin auf folgendes gekommen:
d sagt mir welche dimension ich habe also wie groß das array ist was mit size Übergeben ist. Hab ich also 2 dim, dann hab ich in size einmal die größe von x und dann noch die größe von y. Jetzt muss ich mein array um die Matrixinhalte zu speichern entsprechend initialisieren und mir die größe von den x y oder z Koordinaten merken.


auch ne interessante Frage ist

wenn man 2 verschieden große Bilder addiert/subtrahiert
kommt dann ein Bild mit maximaler Seitenlänge oder minimaler Seitenlänge raus

und wenn man maximale Seitenlänge hat was ist dann mit den Pixeln die in dem einen bild fehlen sind die Weis(0???) ??


Bei Matrixoperationen wie A+B oder A-B ändert sich doch die Größe der Matrix nicht.


<1. was ich bei dem output und input operator genau machen soll.
< naja ich soll in irgendwas reinschreiben in dem bestimmten Format was unten steht und beim lesen dieses bestimmte Format beachten.

Da soll mit dem Stream Operator << und >> ein pgm Bild in ein File geschrieben oder eingelesen werden.
Beispiel lesen:
main(…) {
BildArray b1;
ifstream b1file(argv[1]);
b1file >> b1;
}

Also den Stream Operator überladen.
Beispiel Bild einlesen:
/// Eingabeoperator liest BildArray aus einem Stream
istream& operator>> (istream& is, BildArray& b) {

}

  1. Wie soll ich zwei Bilder voneinader Abziehen/Addieren?
    Kann es sein das man einfach das Array durchgehen muss und alle Werte miteinander adieren soll? und dann das neu entstandene Array zurückgibt.
    Ja. Bei unterschiedlicher grösse zählt das kleinere Bild.
  2. Wie hab ich mir ein 1, 2 bzw 3 Dimensionales Bild vorzustellen und was mache ich im Konstruktor mit dem size operator.
    Dabei musst Du ein 1,2, oder 3D Array anlegen. bild[x] oder bild[x][y] oder bild[x][y][z].
    Dazu musst Du je nach Dimension eine Fallunterscheidung machen und die Bildmatrix entsprechend erzeugen.
    Bei einem 3D Array können die Daten auch als 1D Array
    data = new T[sizeXsizeYsizeZ];
    und dann mit
    grauwert = data[z*(sizeXsizeY) + ysizeX + x ];
    angesprochen werden.

<<wenn man 2 verschieden große Bilder addiert/subtrahiert
<<kommt dann ein Bild mit maximaler Seitenlänge oder minimaler Seitenlänge raus
<<und wenn man maximale Seitenlänge hat was ist dann mit den Pixeln die in dem einen bild fehlen sind die Weis(0???) ??

Gute Frage. Also das ist einfach eine Frage der Definition. Im Zweifelsfall die kleinere Grösse
wählen als Ausgabe und den Rest verwerfen. Ansonsten muss man den Rand mit z.B. 0 auffüllen.


Ok, hatte nicht richtig gelesen, bei verschieden großen Bildern ist das wirklich unterspezifiziert.


Hey Mr. T, bist du ein “offizieller”?

@Raim: doch wenn die Matrix A 20x20 groß ist und die Matrix B 30x30, und du machst A + B. Aber Mr. T sagt ja es zählt das kleinere Bild…

Eine Sache an der wir etwas länger saßen: Beim überladen des >> und << Operators muss ein friend vor die Deklaration. Der Operator selbst gehört nicht zur Klasse Matrix, also auch nicht Matrix::operator>> schreiben, sondern nur operator>>
Falls jemand weiß warum das Konzept in C++ so ist, könnts mir gerne erläutern :wink:

Für das PGM Format gibts ne nette Erläuterung auf Wikipedia.

Noch 2 Fragen…

  1. Wie genau soll das mit den Signalen funktionieren? Wenn ich zum Beispiel einen Sinus über das Bild lege mit der Frequenz 1, soll dann ein Sinus von links nach rechts auf die Grauwerte addiert werden, bei Frequenz 2, 2mal der Sinus, jeweils über das halbe Bild? etc. (irgendwie kann ichs gerade nicht besser erklären, sorry ^^)

  2. Wenn man A + B rechnet. Soll dann eigentlich eine Matrix der beiden verändert werden? Wenn nicht müsste man ja in operator+ eine neue Matrix erstellen, und zwar mit new. Dann müsste der Benutzer ja delete anwenden, wäre etwas unschön. Oder bekomm ich irgendwie eine Referenz auf eine auf dem Stack-liegende Ergebnismatrix?

Merci…


Nicht unbedingt. Vermutlich hast du den operator<< innerhalb der Klasse definiert, dann bekommt der Operator auch nur einen Parameter. Außerhalb geht es exakt so wie das Snippet auf der Angabe zeigt, mit zwei Parametern.


Okay, jetzt muss ich mich da selbst verbessern. So funktioniert das leider nicht, wenn man auf private member der Klasse zugreifen will, dann muss es wirklich mit friend deklariert werden. Danke Noya :wink:


<<2) Wenn man A + B rechnet. Soll dann eigentlich eine Matrix der beiden verändert werden? Wenn nicht müsste man ja in operator+ eine neue Matrix erstellen, und zwar mit new. Dann müsste <<der Benutzer ja delete anwenden, wäre etwas unschön. Oder bekomm ich irgendwie eine Referenz auf eine auf dem Stack-liegende Ergebnismatrix?

Wenn C = A + B gerechnet wird darf A oder B nicht geändert werden.
Deshalb kann man sich im operator+ eine lokale Bildmatrix C anlegen - dort C=A+B rechnen - und das Ergebnis C via dem überladenen copy operator
zurückgeben.

Beispiel:
template
Matrix Matrix::operator+ (Matrix param) {
Matrix C(groesse von z.B A…also “this”);
…addiere A + B und speicher in C
return (C);
}

hier sollte via copy operator dann der Inhalt vom lokalen C im operator+ zu C im main kopiert werden.

main (…) {
C = A + B;
}

Ein new würde ich vermeiden! Bedenke: wer ist dann für das delete verantwortlich?


Deswegen meinte ich ja das new unschön ist. Frage zu der Lösung von dir: Da liegt C doch auf dem Stack und ist nach dem Methodenaufruf ungültig?


“Da liegt C doch auf dem Stack und ist nach dem Methodenaufruf ungültig?”

Bei der Rückgabe sollte der copy-operator aufgerufen werden und das lokale Objekt C wird in das Object C in der main Funktion kopiert
bevor C auf den Stack ungültig wird. Sollte also so funktionieren.


ich rate euch aus der Bib mal den stroustup auszuleihen, der ist für die ersten paar Amer Aufgaben ideal, da steht auch sowas von wegen forward-deklaration bei friend operaionen usw.

A+=B sollte zu A B addieren (hier müssen also die for-schleifen kommen), A+B kann man dann mit Hilfe von A+=B realisieren. Copy und Zuweisungsoperator (also operator=) müssen natürlich implementiert sein!

Zum Sinussignal: es soll im Prinzip das sinussignal grafisch dargestellt werden, also einmal über die x und einmal über die y-Achse zeichnen