Hallo Leute,
habe durch das Studium frisch angefangen C zu programmieren und zu
lernen. Nun bin ich bei Zeigern angelangt und Funktionen. Um halt ein
bisschen auszuprobieren wollte ich ein Programm schreiben das zwei
Vektoren addieren kann.
Nun folgendes Problem, ich gebe die Koordinaten für die Vektoren an,
danach soll das Unterprogramm gestartet werden, dass die beiden Vektoren
addiert.
Jedoch ist die 1. Koordinate des VektorA immer die 3. Koordiantate des
VektorB. Ich glaube ich habe da ein Problem mit der Adressierung, also
das sich da die Speicherzellen überschneiden. Im Anhang ist die .exe und
hier
So als Anmerkung:
Programme nur als Sourcecode, ausführbare Dateien sind hier nicht gern
gesehen.
C-Anfänger schrieb:> float vektora[2],vektorb[2],summe[2];
Wenn du drei Komponenten im Vektor haben willst, bruachst du auch
Speicherplatz dafür :-)
C-Anfänger schrieb:> float vektora[2],vektorb[2],summe[2];
Wie groß sind die?
C-Anfänger schrieb:> for(i=0; i<3; i++) {
Wie oft werden diese Schleifen durchlaufen?
Nach weiteren Fehlern hab ich jetzt nicht gesucht.
C-Anfänger schrieb:> float vektoraddition(float *vektora,float *vektorb,float *summe) {
...
C-Anfänger schrieb:> for(i=0; i<3; i++) {
Sehr schlechtes Design!
Woher weiss dein Unterprogramm, daß die übergebenen Arrays die Größe 3
haben?
Gar nicht!
Wenn Du sowas programmierst, dann solltest Du die Größe der Arrays bzw.
den Bereich den Du berechnen willst mit übergeben.
Udo Schmitt schrieb:> Wenn Du sowas programmierst, dann solltest Du die Größe der Arrays bzw.> den Bereich den Du berechnen willst mit übergeben.
So hast du auch mal angefangen.
Besser macht man es aber wirklich so:
i < sizeof(float) * size;
size muss dann natürlich übergeben werden.
Samuel K. schrieb:> i < sizeof(float) * size;
Was bei einem Array nicht immer stimmen muss, denn ja nach Größe der
Elemente und Zugriff auf die Hardware kann es sein, daß der Compiler
Füllbytes einfügt.
Deshalb sollte man die Berechnung des Speicheroffsets auch wenn möglich
dem Compiler überlassen und das Array als Array benutzen mit
Indexvariablen.
Ich dachte eher, daß man einer Funktion der man einen Vektor (Array)
übergint auch die Größe des Arrays mit übergeben sollte. Ansonsten
müsste man für jede unterschiedliche Arraygröße eine eigene Funktion
schreiben oder eine globale Variable benutzen.
Das war nur ein Hinweis, daß das keine gute Programmierung ist. Klar hat
jeder so mal angefangen und wo ist da jetzt das Problem? Ich habe den TE
weder beschimpft noch in irgendeiner Weise verunglimpft, sondern nur
einen Hinweis gegeben.
Wie gut das ich gerade erst angefangen habe C zu lernen und die ganzen
Tricks, Kniffe und Standarts nicht kenne. :D
Wäre schön zu hören warum die Methode das Array mit einer Schleife zu
füllen nicht so gut ist und welche Methode man ansonsten wählt.
Und wie muss man nun vorgehen um die größe richtig zu übergeben? Gibts
da ein Stichwort unter das man sich mal schlau machen sollte?!
C-Anfänger schrieb:> Und wie muss man nun vorgehen um die größe richtig zu übergeben? Gibts> da ein Stichwort unter das man sich mal schlau machen sollte?
nein dafür gibt es nicht wirklich ein stichwort.
#define MAX_ANZAHL 5
int liste[MAX_ANZAHL]
for( int i = 0; i < MAX_ANZAHL; ++i ) {
liste[i] = i;
}
C-Anfänger schrieb:> *(summe+i)=*(vektora+i)+*(vektorb+i);
das ist auch nicht gerade schön zu lesen, schreib es liebe so:
summe[i] = vektora[i] + vektorb[i];
C-Anfänger schrieb:> Wäre schön zu hören warum die Methode das Array mit einer Schleife zu> füllen nicht so gut ist und welche Methode man ansonsten wählt.
Die Methode ist gut, warum hast Du nicht mal über meine Frage
nachgedacht:
Udo Schmitt schrieb:> C-Anfänger schrieb:>> float vektora[2],vektorb[2],summe[2];> Wie groß sind die?>> C-Anfänger schrieb:>> for(i=0; i<3; i++) {> Wie oft werden diese Schleifen durchlaufen?
Klaus Wachtler schrieb:> Bei summe[i] etc. arbeitest du auch mit Zeigern; es ist> vollkommen gleichbedeutend mit *(summe+i).
Es ist sogar kommutativ. Ich bin mir nicht sicher, ob das so im Standard
verankert ist (da kann Kalsu Wachtler sicher aufklären), aber oft sind
folgende Ausdrücke gleichwertig:
Sven P. schrieb:> Kalsu
noch einer, der Pech an den Fingern hat.
Neulich hatte gleich drei aufeinanderfolgende Buchstabenpaare
jeweils evtruascht, und neuerdings verschieben sich manche
Buchstaben nicht nur um eine Stelle, sondern gleich um ehrerem...
Wenn ich darüber nachdenke, macht es mir etwas Sorgen.