Vektoren vergleich in C



  • Ja - meinetwegen.

    Und wenn Du es kompilierst und ausprobierst? Was siehst Du? Was hättest Du erwartet? Kannst Du Dir vorstellen, was der Fehler ist?

    Ich sehe Deinen edit: Ausgabe ist 000...
    Was könnte denn der Grund sein? Ist ja alles in allem ein relativ überschaubares Programm...



  • Vergleiche mal im Originalbeitrag Zeile 46 mit Zeile 4.
    Und Zeile 50 und 51 löschen, da diese ja schon als Parameter übergeben werden...



  • Hätte gedacht, dass der Grund ist, dass v[] halt eben nicht V1[] ist? Nur wenn ich bei der vec_print Funktion auch V1 einsetze, ist dieses Array ja noch nicht deklariert.



  • Th69 schrieb:

    Vergleiche mal im Originalbeitrag Zeile 46 mit Zeile 4.
    Und Zeile 50 und 51 löschen, da diese ja schon als Parameter übergeben werden...

    Bei einem kommt int vor, bei dem anderen nicht.

    Allerdings verstehe ich nicht, wieso die Zeilen wegkönnen, dann würde das Programm doch meckern, dass diese nicht in Verbindung mit dem Array deklariert wurden, oder?



  • In C werden Befehle ausgeführt, wenn sie an der Reihe sind.

    Bei dir wird das Array mit den Werten von X1, X2 und X3 gefüllt (kopiert), die sie zu dem Zeitpunkt hatten, als das Array angelegt wurde.
    (Da dies Xn globale Variablen sind, sind sie mit 0 initialisiert.)

    Egal welchen Wert diese Xn noch bekommen, v wird dadurch nicht verändert, da ist keine weitere Verbindung dazu gibt.



  • Tergo schrieb:

    Hätte gedacht, dass der Grund ist, dass v[] halt eben nicht V1[] ist? Nur wenn ich bei der vec_print Funktion auch V1 einsetze, ist dieses Array ja noch nicht deklariert.

    In vec_print() ist das Array das gleiche.

    Es ist viel simpler. Ergänz das Programm mal um eine Ausgabe der einzelnen (globalen) Variablen.

    PS: der Grund für die "blöde" schnitzeljagd hier ist, dass ich denke dass Du möglichst viel experimentieren solltest.



  • Furble Wurble schrieb:

    Tergo schrieb:

    Hätte gedacht, dass der Grund ist, dass v[] halt eben nicht V1[] ist? Nur wenn ich bei der vec_print Funktion auch V1 einsetze, ist dieses Array ja noch nicht deklariert.

    In vec_print() ist das Array das gleiche.

    Es ist viel simpler. Ergänz das Programm mal um eine Ausgabe der einzelnen (globalen) Variablen.

    PS: der Grund für die "blöde" schnitzeljagd hier ist, dass ich denke dass Du möglichst viel experimentieren solltest.

    So?

    #include <stdio.h>
    
    int X1,X2,X3; 
    
    void vec_print(int v[3])
    {
        printf("%d", X1);
        printf("%d", X2);
        printf("%d", X3);
    }
    
    int main(void)
    {
        int V1[3]={X1,X2,X3};
    
        printf("Enter the values of Vector 1");
        scanf("%d",&X1);
        scanf("%d",&X2);
        scanf("%d",&X3);
    
        vec_print(V1);
    }
    

    Ich glaube langsam steige ich dahinter, allerdings: wieso steht bei dem Einsatz der Funktion dann noch in der Klammer int v[3]? Muss es sich hierbei einfach um ein anderes Array handeln, als das Original, welches aus der main geschickt wird?



  • #include <stdio.h>
    #include <math.h>
    
    int compVecLen(int v1[], int v2[]); char result;
    int X1,X2,X3,Y1,Y2,Y3;
    int A1,A2,A3,B1,B2,B3;
    int c,d;
    int amountv1, amountv2;
    int main()
    
    {
    
    int V1[3]={X1,X2,X3};
    int V2[3]={Y1,Y2,Y3};
    
    printf("Enter the values of Vector 1");
    scanf("%d",&X1);
    scanf("%d",&X2);
    scanf("%d",&X3);
    
    printf("Enter the values of Vector 2");
    scanf("%d",&Y1);
    scanf("%d",&Y2);
    scanf("%d",&Y3);
    
    result=compVecLen(V1,V2);
    
    if(result=d)
    {
    printf("|V1| > |V2|");
    }
    if(result=c)
    {
    printf("|V1| < |V2|");
    }
    else
    {
    printf("|V1| = |V2|");
    }
    
    return 0;
    
    }
    
    int compVecLen(int v1[], int v2[])
    
    {
    
    amountv1=sqrt(A1*A1+A2*A2+A3*A3);
    amountv2=sqrt(B1*B1+B2*B2+B3*B3);
    
    if(amountv1<amountv2)
    {
    return c;
    }
    
    if(amountv1>amountv2)
    {
    return d;
    }
    
    else
    {
    return 0;
    }
    
    }
    

    So funktioniert jetzt schon mal das Programm, vielen Dank bis dahin! Allerdings erhalte ich egal welche Werte ich eingebe, die 'else'-Option, also laut Programm sind die Vektoren immer gleich lang. Ich tüftel allerdings noch dran..

    edit: es scheitert offenbar bereits an der Rechnung. Ich schicke die Werte aus der Main nicht richtig in die compVecLen Function, denke ich. Sehe jedoch momentan noch nicht den Unterschied zu dem Beispiel von Furble Wurble.

    Habe nun überlegt, es genauso zu gestalten, wie im Beispiel von Furble Wurble, also ohne As und Bs (welche momentan noch als Integer deklariert sind). Das Programm startet allerdings auch wieder zum Schluss mit dem Else Statement..

    #include <stdio.h>
    #include <math.h>
    
    int compVecLen(int v1[], int v2[]); char result;
    int X1,X2,X3,Y1,Y2,Y3;
    int A1,A2,A3,B1,B2,B3;
    int c,d;
    int amountv1, amountv2;
    int main()
    
    {
    
    int V1[3]={X1,X2,X3};
    int V2[3]={Y1,Y2,Y3};
    
    printf("Enter the values of Vector 1");
    scanf("%d",&X1);
    scanf("%d",&X2);
    scanf("%d",&X3);
    
    printf("Enter the values of Vector 2");
    scanf("%d",&Y1);
    scanf("%d",&Y2);
    scanf("%d",&Y3);
    
    result=compVecLen(V1,V2);
    
    if(result=d)
    {
    printf("|V1| > |V2|");
    }
    if(result=c)
    {
    printf("|V1| < |V2|");
    }
    else
    {
    printf("|V1| = |V2|");
    }
    
    return 0;
    
    }
    
    int compVecLen(int v1[3], int v2[3])
    
    {
    
    amountv1=sqrt(X1*X1+X2*X2+X3*X3);
    amountv2=sqrt(Y1*Y1+Y2*Y2+Y3*Y3);
    
    if(amountv1<amountv2)
    {
    return c;
    }
    
    if(amountv1>amountv2)
    {
    return d;
    }
    
    else
    {
    return 0;
    }
    
    }
    


  • Tergo schrieb:

    Ich glaube langsam steige ich dahinter, allerdings: wieso steht bei dem Einsatz der Funktion dann noch in der Klammer int v[3]? Muss es sich hierbei einfach um ein anderes Array handeln, als das Original, welches aus der main geschickt wird?

    Wie gesagt es ist kein anderes Array.
    Das Array, dass Du in vec_print() hast, ist jenes welches Du beim Aufruf reinsteckst:

    int main(void)
    {
    	int V1[3] = {7, 8, 9};
    	vec_print(V1);
    }
    

    Das eröffnet sogar die interessante Möglichkeit, direkt ins Array zu lesen:

    void vec_read(int v[3]) {
    	scanf("%d %d %d",&v[0], &v[1], &v[2]);
    }
    
    int main(void)
    {
    	int V1[3];
    	vec_read(V1);
    	vec_print(V1);
    }
    


  • Habe oben noch 'geedited'. Liegt es dann an der Berechnung der Beträge?



  • Das hat dir DirkB schon geschrieben (auch wenn es hier ein wenig durcheinander ging 😉

    Entweder verwende für scanf direkt die Adressen der einzelnen Array-Werte (z.B. &v[0]) oder aber initialisiere das Array nach den Eingaben (je nach C Compiler C89/C99 benötigst du einen eigenen Block { ... } dafür).



  • Das heißt, wenn ich X1,X2,X3,Y1,Y2,Y3 gar nicht mehr benötige, darf der Code dann so aussehen?

    #include <stdio.h>
    #include <math.h>
    
    int compVecLen(int v1[], int v2[]); char result;
    int X1,X2,X3,Y1,Y2,Y3;
    int A1,A2,A3,B1,B2,B3;
    int c,d;
    int amountv1, amountv2;
    int main()
    
    {
    
    int V1[3]={X1,X2,X3};
    int V2[3]={Y1,Y2,Y3};
    
    printf("Enter the values of Vector 1");
    scanf("%d",&V1[0]);
    scanf("%d",&V1[1]);
    scanf("%d",&V1[2]);
    
    printf("Enter the values of Vector 2");
    scanf("%d",&V2[0]);
    scanf("%d",&V2[1]);
    scanf("%d",&V2[2]);
    
    result=compVecLen(V1,V2);
    
    if(result=d)
    {
    printf("|V1| > |V2|");
    }
    if(result=c)
    {
    printf("|V1| < |V2|");
    }
    else
    {
    printf("|V1| = |V2|");
    }
    
    return 0;
    
    }
    
    int compVecLen(int v1[3], int v2[3])
    
    {
    
    amountv1=sqrt(v1[1]*v1[1]+v1[2]*v1[2]+v1[3]*v1[3]);
    amountv2=sqrt(v2[1]*v2[1]+v2[2]*v2[2]+v2[3]*v2[3]);
    
    if(amountv1<amountv2)
    {
    return c;
    }
    
    if(amountv1>amountv2)
    {
    return d;
    }
    
    else
    {
    return 0;
    }
    
    }
    

    Und die eingegebenen Daten in das Array zu initialisieren sähe dann so aus?

    #include <stdio.h>
    #include <math.h>
    
    int compVecLen(int v1[], int v2[]); char result;
    int X1,X2,X3,Y1,Y2,Y3;
    int A1,A2,A3,B1,B2,B3;
    int c,d;
    int amountv1, amountv2;
    int main()
    
    {
    
    int V1[3]={X1,X2,X3};
    int V2[3]={Y1,Y2,Y3};
    
    printf("Enter the values of Vector 1");
    scanf("%d",&X1);
    scanf("%d",&X2);
    scanf("%d",&X3);
    
    printf("Enter the values of Vector 2");
    scanf("%d",&Y1);
    scanf("%d",&Y2);
    scanf("%d",&Y3);
    
    X1=V1[0];
    X2=V1[1];
    X3=V1[2];
    Y1=V2[0];
    Y2=V2[1];
    Y3=V2[2];
    
    result=compVecLen(V1,V2);
    
    if(result=d)
    {
    printf("|V1| > |V2|");
    }
    if(result=c)
    {
    printf("|V1| < |V2|");
    }
    else
    {
    printf("|V1| = |V2|");
    }
    
    return 0;
    
    }
    
    int compVecLen(int v1[3], int v2[3])
    
    {
    
    amountv1=sqrt(X1*X1+X2*X2+X3*X3);
    amountv2=sqrt(Y1*Y1+Y2*Y2+Y3*Y3);
    
    if(amountv1<amountv2)
    {
    return c;
    }
    
    if(amountv1>amountv2)
    {
    return d;
    }
    
    else
    {
    return 0;
    }
    
    }
    

    Erhalte allerdings weiterhin das Else Statement als Ausgabe...



  • gcc.godbolt.org mit clang 3.8 und -Wall als Parameter liefert dir noch ein bisschen was zum schauen



  • Gast3 schrieb:

    gcc.godbolt.org mit clang 3.8 und -Wall als Parameter liefert dir noch ein bisschen was zum schauen

    Leider verstehe ich dabei nur böhmische Dörfer 😕
    ich versuche zwar in etwa nachzuvollziehen, was dort passiert, aber mit der Ansicht ziemlich überfordert. Hast du noch einen Tipp?



  • Bin leider völlig mit meinem Latein am Ende. Vorher wusste ich zwar auch nicht genau, WAS falsch war, aber ich hatte das Gefühl, dass etwas nicht stimmen konnte. Jetzt, egal wie oft ich den Code Zeile für Zeile durchgehe, denke ich, dass es doch eigentlich stimmen müsste..

    Edit: Folgendes: müsste es bei den if-Statements mit Result nicht '==' heißen? Wenn ich das tue, erfolgt bei jeglicher Werteingabe das Statement von result==d UND result==c.



  • Tergo schrieb:

    Leider verstehe ich dabei nur böhmische Dörfer 😕
    ich versuche zwar in etwa nachzuvollziehen, was dort passiert, aber mit der Ansicht ziemlich überfordert. Hast du noch einen Tipp?

    Du bist davon überfordert, die Warnung, die dein Code produziert, nachzuvollziehen? Das ist in weniger als 5 Sekunden zu finden und in zwei Sekunden zu fixen.

    Tergo schrieb:

    Edit: Folgendes: müsste es bei den if-Statements mit Result nicht '==' heißen? Wenn ich das tue, erfolgt bei jeglicher Werteingabe das Statement von result==d UND result==c.

    Bingo. Jetzt schau dir noch mal genau ab, wie dein if-else Konstrukt aussieht, da fehlt nämlich auch was.

    Wann werden c und d gesetzt?



  • dachschaden schrieb:

    Tergo schrieb:

    Leider verstehe ich dabei nur böhmische Dörfer 😕
    ich versuche zwar in etwa nachzuvollziehen, was dort passiert, aber mit der Ansicht ziemlich überfordert. Hast du noch einen Tipp?

    Du bist davon überfordert, die Warnung, die dein Code produziert, nachzuvollziehen? Das ist in weniger als 5 Sekunden zu finden und in zwei Sekunden zu fixen.

    Ich dachte eher, dass Hauptaugenmerk liegt auf der linken Seite. Die einzige Warnung, die dann kam, drehte sich um das result==c und result==d, welches ich nun behoben habe. Die Berechnung wird jedoch weiterhin nicht richtig ausgeführt. Gcc Godbolt spuckt keine weiteren Warnungen aus.

    Dementsprechend sieht der Code nun wie folgt aus:

    #include <stdio.h>
    #include <math.h>
    
    int compVecLen(int v1[], int v2[]); char result;
    int X1,X2,X3,Y1,Y2,Y3;
    int A1,A2,A3,B1,B2,B3;
    int c,d;
    int amountv1, amountv2;
    int main()
    
    {
    
    int V1[3]={X1,X2,X3};
    int V2[3]={Y1,Y2,Y3};
    
    printf("Enter the values of Vector 1");
    scanf("%d",&X1);
    scanf("%d",&X2);
    scanf("%d",&X3);
    
    printf("Enter the values of Vector 2");
    scanf("%d",&Y1);
    scanf("%d",&Y2);
    scanf("%d",&Y3);
    
    X1=V1[0];
    X2=V1[1];
    X3=V1[2];
    Y1=V2[0];
    Y2=V2[1];
    Y3=V2[2];
    
    result=compVecLen(V1,V2);
    
    if(result==d)
    {
    printf("|V1| > |V2|");
    }
    if(result==c)
    {
    printf("|V1| < |V2|");
    }
    else
    {
    printf("|V1| = |V2|");
    }
    
    return 0;
    
    }
    
    int compVecLen(int v1[3], int v2[3])
    
    {
    
    amountv1=sqrt(X1*X1+X2*X2+X3*X3);
    amountv2=sqrt(Y1*Y1+Y2*Y2+Y3*Y3);
    
    if(amountv1<amountv2)
    {
    return c;
    }
    
    if(amountv1>amountv2)
    {
    return d;
    }
    
    else
    {
    return 0;
    }
    
    }
    


  • 'c' und 'd' werden eingesetzt, wenn amountv1<amountv2 bzw. amountv1>amountv2 ergibt



  • Tergo schrieb:

    Ich dachte eher, dass Hauptaugenmerk liegt auf der linken Seite.

    Weil da auch der Compiler-Output rauskommt, wa? Oh, nee, warte, das war der Input ... 🙄

    Tergo schrieb:

    Die einzige Warnung, die dann kam, drehte sich um das result==c und result==d, welches ich nun behoben habe. Die Berechnung wird jedoch weiterhin nicht richtig ausgeführt. Gcc Godbolt spuckt keine weiteren Warnungen aus.

    Joa, das heißt halt, dass dein Programm syntaktisch korrekt ist, aber semantisch halt nicht. Sprich, du hast noch Fehler drinne, die dafür sorgen, dass es nicht so läuft, wie beabsichtigt.

    Der Compiler kann dich vor einigen Fehlern warnen, aber bei weitem nicht vor allen.

    Tergo schrieb:

    'c' und 'd' werden eingesetzt, wenn amountv1<amountv2 bzw. amountv1>amountv2 ergibt

    Die Frage war "Wann werden diese gesetzt?", nicht "eingesetzt".
    Du verwendest diese Variablen, ohne ihnen einen Wert zugewiesen zu haben. Globale und statische Variablen werden immer mit 0 initialisiert, d.h. dass du in jedem Fall immer und immer 0 zurückgibst in compVecLen .

    Ich würde deinem Dozenten mal auf den Tisch kotzen, wenn ich du wäre, offensichtlich weißt du nicht, was du tust.



  • Entschuldigung, hatte mich verschrieben, ich meinte die rechte Seite..

    Kann ich den Fehler beheben indem ich die if Statements der Funktion wie folgt ändere?:

    if(amountv1<amountv2)
    {
    return result=c;
    }
    
    if(amountv1>amountv2)
    {
    return result=d;
    }
    
    else
    {
    return 0;
    }
    

Anmelden zum Antworten