Kreuzprodukt und Speicherproblem
-
#include <stdio.h> #include <stdlib.h> int Kreuzprodukt(int *s1, int *s2 , int *s3, int anzahl){ int *hilf1=s1, *hilf2=s2,erst1=*s1, erst2=*s2,*adress=s3,i=anzahl; s1++;//Rechenregeln Des Kreuzproduktes werden Stumpf abegrasst s2++; hilf1=hilf1+2; hilf2=hilf2+2; while (anzahl>1){ *s3=(*s1)*(*hilf2)-(*s2)*(*hilf1); s1++; s2++; s3++; hilf1++; hilf2++; anzahl--; } *s3=(*hilf1)*(erst2)-(*hilf2)*(erst1); printf("Das Kreuzprodukt der beiden Vektoren ist:\n");//Alle Werte wurden in s3 geschriebn der wird hier ausgegeben while(i>0){ printf("%d\n",*adress); i--; } return(0); } int main(){ int n=0,i=0, *s1,*s2,*s3; printf("Wie viel ... haben die Vektoren? ");//Abfrage wie lang die Vektoren sind scanf(" %d", &n); s1= malloc(n*sizeof(int));//Speicher Allocierung s2= malloc(n*sizeof(int)); s3= malloc(n*sizeof(int)); if (s1==NULL||s2==NULL||s3==NULL){//Überprüfung ob Speicherplatz vorhanden war printf("Fehler in der Speicher Allocierung "); free(s1);//Abbruch wenn kein Speicher vorhanden und Freigabe des restlichen Speichers free(s2); free(s3); return(-1); } while (i<n){//Vektor 1 wird eingelesen printf("Bitte geben Sie den %d. Wert des ersten Vektors ein ",i+1); scanf(" %d",s1); i++; s1++; } i=0; while (i<n){//Vektor 2 wird eingelesen printf("Bitte geben Sie den %d. Wert des zweiten Vektors ein ",i+1); scanf(" %d",s2); i++; s2++; } s1=s1-(n-1);//Pointer wieder auf den ersten Wert setzen s2=s2-(n-1); Kreuzprodukt(s1,s2,s3,n);//An Funktion übergeben free(s1);//Danach Speicher wieder freigeben und beenden. free(s2); free(s3); return (0); }
Also ich habe 2 Probleme. 1. Egal welche Vektoren ich eingebe es kommt immer der 0 Vektor raus...ich habe das Gefühl das die Werte nicht richtig an die Kreuzprodukt Funktion übergeben werden.
2. Speicherfehler...immer wenn das Programm ausgeführt wurde gibt es am Ende:
*** glibc detected *** ./kreuz: free(): invalid pointer: 0x0000000000b80014 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x7a6e6)[0x7f1f47e426e6]
/lib/x86_64-linux-gnu/libc.so.6(cfree+0x6c)[0x7f1f47e469cc]
./kreuz[0x4008f7]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed)[0x7f1f47de930d]
./kreuz[0x400589]
======= Memory map: ========
00400000-00401000 r-xp 00000000 07:00 415093 /home/paddy/Dokumente/kreuz
00600000-00601000 r--p 00000000 07:00 415093 /home/paddy/Dokumente/kreuz
00601000-00602000 rw-p 00001000 07:00 415093 /home/paddy/Dokumente/kreuz
00b80000-00ba1000 rw-p 00000000 00:00 0 [heap]
7f1f40000000-7f1f40021000 rw-p 00000000 00:00 0
7f1f40021000-7f1f44000000 ---p 00000000 00:00 0
7f1f47bb2000-7f1f47bc7000 r-xp 00000000 07:00 918190 /lib/x86_64-linux-gnu/libgcc_s.so.1
7f1f47bc7000-7f1f47dc6000 ---p 00015000 07:00 918190 /lib/x86_64-linux-gnu/libgcc_s.so.1
7f1f47dc6000-7f1f47dc7000 r--p 00014000 07:00 918190 /lib/x86_64-linux-gnu/libgcc_s.so.1
7f1f47dc7000-7f1f47dc8000 rw-p 00015000 07:00 918190 /lib/x86_64-linux-gnu/libgcc_s.so.1
7f1f47dc8000-7f1f47f5f000 r-xp 00000000 07:00 914166 /lib/x86_64-linux-gnu/libc-2.13.so
7f1f47f5f000-7f1f4815e000 ---p 00197000 07:00 914166 /lib/x86_64-linux-gnu/libc-2.13.so
7f1f4815e000-7f1f48162000 r--p 00196000 07:00 914166 /lib/x86_64-linux-gnu/libc-2.13.so
7f1f48162000-7f1f48163000 rw-p 0019a000 07:00 914166 /lib/x86_64-linux-gnu/libc-2.13.so
7f1f48163000-7f1f48169000 rw-p 00000000 00:00 0
7f1f48169000-7f1f4818a000 r-xp 00000000 07:00 914163 /lib/x86_64-linux-gnu/ld-2.13.so
7f1f48372000-7f1f48375000 rw-p 00000000 00:00 0
7f1f48385000-7f1f48389000 rw-p 00000000 00:00 0
7f1f48389000-7f1f4838a000 r--p 00020000 07:00 914163 /lib/x86_64-linux-gnu/ld-2.13.so
7f1f4838a000-7f1f4838c000 rw-p 00021000 07:00 914163 /lib/x86_64-linux-gnu/ld-2.13.so
7fff40650000-7fff40671000 rw-p 00000000 00:00 0 [stack]
7fff407ff000-7fff40800000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
AbgebrochenOk das da irgendwas mit einem Pointer nicht so ganz klappt ist mir klar...aber was zur Hölle? Ich habe doch die 3 Pointer wieder frei gegeben...danke für Hilfe
-
Ah ich hab mein Fehler gefunden...auch wenn die Berechnung noch nicht richtig funzt.
Ich hab die Pointer übergeben an die Funktion obwohl sie nicht am Anfang der Funktion waren.
So gehts nu:
#include <stdio.h> #include <stdlib.h> int Kreuzprodukt(int *s1, int *s2 , int *s3, int anzahl){ int *hilf1=s1, *hilf2=s2,erst1=*s1, erst2=*s2,*adress=s3,i=anzahl; s1++;//Rechenregeln Des Kreuzproduktes werden Stumpf abegrasst s2++; hilf1=hilf1+2; hilf2=hilf2+2; while (anzahl>1){ *s3=(*s1)*(*hilf2)-(*s2)*(*hilf1); s1++; s2++; s3++; hilf1++; hilf2++; anzahl--; } *s3=(*hilf1)*(erst2)-(*hilf2)*(erst1); printf("Das Kreuzprodukt der beiden Vektoren ist:\n");//Alle Werte wurden in s3 geschriebn der wird hier ausgegeben while(i>0){ printf("%d\n",*adress); i--; } return(0); } int main(){ int n=0,i=0, *s1,*s2,*s3,*h1,*h2; printf("Wie viel ... haben die Vektoren? ");//Abfrage wie lang die Vektoren sind scanf(" %d", &n); s1= malloc(n*sizeof(int));//Speicher Allocierung s2= malloc(n*sizeof(int)); s3= malloc(n*sizeof(int)); if (s1==NULL||s2==NULL||s3==NULL){//Überprüfung ob Speicherplatz vorhanden war printf("Fehler in der Speicher Allocierung "); free(s1);//Abbruch wenn kein Speicher vorhanden und Freigabe des restlichen Speichers free(s2); free(s3); return(-1); } h1=s1; h2=s2; while (i<n){//Vektor 1 wird eingelesen printf("Bitte geben Sie den %d. Wert des ersten Vektors ein ",i+1); scanf(" %d",s1); i++; s1++; } i=0; while (i<n){//Vektor 2 wird eingelesen printf("Bitte geben Sie den %d. Wert des zweiten Vektors ein ",i+1); scanf(" %d",s2); i++; s2++; } s1=h1; s2=h2; Kreuzprodukt(s1,s2,s3,n);//An Funktion übergeben free(s1);//Danach Speicher wieder freigeben und beenden. free(s2); free(s3); return (0); }
Ich habs einfach h1 und h2 am Anfang die Anfangspositionen zugewiesne und die dann am Ende wieder zurück zugewiesen so das die pointer wieder am Anfang sind
-
Das ist völliger Quatsch, was du machst, und Speicherprobleme sind da vorprogrammiert. Normal hätt ich gesagt, dein erstes Problem findest du ganz leicht mit dem Debugger raus, aber es lohnt sich nicht, das zu Debuggen, schmeiß den Code weg.
-
-
In Zeile 12 und 20 liest du fröhlich über die Feldgrenzen hinweg.
Pointer kannst du dereferenzieren wie Arrays, also
ptr[3]
ist das gleiche wie*(ptr + 3)
oder wie du wohl schreiben würdest:
hilf = ptr; ++hilf; ++hilf; ++hilf; *hilf;
Und wenn ich mich auf diese Weise über deinen Stil lustig mache, dann wird dir hoffentlich von selber klar, was an diesem Stil nicht stimmt.Wenn du das verbesserst, dann sollten dir deine Fehler auch klar werden. Oder besser ist, du machst es wie Mechanics vorgeschlagen hat und schreibst es von grundauf neu. Um die paar Zeilen ist es nicht schade und ein Ausbessern wäre mehr Arbeit als sauberes Neuschreiben.
-
wikipedia schrieb:
But if the product is limited to non-trivial binary products with vector results, it exists only in three and seven dimensions.
Deswegen ist z.B. die Angabe der Laenge eher sinnlos.