Compiler verlangt Datentyp "double *"



  • N' Abend.

    Ich soll als Übungsaufgabe eine Funktion schreiben, die mir das Skalarprodukt berechnet und diese anschließend aufrufen.
    Jedoch sagt mein Compiler, dass beim Aufruf der Funktion ein falscher Datentyp abgerufen wird.
    Der Compiler erwartet "double *" aber "double" wird von der Funktion übergeben.
    Hier mal mein Code

    # include <stdio.h>
    
    double skalarprod(double u[], double v[])
    { double prod, komp;
      int i;
      prod=0;
      for (i=0; i<3; i++)
       komp=u[i]*v[i];
      {prod=prod + komp;
    
      }
     return prod;
     }
    
    int main() 
    { int i;
      double a[3], b[3];
    
    for (i=0; i<3; i++) //Lese Vektor U in ein Array ein
    
    	{printf("u_%d=", i+1);
    	scanf("%f", &a[i]); //Weise u_i zu
    	}
    
    printf("\n"); //Leerzeile zur Übersicht
    
    	for (i=0; i<3; i++) //Lese Vektor V in ein Array ein
    
    	{printf("v_%d=", i+1);
    	scanf("%lf", &b[i]); //Weise v_i zu
    	}
    
    printf("Das Skalarprodukt von u und v beträgt: %f", skalarprod(a[3], b[3]));
    return 0;
    }
    

    Der Fehler scheint wie gesagt in der Zeile zu liegen, in der printf meine skalarprod Funktion aufruft.
    Ich weiß nicht was der Compiler mit "double *" meint...
    Ich habe auch schon versucht, die Arrays mit "double *" zu deklarieren, allerdings stürzt das Prog dann nach dem Einlesen der Vektoren ab.
    Außerdem hab ich noch nie von "double *" gehört...

    Hoffe auf eure Hilfe.

    MfG
    m0pf

    Edit:
    Hier der Fehler den ich bekomme mal ganz genau:

    skalar.c: In function 'main':
    skalar.c:33:1: error: incompatible type for argument 1 of 'skalarprod'
    skalar.c:3:8: note: expected 'double *' but argument is of type 'double'
    skalar.c:33:1: error: incompatible type for argument 2 of 'skalarprod'
    skalar.c:3:8: note: expected 'double *' but argument is of type 'double'



  • Der Compiler will dir damit sagen, dass du nicht die Array-Elemente a[3], b[3] (die sowieso nicht existieren, weil die Arrays nur von 0..2 indiziert werden dürfen) an die Funktion übergeben sollst, sondern die Adressen der Anfangselemente der Arrays:

    skalarprod(a, b);
    

    Die enge Beziehung zwischen Zeigern ( double * heißt "Zeiger auf double") und Arrays zu erklären, führt jetzt wahrscheinlich zu weit. Wenn du gerade C lernst, wirst du das demnächst erfahren.



  • skalarprod(&a[3], &b[3])

    Versuche die Grundlagen zu beherschen.



  • ...... schrieb:

    skalarprod(&a[3], &b[3])

    Versuche die Grundlagen zu beherschen.

    Du aber auch!

    Wenn schon, dann so:

    skalarprod(&a[0], &b[0]);
    


  • Ok, schon mal danke.
    Compiliert wird das Programm jetzt (mit beiden Vorschlägen), allerdings bekomme ich als Ausgabe 0.000000

    Kann mir wer sagen wo der Fehler liegt oder zumindest nen Tipp geben?
    Leigt es daran wie ich einlese oder is der Fehler schon in "skalarprod"?

    Zu den Grundlagen:
    Wir haben Funktionen erst gestern eingeführt und das Grundprinzip ist mir klar, nur wie es mit Arrays gehen sollte war mit etwas unklar.



  • Bei der for-Schleife in skalarprod ist die öffnende geschweifte Klammer an der falschen Stelle...

    Bei der Gelegenheit solltest du dir auch einen vernünftigen Einrückstil aneignen. Entweder

    for (...) {
      bla;
      blub;
    }
    

    oder

    for (...)
    {
      bla;
      blub;
    }
    

    (welchen davon ist Gegenstand religiöser Debatten)

    Nicht:

    for (...)
    { bla;
      blub;
    }
    


  • Also ich hab die geschweifte Klammer jetzt vor das "komp" gestellt.
    Aber immer noch Ausgabe 0...

    Oder haste was anderes mit der geschweiften Klammer an der falschen Stelle gemeint?



  • Nö, genau das meinte ich. Es gibt aber noch einen Fehler, beim ersten scanf muss auch %lf stehen. %f gilt bei scanf nur für float. Danach müsste es aber funktionieren.



  • Ja passt.
    Vielen Dank.
    Leider war unser Dozent da irgendwie sehr ungenau, also was die Formatierungen im printf angeht.
    Wieder was gelernt 🙂



  • Im printf passt es ja auch, es geht um das scanf, was etwas pikanter ist.



  • Da ich nicht noch'n extra Thema aufmachen möchte und ich das Programm, das oben steht, nur geringfügig ändern muss nutze ich einfach diesen Thread weiter.

    Ich soll die Funktion so abändern, dass ich nicht mehr nur für Vektoren aus R^3 sondern allgemein für Vektoren aus R^n das Skalarprodukt berechnen kann.

    Meine Idee war, in der main Funktion einfach eine Angabe der Dimension zu implementieren und die for-Schleife dann für i<n statt i<3 laufen zu lassen.
    Allerdings stürzt das Programm jedes Mal nach dem Einlesen von u_2 ab.

    Hier mal der abgeänderte Code:

    # include <stdio.h>
    
    double skalarprod(double u[], double v[])
    { double prod, komp;
      int i, n;
      prod=0;
      for (i=0; i<n; i++)
      {
      komp=u[i]*v[i];
      prod=prod + komp;
    
      }
    return prod;
     }
    
    int main() 
    { int i, n;
      double a[n], b[n];
    
      printf("Dimension des Vektorraumes eingeben:"); //Dimension des Vektorraumes
      scanf("%d", &n);
    
    for (i=0; i<n; i++) //Lese Vektor U in ein Array ein
    
    	{printf("u_%d=", i+1);
    	scanf("%lf", &a[i]); //Weise u_i zu
    	}
    
    printf("\n"); //Leerzeile zur Übersicht
    
    	for (i=0; i<n; i++) //Lese Vektor V in ein Array ein
    
    	{printf("v_%d=", i+1);
    	scanf("%lf", &b[i]); //Weise v_i zu
    	}
    
    printf("Das Skalarprodukt von u und v beträgt: %f", skalarprod(a, b));
    return 0;
    }
    

    Kann es vielleicht daran liegen, dass die Arrays nicht als a[n] bzw. b[n] deklariert werden dürfen bevor n eingelesen wird?
    Irgendwie hab ich keine so rechte Idee, denn im "alten" Code mit R^3 läuft es ohne Probleme...

    Ich danke bereits im Voraus für eure Hilfe 🙂



  • Du deklarierst deine Variablen bevor n bekannt ist... Allerdings muss du bei deinem vorhaben auch Speicher dynamisch reservieren, was hier nicht geschieht.

    Edit: Hier nachzulesen http://www.cplusplus.com/reference/clibrary/cstdlib/

    Siehe: malloc/calloc/realloc/free



  • m0pf schrieb:

    Kann es vielleicht daran liegen, dass die Arrays nicht als a[n] bzw. b[n] deklariert werden dürfen bevor n eingelesen wird?

    Genau daran liegt es. n ist zu dem Zeitpunkt undefiniert, hat also irgendeinen mehr oder weniger zufälligen Wert. Eigentlich sollte es schon beim Anlegen der Arrays knallen, nicht erst bei der Eingabe.

    Wie sollst du denn die Arrays anlegen? So wie jetzt (halt mit bekanntem n)? Oder über malloc ?



  • Naja, die Aufgabe lautet einfach:
    "Implementieren Sie eine C-Funktion, die das Skalarprodukt für Vektoren aus R^n berechnet."

    Kann ja theoretisch auch sein, dass eine "neue" Funktion verlangt wird, das ist ja eher unpräzise in der Aufgabenstellung.
    Und "malloc" hab ich noch nicht gehört in der Vorlesung...



  • Da du es eh lernen musst kannst du dich in das Thema schon einmal einarbeiten.



  • Wenn du nur die Funktion variabel gestalten sollst, musst du nicht unbedingt auch die Arrays in der main-Funktion variabel machen. Wahrscheinlich sollst du ungefähr sowas machen:

    double skalarProdukt(double a[], double b[], int n)
    {
      ...
    }
    
    int main() {
      double u[5], v[5];
      ... skalarProdukt(u, v, 5);
    }
    


  • Warum dann nicht gleich den Wert als "const int" behandeln. Anpassen geht dann schneller und Fehler unanfälliger.


Anmelden zum Antworten