Forum: PC-Programmierung Problem mit C Programm


von C-Anfänger (Gast)


Lesenswert?

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
1
#include <stdio.h>
2
#include <stdlib.h>
3
4
// Unterprogramme
5
float vektoraddition(float *vektora,float *vektorb,float *summe) {
6
      int i;
7
      
8
      printf("\n\tRechnung der Addition\n");
9
      printf("VektorA\t\t\tVektorB\t\tSumme\n");
10
      for(i=0; i<3; i++) {
11
               *(summe+i)=*(vektora+i)+*(vektorb+i);
12
               
13
               printf("%f\t+\t%f =\t%f\n",*(vektora+i),*(vektorb+i),*(summe+i));
14
      }
15
      printf("\n");
16
      return;
17
}
18
19
int main()
20
{
21
   // Variablen
22
   int i;
23
   float vektora[2],vektorb[2],summe[2];
24
 
25
   // Eingabe
26
   printf("\tEingabe der Koordinaten von VektorA\n");
27
   for(i=0; i<3; i++) {
28
            printf("%i.Koordinate: ",i+1); scanf("%f",&vektora[i]);
29
   } 
30
   
31
   printf("\n\tEingabe der Koordinaten von VektorB\n");
32
   for(i=0; i<3; i++) {
33
            printf("%i.Koordinate: ",i+1); scanf("%f",&vektorb[i]);
34
   }
35
   
36
   // Addition von VektorA und VektorB
37
   vektoraddition(&vektora,&vektorb,&summe);
38
   
39
   // Ausgabe
40
   printf("\tDie Summe beider Vektoren \n");
41
   for(i=0; i<3; i++) {
42
            printf("%i.Koordinate: %f\n",i+1,summe[i]);
43
   }
44
   
45
   // Programmende
46
   printf("\n");
47
   system("PAUSE");  
48
   return 0;
49
}

Falls jemand weiss woher dieser Fehler kommt, würde ich mich über eine 
gute Beschreibung freuen.

von Floh (Gast)


Lesenswert?

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 :-)

von C-Anfänger (Gast)


Lesenswert?

Floh schrieb:
> Wenn du drei Komponenten im Vektor haben willst, bruachst du auch
> Speicherplatz dafür :-)

Das heisst?

von Udo S. (urschmitt)


Lesenswert?

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.

von Udo S. (urschmitt)


Lesenswert?

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.

von Sam .. (sam1994)


Lesenswert?

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.

von Udo S. (urschmitt)


Lesenswert?

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.

von Klaus W. (mfgkw)


Lesenswert?

Samuel K. schrieb:
> i < sizeof(float) * size;

wo bitte willst du hier sizeof() verwenden?

von Benny (Gast)


Lesenswert?

Samuel K. schrieb:
> i < sizeof(float) * size;

Unsinn, i ist doch ein Index
i<size ist richtig

von C-Anfänger (Gast)


Lesenswert?

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?!

von Peter (Gast)


Lesenswert?

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;
}

von Floh (Gast)


Lesenswert?

du kannst die größe z.B. als Variable der Funktion übergeben, dann geht 
deine Funktion auch für verschiedene Vektoren.
z.B. so (ist ungetestet):
1
void vektoraddition(float a[],float b[],float sum[], int dimensions)
2
{
3
  for(int i=0;i < dimensions;i++)
4
    sum[i] = a[i] + b[i];
5
}
:-)

von Peter (Gast)


Lesenswert?

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];

von C-Anfänger (Gast)


Lesenswert?

Danke für die guten Anregungen :)
Wollte dabei aber möglichst mit dem Zeiger Sachen arbeiten. Deshalb das
*(summe+i)=*(vektora+i)+*(vektorb+i);

von Klaus W. (mfgkw)


Lesenswert?

Bei summe[i] etc. arbeitest du auch mit Zeigern; es ist
vollkommen gleichbedeutend mit *(summe+i).

von Sam .. (sam1994)


Lesenswert?

Benny schrieb:
> Unsinn, i ist doch ein Index
> i<size ist richtig

Sorry ich war irgendwie bei Zeigern.

von Udo S. (urschmitt)


Lesenswert?

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?

von Sven P. (Gast)


Lesenswert?

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:
1
summe[i]
2
i[summe]

Oder ganz in die Irre führend:
1
char zeichen = 3["abcde"];

von Klaus W. (mfgkw)


Lesenswert?

Ja, ist per Definition und zuverlässig gleich.

von Klaus W. (mfgkw)


Lesenswert?

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.

von Rolf M. (rmagnus)


Lesenswert?

Daß Wörter mhnacmal fhlcsa gerisecbhen wrdne, ist doch ganz onrlma.
Das passiert schon mal und lockert die Diskussion auf ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.