1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Probleme bei der Umsetzung eines C-Programms

  • Ramrod
  • 16. Dezember 2017 um 16:02
  • Unerledigt
  • Ramrod
    2
    Ramrod
    Mitglied
    Punkte
    25
    Beiträge
    3
    • 16. Dezember 2017 um 16:02
    • #1

    Hallo liebe Gemeinde!

    Ich komme hier einfach nicht weiter und wollte die Profis hier um Hilfe bitten, bevor ich endgültig verzweifel.

    Ich will ein C Programm schreiben, dass mittels 3 Funktionen Vektornormen (Summennorm, Eukl. Norm und Max. Norm) berechnet.
    Eine Main soll die 3 Funktionen dann einfach nur testen, also die Funktionen aufrufen und zwar für Vektoren der Länge 100 - initialisiert mit Zufallszahlen aus [0; 1).

    So, die 3 Funktionen habe ich hinbekommen, plus ein Großteil der Main. Aber irgendwie läuft es nicht ganz rund bzw. lässt sich nicht kompilieren. Probleme gibt es beim Aufrufen der Funktionen und der Compiler meckert über die RAND Funktion und den RAND_MAX Ausdruck. Komme einfach nicht weiter. Bin auch gerade erst ganz ganz frisch in die Themen Pointer und Felder eingestiegen, von daher bitte ich um Nachsicht :shiner:...

    Hier mal der Quellcode:

    C
    #include <stdio.h>
    #include <math.h>
    #include <time.h>
    
    
    enum { N = 100 }; // zeigt nur weitere Eigenschaft von Enum -> konst. Wert
    
    
    double norm1(int n, double* v)
    {   
        double v1 = 0;
    
        for(int i = 0; i < n; i++)
        {
          v1 += fabs(v[i]); 
        }
    
        return v1;
    }
    
    
    double norm2(int n, double* v)
    {
        double v2 = 0;
    
        for(int i = 0; i < n; i++)
        {
          v2 += pow(v[i], 2);
        }
    
          v2 = sqrt(v2);
    
        return v2;
    }
    
    
    double normInf(int n, double* v)
    {
        double vmax = v[0];
    
        for(int i = 0; i < n; i++)
        {
          if(fabs(v[i]) > vmax)
        vmax = v[i];
        }
    
        return vmax;
    }
    
    
    
    
    int main(void)
    {
        double v[N];
    
    
        // Initialisiere v mit Zufallszahlen
    
    
    //     srand(time(NULL));
        srand(time(NULL));
    
    //     v[N] = rand() % 2;
    
        for(int i = 0; i < N; i++)
        {
            v[i] = (double)rand() / RAND_MAX;
    
            printf("%lf", v[i]);
        }
    
        printf("Vektornorm 1: %lf\n", norm1(N, &v[i]));
        printf("Vektornorm 2: %lf\n", norm2(N, &v[i]));
        printf("Vektornorm Inf: %lf\n", normInf(N, &v[i]));
    
    
        return 0;
    }
    Alles anzeigen
  • Paulchen
    1
    Paulchen
    Gast
    • 16. Dezember 2017 um 16:56
    • #2

    Was bei solchen Fragen grundsätzlich hilfreich ist, ist das Angeben der genauen Fehlermeldungen, die der Compiler ausspuckt. In diesem Fall sehen diese Meldungen so aus:

    Code
    bla.c: In function 'main':
    bla.c:54:5: warning: implicit declaration of function 'srand'; did you mean 'scanf'? [-Wimplicit-function-declaration]
         srand(time(NULL));
         ^~~~~
         scanf
    bla.c:60:24: warning: implicit declaration of function 'rand'; did you mean 'nanl'? [-Wimplicit-function-declaration]
             v[i] = (double)rand() / RAND_MAX;
                            ^~~~
                            nanl
    bla.c:60:33: error: 'RAND_MAX' undeclared (first use in this function); did you mean 'TMP_MAX'?
             v[i] = (double)rand() / RAND_MAX;
                                     ^~~~~~~~
                                     TMP_MAX
    bla.c:60:33: note: each undeclared identifier is reported only once for each function it appears in
    bla.c:65:47: error: 'i' undeclared (first use in this function)
         printf("Vektornorm 1: %lf\n", norm1(N, &v[i]));
                                                   ^
    Alles anzeigen

    Für die ersten drei Fehler helfen dir die Manpages der entsprechenden Funktionen. In der Manpage von rand(3) steht dann zum Beispiel:

    Code
    SYNOPSIS
           #include <stdlib.h>
    
    
           int rand(void);
    
    
           int rand_r(unsigned int *seedp);
    
    
           void srand(unsigned int seed);
    Alles anzeigen

    Du brauchst also noch stdlib.h.

    Die vierte Fehlermeldung sagt dir, dass du die Variable i außerhalb des Bereiches verwendest, in dem sie deklariert ist; sie ist nämlich nur für die for-Schleife deklariert.

  • Ramrod
    2
    Ramrod
    Mitglied
    Punkte
    25
    Beiträge
    3
    • 16. Dezember 2017 um 18:24
    • #3

    Vielen Dank für die schnelle Antwort. Ach stimmt, die Bib ganz vergessen einzubinden, oh man :o. Und i ist ja wirklich nur innerhalb der Schleife initialisiert.
    Hab`s jetzt mal abgeändert. Lässt sich schon mal kompilieren, bin mir allerdings noch unsicher ob es auch die gewollten bzw. richtigen Ausgaben erzeugt :confused:..

    C
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <math.h>
    
    
    enum { N = 100 }; // zeigt nur weitere Eigenschaft von Enum -> konst. Wert
    
    
    double norm1(int n, double* v)
    {   
        double v1 = 0;
    
        for(int i = 0; i < n; i++)
        {
          v1 += fabs(v[i]); 
        }
    
        return v1;
    }
    
    
    double norm2(int n, double* v)
    {
        double v2 = 0;
    
        for(int i = 0; i < n; i++)
        {
          v2 += pow(v[i], 2);
        }
    
        return sqrt(v2);
    }
    
    
    double normInf(int n, double* v)
    {
        double vmax = v[0];
    
        for(int i = 0; i < n; i++)
        {
          if(fabs(v[i]) > vmax)
        vmax = v[i];
        }
    
        return vmax;
    }
    
    
    
    
    int main(void)
    {
        double v[N];
    
    
        // Initialisiere v mit Zufallszahlen
    
    
        srand(time(NULL));
    
        for(int i = 0; i < N; i++)
        {
            v[i] = (double)rand() / RAND_MAX;
        }
    
        printf("Summennorm: %lf\n", norm1(N, v));
        printf("Euklidische Norm: %lf\n", norm2(N, v));
        printf("Maximusnorm: %lf\n", normInf(N, v));
    
    
        return 0;
    }
    Alles anzeigen
  • stackoverflow
    5
    stackoverflow
    Mitglied
    Reaktionen
    8
    Punkte
    258
    Beiträge
    49
    • 22. Dezember 2017 um 00:06
    • #4
    Zitat

    Lässt sich schon mal kompilieren, bin mir allerdings noch unsicher ob es auch die gewollten bzw. richtigen Ausgaben erzeugt

    schreib dir für solche Fälle eine Testfunktion, die dir das Array statt mit Zufallswerten mit "interessanten" Werten befüllt.
    Ich schlage vor, v[i] folgendermaßen zu befüllen:

    • konstant auf 0
    • konstant auf 1
    • konstant auf -1
    • auf i
    • ...

    Die zu erwartenden Ergebnisse sind einfach nachzurechnen, z.B. sollte die Ausgabe bei v[i]=0 wohl in allen drei Fällen auch 0 sein.

  • Maximilian Rupp 27. Dezember 2024 um 00:26

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Rechtliches

Impressum

Datenschutzerklärung