Forum: PC-Programmierung Funktion mit komplexen Zahlen


von Roberto (Gast)


Lesenswert?

Hallo Forum, vielleicht bin ich mit meiner Frage hier im falschen Forum, 
dann mag ein Moderator den Thread doch gerne verschieben.

Ich möchte eine Funktion zur Multiplikation von komplexen Zahlen 
schreiben. Ich würde vier float übergeben und brauche zwei float zurück. 
Wie könnte ich das machen? Ich habe so die wage Idee ob da eine struct 
helfen könnte? Bin aber noch zu sehr Anfänger...  deshalb frage ich und 
hoffe auf wohlwollende Hilfe mit wenig Häme. :-)

: Verschoben durch Moderator
von 2⁵ (Gast)


Lesenswert?

Programmiersprache?

von blubb (Gast)


Lesenswert?


von Typ (Gast)


Lesenswert?

Call-by-reference

von Noch einer (Gast)


Lesenswert?

Da funktioniert beides:
1
#include <stdio.h>
2
3
struct retvalue {
4
 double a;
5
 double b;
6
};
7
8
struct retvalue test1() {
9
  struct retvalue res = {1,2};
10
  return res;
11
}
12
13
void test2(double *res1, double *res2) {
14
  *res1 = 3;
15
  *res2 = 4;
16
}
17
18
void main() {
19
 double u, v;
20
 struct retvalue r;
21
22
 r = test1();
23
 test2(&u, &v);
24
25
 printf("%lf %lf %lf %lf\n", r.a, r.b, u, v);
26
}

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Roberto schrieb:
> Ich möchte eine Funktion zur Multiplikation von komplexen Zahlen
> schreiben. Ich würde vier float übergeben und brauche zwei float zurück.
> Wie könnte ich das machen? Ich habe so die wage Idee ob da eine struct
> helfen könnte? Bin aber noch zu sehr Anfänger...  deshalb frage ich und
> hoffe auf wohlwollende Hilfe mit wenig Häme. :-)

Warum möchtest Du die schreiben? Die meisten Programmiersprachen haben 
soetwas in ihrer Standard Library.

von Der Andere (Gast)


Lesenswert?

Torsten R. schrieb:
> Warum möchtest Du die schreiben?

Vieleicht eine Hausaufgabe?

@TO: Es geht wohl um C?

Die Stickworte "struct" und "typedef" sind dein Freund. Da du ja 
möglichst rasch kein "Anfänger" mehr sein willst schlage ich vor du 
liest dir im Internet/deinem C Buch mal durch was dazu zu finden ist und 
probierst es aus. So lernst du es am schnellsten.

Bei konkreten Fragen meldest du dich hier wieder.

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Der Andere schrieb:


> @TO: Es geht wohl um C?

Dann wäre das ja auch schon in der STD Lib: 
http://en.cppreference.com/w/c/numeric/complex

von Theor (Gast)


Lesenswert?

Roberto schrieb:
> Hallo Forum, vielleicht bin ich mit meiner Frage hier im falschen Forum,
> dann mag ein Moderator den Thread doch gerne verschieben.
>
> Ich möchte eine Funktion zur Multiplikation von komplexen Zahlen
> schreiben. Ich würde vier float übergeben und brauche zwei float zurück.
> Wie könnte ich das machen? Ich habe so die wage Idee ob da eine struct
> helfen könnte? Bin aber noch zu sehr Anfänger...  deshalb frage ich und
> hoffe auf wohlwollende Hilfe mit wenig Häme. :-)

(Ich gehe davon aus, dass es sich um eine Hausaufgabe handelt und Du in 
einem Schulunterricht C lernst - also vermutlich etwa in der 9 bis 12 
Klasse einer Realschule oder eines Gymnasiums bist).

Welche Eigenschaften einer Struktur in C könnten sie denn geeignet 
machen, Deinen Anforderung zu erfüllen? Oder, - zunächst mal unabhängig 
von Deinen Absichten -, welche Eigenschaften und Zwecke allgemein hat 
eine Struktur in C?

von Noch einer (Gast)


Lesenswert?

>Warum möchtest Du die schreiben? Die meisten Programmiersprachen haben
>soetwas in ihrer Standard Library.

Eine Antwort wäre: Etwas neues entwickeln, was noch niemand entwickelt 
hat - das ist zu schwierig für eine Anfängerübung.

von Der Andere (Gast)


Lesenswert?

