mikrocontroller.net

Forum: PC-Programmierung Funktion mit komplexen Zahlen


Autor: Roberto (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: 2⁵ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Programmiersprache?

Autor: blubb (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenns C mit der GNU libc  sein sollte:

https://www.gnu.org/software/libc/manual/html_node...

Autor: Typ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Call-by-reference

Autor: Noch einer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da funktioniert beides:
#include <stdio.h>

struct retvalue {
 double a;
 double b;
};

struct retvalue test1() {
  struct retvalue res = {1,2};
  return res;
}

void test2(double *res1, double *res2) {
  *res1 = 3;
  *res2 = 4;
}

void main() {
 double u, v;
 struct retvalue r;

 r = test1();
 test2(&u, &v);

 printf("%lf %lf %lf %lf\n", r.a, r.b, u, v);
}

Autor: Torsten Robitzki (Firma: robitzki.de) (torstenrobitzki)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Der Andere (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Torsten Robitzki (Firma: robitzki.de) (torstenrobitzki)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Theor (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Noch einer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Der Andere (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Torsten Robitzki (Firma: robitzki.de) (torstenrobitzki)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Roberto (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.   :-)

Autor: R. M. (n_a_n)
Datum:

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

Wurde im Beitrag #5 bereits beschrieben.

Autor: R. M. (n_a_n)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also so:
void mult (double real1, double imag1, double real2, double imag2, double *real3, double *imag3)
{
        *real3 = real1 * real2 - imag1 * imag2;
        *imag3 = real1 * imag2 + imag1 * real2;
}

int main()
{
    double real3 = 0;
    double imag3 = 0;
    mult(1,2,3,4,&real3,&imag3);
    printf("%f %f\n",real3,imag3);
    return 0;
}


Autor: Sebastian S. (amateur)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sabberalot W. (jetztnicht)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welche Funktionen mit komplexen Zahlen sind dem Poster denn bekannt ? 
log ? exp ? sin ?

Autor: Noch einer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Roberto (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.