mikrocontroller.net

Forum: PC-Programmierung Problem mit C Programm


Autor: C-Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
#include <stdio.h>
#include <stdlib.h>

// Unterprogramme
float vektoraddition(float *vektora,float *vektorb,float *summe) {
      int i;
      
      printf("\n\tRechnung der Addition\n");
      printf("VektorA\t\t\tVektorB\t\tSumme\n");
      for(i=0; i<3; i++) {
               *(summe+i)=*(vektora+i)+*(vektorb+i);
               
               printf("%f\t+\t%f =\t%f\n",*(vektora+i),*(vektorb+i),*(summe+i));
      }
      printf("\n");
      return;
}

int main()
{
   // Variablen
   int i;
   float vektora[2],vektorb[2],summe[2];
 
   // Eingabe
   printf("\tEingabe der Koordinaten von VektorA\n");
   for(i=0; i<3; i++) {
            printf("%i.Koordinate: ",i+1); scanf("%f",&vektora[i]);
   } 
   
   printf("\n\tEingabe der Koordinaten von VektorB\n");
   for(i=0; i<3; i++) {
            printf("%i.Koordinate: ",i+1); scanf("%f",&vektorb[i]);
   }
   
   // Addition von VektorA und VektorB
   vektoraddition(&vektora,&vektorb,&summe);
   
   // Ausgabe
   printf("\tDie Summe beider Vektoren \n");
   for(i=0; i<3; i++) {
            printf("%i.Koordinate: %f\n",i+1,summe[i]);
   }
   
   // Programmende
   printf("\n");
   system("PAUSE");  
   return 0;
}


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

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: C-Anfänger (Gast)
Datum:

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

Das heisst?

Autor: Udo Schmitt (urschmitt)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Udo Schmitt (urschmitt)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sam .. (sam1994)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Udo Schmitt (urschmitt)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Samuel K. schrieb:
> i < sizeof(float) * size;

wo bitte willst du hier sizeof() verwenden?

Autor: Benny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Samuel K. schrieb:
> i < sizeof(float) * size;

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

Autor: C-Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?!

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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):
void vektoraddition(float a[],float b[],float sum[], int dimensions)
{
  for(int i=0;i < dimensions;i++)
    sum[i] = a[i] + b[i];
}
:-)

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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];

Autor: C-Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);

Autor: Klaus Wachtler (mfgkw)
Datum:

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

Autor: Sam .. (sam1994)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Benny schrieb:
> Unsinn, i ist doch ein Index
> i<size ist richtig

Sorry ich war irgendwie bei Zeigern.

Autor: Udo Schmitt (urschmitt)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
summe[i]
i[summe]

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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, ist per Definition und zuverlässig gleich.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf Magnus (rmagnus)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.