Torsten R. schrieb:
> Dann wäre das ja auch schon in der STD Lib:
> http://en.cppreference.com/w/c/numeric/complex

Ich sagte C nicht cpp.
Ist das z.B. bei den 8 Bit µC Bibliotheken auch implementiert? :-)

Ausserdem ist es ja nicht verboten etwas selbst zu programmieren was es 
schon anderswo gibt, gerade zum lernen oder üben.

Deshalb ja auch meine Vermutung: Haus/Übungsaufgabe

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Der Andere schrieb:
> Torsten R. schrieb:
>> Dann wäre das ja auch schon in der STD Lib:
>> http://en.cppreference.com/w/c/numeric/complex
>
> Ich sagte C nicht cpp.

Guckst Du mal genau in die Doku! Gibt es schon seit fast 20 Jahren in C 
;-)

> Ist das z.B. bei den 8 Bit µC Bibliotheken auch implementiert? :-)

Warum sollte das nicht der Fall sein? µCs linken gegen libraries in der 
Regel statisch. Damit gelangt keine Funktion in das finale Binary, die 
nicht gebraucht wird. Wo wäre der Vorteil von Selbst-schreiben gegenüber 
einer fertigen Lösung? (Ausserdem sind wir hier im Forum 
"PC-Programmierung").

> Ausserdem ist es ja nicht verboten etwas selbst zu programmieren was es
> schon anderswo gibt, gerade zum lernen oder üben.

Alles Spekulation. Deswegen hatte ich den OP ja nach seiner Motivation 
gefragt.

von Roberto (Gast)


Lesenswert?

uups, da habe ich doch glatt vergessen in welcher Programmiersprache ich 
arbeite. In C mit einem μC Atmega??
Mein Problem wie mache ich das meine Funktion zwei Werte zurück geben 
kann.
Als Datentypen will ich mit integer, float und double arbeiten. Später 
will ich von komplexen  Zahlen auf Quarternionen erweitern. Ist keine 
Hausaufgabe, habe schon lange keine Schule/Uni von innen gesehen. Schon 
mal danke.   :-)

von R. M. (n_a_n)


Lesenswert?

Roberto schrieb:
> Mein Problem wie mache ich das meine Funktion zwei Werte zurück geben
> kann.

Wurde im Beitrag #5 bereits beschrieben.

von R. M. (n_a_n)


Lesenswert?

Also so:
1
void mult (double real1, double imag1, double real2, double imag2, double *real3, double *imag3)
2
{
3
        *real3 = real1 * real2 - imag1 * imag2;
4
        *imag3 = real1 * imag2 + imag1 * real2;
5
}
6
7
int main()
8
{
9
    double real3 = 0;
10
    double imag3 = 0;
11
    mult(1,2,3,4,&real3,&imag3);
12
    printf("%f %f\n",real3,imag3);
13
    return 0;
14
}

von Sebastian S. (amateur)


Lesenswert?

Ganz am Anfang wird man Dir gesagt haben, dass "C" nur ein "Dingsbums" 
als Rückgabewert zulässt.

Das kann natürlich auch ein Zeiger sein, der dann auf beliebig viele 
Etwasse zeigt.

Als "natürlicher" Rückgabewert kommt somit nur eine "halbe" komplexe 
Zahl infrage.

Eine weitere Möglichkeit ist die Übergabe von Adressen (&-Operator) über 
die dann die angegebenen Variablen manipuliert/gesetzt werden können.

Oder so.

von Pandur S. (jetztnicht)


Lesenswert?

Welche Funktionen mit komplexen Zahlen sind dem Poster denn bekannt ? 
log ? exp ? sin ?

von Noch einer (Gast)


Lesenswert?

>Ganz am Anfang wird man Dir gesagt haben, dass "C" nur ein "Dingsbums"
>als Rückgabewert zulässt.

Das wurde unseren Grosseltern beigebracht. Bei K&R gab es keine 
Funktionsprototypen, der Rückgabewert musste in ein Register passen.

Inzwischen kann man auch Strukturen als Parameter und Rückgabewerte 
nehmen. Da musst du dann aber implicit function declaration Warnungen 
ernst nehmen.

von Roberto (Gast)


Lesenswert?

Hallo Forum, Vielen Dank für die Hilfe. Ich denke ich hab`s jetzt. 
(theoretisch ) praktisch kann ich`s nicht testen, liege mit "Rücken" im 
Bett und kann nix machen. Muss wohl morgen nach`m Dokter...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.