einfaches c-Programm , Verständnisschwierigkeiten



  • Grüß euch, ich habe folgendes C-Programm das ich gerne verstehen würde, allerdings bin ich ein ziemlicher c-Anfänger. In dem Programm kann man einen Vektor eingeben und es wird einem Die Summe der Elemente des Vektors ausgegeben:

    #include<stdio.h>
    #include<math.h>
    #include<stdlib.h>
    
    typedef struct vector
    {
      int n;
      double *e;
    } vector_t;
    
    double abssum(vector_t *x)
    {
     double sum;
     int i;
     sum=0.0; 
     for(i=0;i<x->n;i++)
     {
      sum+=fabs(x->e[i]);
     }
     return sum;
    }
    
    vector_t vector_ein( void){
      vector_t A;
      int n;
      printf( "Anzahl der Elemente: ");
      scanf( "%d",&A.n);
      A.e=( double*)malloc(A.n*sizeof(double));
      printf( "Geben Sie die Elemente des Vectors ein: \n\n");
    
      for( n = 0; n < A.n ; n++)
          scanf( "%lg",&A.e[n]);
      return A;
    }
    
    int main(void)
    {
     double sum;
    
     vector_t v;
     v=vector_ein();
     sum=abssum(&v);
    
     printf("Die Summer betraegt: %g",sum);
    
     return 0;
    }
    

    Das erste was ich nicht verstehe, ist das " vector_t v;" in der main-Funktion.
    was macht das? vector_t ist ja keine Funktion oder? und was soll das v dahinter?
    gleich danach wird ja mit "v=vector_ein();" offensichtlich die Funktion zu Eingabe des Vektors aufgerufen. Heißt die Funktion nicht "vector_t vector_ein( void)"? Werden hier zwei Funktionen deklariert, einmal vector_t und einmal vector_ein ?

    Hoffe ihr könnt mir helfen.



  • Falsches Forum.



  • Verzeihung,
    wo wäre ich dann richtig, das hier ist doch ein C Forum?



  • gerhard schrieb:

    das hier ist doch ein C Forum?

    Ne, eben nicht, das ist das C++-Forum. Das C-Forum findest Du unter http://www.c-plusplus.net/forum/viewforum-var-f-is-10.html. Eventuell sieht den Thread ja ein Moderator und verschiebt ihn.



  • Hi !

    vector_t ist ein definierter Datentyp.

    vector_t v;
    Hier ist v also eine Variable vom Typ vector_t.

    vector_t vector_ein( void);
    vector_ein ist eine Funktion, die den Datentypen vector_t zurückgibt.
    🙂



  • Danke Proggingmania!

    Wird das in dieser Funktion definiert was vector_t für ein Datentyp ist?

    proggingmania schrieb:

    vector_t vector_ein( void);
    vector_ein ist eine Funktion, die den Datentypen vector_t zurückgibt.

    Muss man immer vor der Funktions-deklaration schreiben welcher Datentyp zurückgegeben werden soll?



  • Ich werde den Beitrag jetzt ins richtige Forum stellen.



  • Das wird hier definiert:

    typedef struct vector
    {
    int n;
    double *e;
    } vector_t;



  • Danke nochmals!

    Das mit der Struktur verstehe ich jetzt (einigermaßen).

    Diese Zeile verstehe ich noch gar nicht:
    double abssum(vector_t *x)

    irgendwie wird hier x als Zeiger auf vector_t festgelegt oder? nur das von allen Elementen der Absolutbetrag genommen wird.... weiß nicht ob das so stimmt.

    doch was soll dann das double am Beginn, und warum ein Zeiger?



  • gerhard schrieb:

    Ich werde den Beitrag jetzt ins richtige Forum stellen.

    Das ist genau was du nicht tun solltest. Wenn man im falschen Forum gelandet ist, wartet man bis ein Mod den Beitrag verschiebt.



  • Entschuldigung, das wusste ich nicht.
    Jetzt habe ich den Beitrag leider schon reingestellt. Vielleicht kann man ihn löschen oder so?



  • Ich habe ihn schon geschlossen. Löschen werde ich ihn, wenn dieser hier verschoben wurde.



  • kann es sein, dass jetzt beide Beiträge weg sind?



  • ist mein Post noch wo zu finden?



  • Keiner deiner beiden Threads wurde gelöscht. Lediglich der im C-Forum wurde geschlossen. Vielleicht einfach mal eine Seite zurückblättern? 🙄



  • stimmt...

    kann mir vielleicht noch jeman helfen das zu verstehen. Diese Zeile verstehe ich nicht:
    double abssum(vector_t *x)

    wird hier x ein Zeiger auf vector_t, nur das von allen Einträgen der Absolutbetrag genommen wird? was soll das doulbe, und warum ein Zeiger?



  • gerhard schrieb:

    stimmt...

    kann mir vielleicht noch jeman helfen das zu verstehen. Diese Zeile verstehe ich nicht:
    double abssum(vector_t *x)

    wird hier x ein Zeiger auf vector_t, nur das von allen Einträgen der Absolutbetrag genommen wird? was soll das doulbe, und warum ein Zeiger?

    Funktionen haben i.d.R. einen Rückgabewert, wenn nicht, dann steht da void vor.
    Die Funktion abssum gibt einen double Wert zurück.
    Der Übergabeparamater ist ein Zeiger auf vector_t.
    Zeiger als Parameter in Funktionen werden übergeben, wenn das Objekt auf den dieser Zeiger zeigt, geändert werden soll, oder wenn man vermeiden möchte, das die übergebenen Parameter kopiert werden( Zeitgewinn ).

    Würde also in der Klammer (vector_t x) anstelle von (vector_t *x) stehen,
    dann würde jedesmal die komplette Struktur die übergeben wird, kopiert und in die Variable x geschrieben werden. Das macht das System nämlich intern, automatisch.
    Da aber die Variable x ein Zeiger ist, wird nur ein einziger Wert übergeben, nämlich die Adresse der Struktur.

    In der Funktion vector_ein wird dynamisch Speicherplatz für ein double array erzeugt, welches in der Struktur A vom Typ vector_t ist.
    In der for-Schleife dieser Funktion wird dieser Speicherplatz mit den eingegebenen Werten belegt, dann wird die Struktur A zurückgegeben.

    Die Funktion abssum berechnet die Summe aller dieser eingegebenen double Werte.

    Im Programm fehlt noch die Freigabe des mit malloc reservierten Arbeitsspeichers.
    MfG

    D.A.



  • Hallo, Danke D.A!

    Jetzt sind mir nur noch wenige Sachen unklar.

    1. Warum heißt der Datentyp "vector_t" ? Ich dachte er wird am Beginn als "vector" definiert, und anschließend wird eine Variable vector_t vom Typ vector angelegt.
      Doch da in späteren Funktionen immer vector_t steht wird die Struktur wohl so bezeichnet... was ist dann aber das "vector" in der ersten Zeile nach "typedef struct" ?

    2. Die von D.A angesprochene Zeile: A.e=( double*)malloc(A.nsizeof(double));
      Was mach hier das "(double
      )" am Beginn ? Der Speicher wird ja mit malloc zugewiesen oder? Und... A ist ja schon vom Typ vector_t oder, und dort ist A.e vom Typ double! Warum muss dann nochmals die Größe von double ausgelesen werden? Würde das nicht einfach mit A.e+=A.n* gehen oder so, vielleicht in einer for schleife???

    3. Wie werden hier (Eingabe der Elemente des Vectors) bei scanf die einzelnen Elemente voneinander getrennt?
      Es funktioniert nämlich sowohl mit Leerzeichen, als auch mit Zeilenumbruch?



  • @1: Der Typ heißt entweder 'struct vector' oder (aufgrund des typedef's) 'vector_t' (in C++ könntest du ihn auch als 'vector' ansprechen, aber du redest ja von C).

    @2: Das ist ein Cast, der den von malloc() gelieferten void* (Zeiger auf beliebige Daten) uminterpretiert in einen double* (Zeiger auf ein (Array von) double). Und A.e ist rein zufällig ein double*.
    (für einen vernünftigen C-Compiler ist dieser Cast übrigens nicht erforderlich - und versteckt nur mögliche tiefersitzende Fehler)

    @3: scanf() liest so lange weiter, bis das nächste Zeichen nicht mehr zur Formatkennung passt (und fast immer gelten Whitespaces (Leerzeichen, Tab, Enter) als Ende der aktuellen Eingabe).



  • Danke CStoll,

    Nur 2) ist mir noch nicht ganz klar.
    Wo ist hier ein void Zeiger ? A ist vom Typ vector_t, A.n vom Typ int und A.e vom Typ double.
    Ich hätte das so geschrieben: A.e=malloc(A.n*sizeof(A.e*));
    da ich dachte A.e ist ja schon vom Typ double, warum ist das falsch?

    Also was macht das (double*)? Wo ist hier der void-Zeiger?


Anmelden zum Antworten