Funktions Pointer



  • Hallo, Ich habe ein paar Fragen zu der Aufgabe.
    der prototyp:
    void prosum(unsigned len, double * vektor, double * summe, double * produkt);
    den also ein extriger funktionspointer aufrufen soll.
    aber koennte ich nicht einfach nur einen double vektor (also array) in den parametern uebergeben und die sume und das produkt direkt in der funktion berechnen?

    Schreiben Sie ein Programm, das eine Funktion prosum enthält. Dieser Funktion wird ein double-Vektor beliebiger Länge übergeben, sie liefert die Summe und das Produkt der Vektorelemente zurück.
    Hinweis: Der Prototyp der benötigten Funktion könnte zum Beispiel so aussehen:
    void prosum(unsigned len, double * vektor, double * summe, double * produkt);



  • @razor sagte in Funktions Pointer:

    aber koennte ich nicht einfach nur einen double vektor (also array) in den parametern uebergeben und die sume und das produkt direkt in der funktion berechnen?

    Das (Summe und Produkt direkt in der Funktion berechnen) sollst du doch machen! Nur irgendwie muss das Resultat ja auch zurückgegeben werden. Beachte, dass Summe und Produkt hier Pointer sind - die sind als Rückgabeparameter gedacht.



  • @razor Funktions Pointer sind übrigens etwas anderes.

    So werden Pointer auf Funktionen genannt.



  • das ist die angabe ich werd also vermutlich einen funktionpointer erstellen muessen der auf diese funktion dann zeigt

    Programm 11: Function Pointer 2 – Fernlehraufgabe 2
    Schreiben Sie ein Programm, das eine Funktion prosum enthält. Dieser Funktion wird ein double-Vektor beliebiger Länge übergeben, sie liefert die Summe und das Produkt der Vektorelemente zurück.
    Hinweis: Der Prototyp der benötigten Funktion könnte zum Beispiel so aussehen:
    void prosum(unsigned len, double * vektor, double * summe, double * produkt);

    void prosum(double *vektor, double *summe, double *produkt){
    
        int i;
        *vektor;
        for (i=0; i<3; i++){
        *summe +=  vektor[i];
        }
    
        for (i=0; i < 3; i++){
        *produkt *= vektor[i]; //hier wird immer 0 ausgegeben, warum?
        }
    }
    
    int main()
    {
        double vektor [3] = {1,2,2};
        double summe;
        double produkt;
        //unsigned len;
    
        prosum(&vektor, &summe, &produkt);
        printf("Summe:%2.f Produkt:%2.f\n", summe, produkt);
    
    
    	return 0;
    }
    


  • @razor
    Zeile 4 hat genau welchen Sinn?
    Zeile 10 benutzt eine Verkürzung, schreibe mal die normale Langform, dann siehst du schon.
    "2.f" soll genau was bewirken?



  • @razor Wo ist denn der Parameter len hin?

    Und https://de.wikipedia.org/wiki/Null#Multiplikation



  • @razor sagte in Funktions Pointer:

    for (i=0; i<3; i++){
    *summe +=  vektor[i];
    }
    

    In der Funktion sollte keine "3" stehen. Dafür war doch extra in der Aufgabenstellung der Parameter "len" gedacht.

    Und dann addierst du 3 Werte zu der Variablen summe. Aber Du berechnest also summe + vector[0] + vector[1] + vector[2]. Frage an dich: hast du irgendwo festgelegt, wie groß "summe" ist? (initialisiere deine Variablen mit geeigneten Werten!)

    Analog: du berechnest produkt * vector[0] * vector[1] * vector[2] - aber welchen Wert hat denn produkt in dieser Formel?

    Und jetzt kommen wir zur interessanten Frage: was soll die Funktion machen, wenn der vector 0 Elemente hat?



  • ich habs dann so gemacht, srry war kurz spaziern
    .2f füer 2 nachkommastellen srry
    //bei der multiplikation bin ich mir noch nicht sicher
    funktioniert jz aber

    void prosum(int len, double *vektor, double *summe, double *produkt){
    
        int i;
        vektor;
        for (i=0; i<len; i++){
        *summe +=  vektor[i];
        }
        *produkt =1;
        for (i=0; i < len; i++){
        (*produkt) *=  vektor[i];
        }
    }
    
    int main()
    {
        double vektor[50];
        double summe, produkt;
        int i=0;
        unsigned int len=0;
    
        printf("Wieviele Zahlen wollen Sie eingeben: ");
    	scanf("%d", &len);
    	printf("%d",len);
    
        //for(i=0; i<=len; i++)
        do{
    	printf("\nBitte geben sie eine Zahl ein: ");
    	scanf("%lf", &vektor[i]);
    	 i++;
    
        }while (i<len);
    
        //printf("\n%f", vektor[0]);
        //printf("\n%f\n",vektor[1]);
    
    
        prosum(len, &vektor, &summe, &produkt);
        printf("Summe:%.2f\nProdukt:%f\n", summe, produkt);
    
    
    	return 0;
    

    }



  • This post is deleted!


  • @razor sagte in Funktions Pointer:

    funktioniert jz aber

    ist aber trotzdem nicht richtig.

    Der Formatspecifier für unsigned int bei scanfist %u
    (Da sollte der Compiler eine Warnung geben)

    Du hast fast jede Variable initialisiert, auch bei denen es nicht nötig wäre.
    Bist du dir sicher, das summe in jedem erdenklichen Fall auch Null ist?
    (Nein, das verlangt der Standard nicht)

    Beim Aufruf von prosum gehört bei vektor kein Adressoperator hin.

    Hat Zeile 25 nicht funktioniert?
    Was lief da nicht?

    Und warum läuft deine Funktion zweimal über den vektor?

    Was ist, wenn der Nutzer für len Werte über 50 eingibt?



  • @DirkB sagte in Funktions Pointer:

    Hat Zeile 25 nicht funktioniert?
    Was lief da nicht?

    <= statt <



  • @razor sagte in Funktions Pointer:

    ich werd also vermutlich einen funktionpointer erstellen muessen der auf diese funktion dann zeigt

    Ich hab' jetzt nicht genau geschaut ob es schon jemand gesagt hat, aber NEIN, Du brauchst und hast keine Funktionszeiger. (Pointer to Function)



  • Hallo @razor.

    Bist du mit deinem Programm fertig geworden?



  • @Semmel92 Er wird wohl https://www.c-plusplus.net/forum/topic/352507/funktions-pointer/8 genommen haben.

    Funktionierte ja nach eigener Aussage (hat aber -wie angemerkt - trotzdem Fehler)



  • @DirkB

    Hmm. Alles Klar. Wäre interessant zu wissen wie ich die Fehler umgehen könnte. Ich Versuch mich mal daran.



  • @Semmel92 Ich hatte die Fehler benannt.
    Wenn du die Anmerkungen nicht verstehst, kannst du fragen.



  • @DirkB Danke für dein Feedback. Ich meinte wie ich das in C so schreibe das die Fehler nicht mehr passieren.

    LG



  • @Semmel92 sagte in Funktions Pointer:

    Ich meinte wie ich das in C so schreibe das die Fehler nicht mehr passieren.

    @DirkB sagte in Funktions Pointer:

    Der Formatspecifier für unsigned int bei scanf ist %u
    (Da sollte der Compiler eine Warnung geben)

    %u statt %d schreiben (auch bei printf), wenn es um eine unsigned Variable geht.

    Du hast fast jede Variable initialisiert, auch bei denen es nicht nötig wäre.
    Bist du dir sicher, das summe in jedem erdenklichen Fall auch Null ist?
    (Nein, das verlangt der Standard nicht)

    summe vor dem Aufruf auf 0 setzen oder besser innerhalb der Funktion
    Ähnlich wie bei produkt

    Beim Aufruf von prosum gehört bei vektor kein Adressoperator hin.

    Adressoperator & bei vektor weglassen

    Hat Zeile 25 nicht funktioniert?
    Was lief da nicht?

    Ist ja mit while gelöst, hustbaer hat es aber auch erklkärt.

    Und warum läuft deine Funktion zweimal über den vektor?

    Beide Berechnungen in einer Schleife machen.

    Was ist, wenn der Nutzer für len Werte über 50 eingibt?

    Eingabewert überprüfen.

    if (len > 50) {
      puts("Wert zu groß, Maximal 50! Bye!");
      return;
    }
    


  • hallo ich habe es so gmacht

    #include <stdio.h>
    #include <stdint.h>
    
    void prosum(int len, double *vektor, double *summe, double *produkt)
    {
        int i;
        vektor;
        *produkt =1;
        
        for (i=0; i<len; i++)
        {
        *summe +=  vektor[i];
        (*produkt) *=  vektor[i];
        }
      }
    
    int main()
    {
        double vektor[10];
        double summe, produkt;
        int i=0;
        unsigned int len=0;
    
        printf("Wieviele Zahlen wollen Sie eingeben: ");
    	scanf("%u", &len);		forum)
    	if (len > 10)
    	{
      		printf("Wert zu gross, Maximal 10!");
      	}
    	
        do{
    		printf("\nBitte geben sie eine Zahl ein: ");
    		scanf("%lf", &vektor[i]);
    		i++;
        }while (i<len);
    
        prosum(len, vektor, &summe, &produkt);
        printf("Summe:%.2f\nProdukt:%.2f\n", summe, produkt);
    
    	return 0;
    }
    


  • @razor sagte in Funktions Pointer:

    hallo ich habe es so gmacht

    Bleibt noch das Problem, das summe (oder *summe) nicht initialisiert wird.

    Automatische Variablen (die werden innerhalb einer Funktion definiert) werden nicht automatisch initialisiert (mit einem Wert vorbesetzt).

    Es wird einfach der Müll an der Speicherstelle genommen.
    Das kann 0 sein, muss es aber nicht.

    Globale und static Variablen werden - wenn nichts anderes angegeben wird - mit 0 initialisiert.


Log in to reply