Compiler verlangt Datentyp "double *"



  • 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