Kann jemand gut C programmieren?

Themen rund um Probleme mit Hard- und Software
Benutzeravatar
Kryo
Clanleader
Beiträge: 2344
Registriert: Mi 7. Jun 2006, 17:27
Kontaktdaten:

Kann jemand gut C programmieren?

Beitragvon Kryo » Fr 12. Feb 2016, 16:01

Ich komme mit nem kleinen Projekt nicht weiter... Es liegt irgendwie an den Compiler options vermute ich... aber ich bekomm es net hin. Kennt sich einer aus, dann erkläre ich es^^
[sigpic][/sigpic]

Benutzeravatar
Zulan
VoW-Member
Beiträge: 633
Registriert: Sa 10. Mär 2007, 19:46

Re: Kann jemand gut C programmieren?

Beitragvon Zulan » Mi 17. Feb 2016, 19:01

Ja, erklaer mal wenn es noch nicht zu spaet ist.
Zu alt fuer diesen Scheiss

Benutzeravatar
Kryo
Clanleader
Beiträge: 2344
Registriert: Mi 7. Jun 2006, 17:27
Kontaktdaten:

Re: Kann jemand gut C programmieren?

Beitragvon Kryo » Mi 17. Feb 2016, 19:43

zu spät. aber gut wenn ich noch andere probs bekomme melde ich mich
[sigpic][/sigpic]

Benutzeravatar
Kryo
Clanleader
Beiträge: 2344
Registriert: Mi 7. Jun 2006, 17:27
Kontaktdaten:

Re: Kann jemand gut C programmieren?

Beitragvon Kryo » Fr 19. Feb 2016, 09:37

ok hab ne neue Frage:

Ich brauche ne Spline funktion und will folgenden Code nutzen, (google).

Ich will die main() später als funktion aus einem anderen skript ausrufen, mit variabler Größe NPOINTS. Dazu möchte ich NPOINTS anstatt über #define einfach als int deklarieren. der Kompilierer gcc testspline.c -o test.exe lässt das ohne Fehler zu, doch wenn ich dann test.exe ausführe, kommt ein Windows Fehler.


Beim Debuggen mit Visual Studio kommen Zugriffsverletzungen. Ich versteh das nicht, wieso denn? :D

Also ich möchte eigentlich nur #define NPOINTS 32 durch int NPOINTS = 32; ersetzen. :haeh:

Hauptprogramm

Code: Alles auswählen

/*
 * Example of cubic spline interpolation
 * using spline() and splint()
 *
 * davekw7x
 */

#include <stdio.h>
#include "spline1.c"
#define NPOINTS 32


/* Function to be interpolated */
double f(double x)
{
    return x*x+x;
}

/* Second derivative of f(x) */
double fpp(double x)
{
    return 10e30;
}

int main(void)
{
    int i;
    double x, y, yp1, ypn;

    double xa[NPOINTS];
    double ya[NPOINTS];
    double y2[NPOINTS];

    for (i = 0; i < NPOINTS; i++) {
        xa[i] = i;
        ya[i] = f(xa[i]);
    }

    yp1 = fpp(xa[0]);         /* Second derivative at first point */
    ypn = fpp(xa[NPOINTS-1]); /* Second derivative at last point */

    /*
     * Call spline to get second derivatives.
     *
     * Since the Numerical Recipes function assumes
     * that arrays are 1-based, adjust the pointer
     * values accordingly
     */
    spline(xa - 1, ya - 1, NPOINTS, yp1, ypn, y2 - 1);

    /*
     * Call splint for interpolations. The same
     * considerations apply (one-based arrays).
     */
    printf("%9s %13s %17s\n", "x", "f(x)", "from splint");
    for (i = 0; i < NPOINTS; i++) {
        x = i;
        splint(xa - 1, ya - 1, y2 - 1, NPOINTS, x, &y);
        printf("%13.5e %13.5e %13.5e\n", x, f(x), y);
    }
    printf("\n");


    printf("%9s %13s %17s\n", "x", "f(x)", "from splint");
    for (i = 0; i < 10; i++) {
        x = 20.0 + i/10.0;
        splint(xa - 1, ya - 1, y2 - 1, NPOINTS, x, &y);
        printf("%13.5e %13.5e %13.5e\n", x, f(x), y);
    }
    return 0;
}


spline1.c

Code: Alles auswählen

/*

This code is based on the cubic spline interpolation code presented in:
Numerical Recipes in C: The Art of Scientific Computing
by
William H. Press,
Brian P. Flannery,
Saul A. Teukolsky, and
William T. Vetterling .
Copyright 1988 (and 1992 for the 2nd edition)

I am assuming zero-offset arrays instead of the unit-offset arrays
suggested by the authors.  You may style me rebel or conformist
depending on your point of view.

Norman Kuring   31-Mar-1999

Norman Kuring   28-May-2015   pklo and pkhi were not getting reset in
            splint() function.  This is now fixed.
            Thx, Robert Strickland, for pointing this out.

*/

#include <stdio.h>
#include <stdlib.h>

#define MALLOC(ptr,typ,num) {                                           \
  (ptr) = (typ *)malloc((num) * sizeof(typ));                           \
  if((ptr) == NULL){                                                    \
    fprintf(stderr,"-E- %s line %d: Memory allocation failure.\n",      \
    __FILE__,__LINE__);                                                 \
    exit(EXIT_FAILURE);                                                 \
  }                                                                     \
}

void
spline(
double   x[],
double   y[],
int   n,
double   yp1,
double   ypn,
double   y2[]
){

  int   i,k;
  double   p,qn,sig,un,*u;

  MALLOC(u,double,n-1);

  if(yp1 > 0.99e5)
    y2[0] = u[0] = 0.0;
  else{
    y2[0] = -0.5;
    u[0] = (3.0/(x[1]-x[0]))*((y[1]-y[0])/(x[1]-x[0])-yp1);
  }
  for(i = 1; i < n-1; i++){
    sig = (x[i] - x[i-1])/(x[i+1] - x[i-1]);
    p = sig*y2[i-1] + 2.0;
    y2[i] = (sig - 1.0)/p;
    u[i] = (y[i+1] - y[i])/(x[i+1] - x[i]) - (y[i] - y[i-1])/(x[i] - x[i-1]);
    u[i] = (6.0*u[i]/(x[i+1] - x[i-1]) - sig*u[i-1])/p;
  }
  if(ypn > 0.99e5)
    qn = un = 0.0;
  else{
    qn = 0.5;
    un = (3.0/(x[n-1] - x[n-2]))*(ypn - (y[n-1] - y[n-2])/(x[n-1] - x[n-2]));
  }
  y2[n-1] = (un - qn*u[n-2])/(qn*y2[n-2] + 1.0);
  for(k = n-2; k >= 0; k--){
    y2[k] = y2[k]*y2[k+1] + u[k];
  }

  free(u);
}

void
splint(
double   xa[],
double   ya[],
double   y2a[],
int   n,
double   x,
double   *y
){

  int      klo,khi,k;
  double      h,b,a;
  static int   pklo=0,pkhi=1;

  /*
  Based on the assumption that sequential calls to this function are made
  with closely-spaced, steadily-increasing values of x, I first try using
  the same values of klo and khi as were used in the previous invocation.
  If that interval is no longer correct, I do a binary search for the
  correct interval.
  */
  if(xa[pklo] <= x && xa[pkhi] > x){
    klo = pklo;
    khi = pkhi;
  }
  else{
    klo = 0;
    khi = n - 1;
    while(khi - klo > 1){
      k = (khi + klo) >> 1;
      if(xa[k] > x) khi = k;
      else          klo = k;
    }
    pklo = klo;
    pkhi = khi;
  }

  h = xa[khi] - xa[klo];
  if(h == 0){
    fprintf(stderr,"-E- %s line %d: Bad xa input to function splint()\n",
            __FILE__,__LINE__);
    exit(EXIT_FAILURE);
  }
  a = (xa[khi] - x)/h;
  b = (x - xa[klo])/h;
  *y = a*ya[klo] + b*ya[khi] +
       ((a*a*a - a)*y2a[klo] + (b*b*b - b)*y2a[khi])*(h*h)/6.0;
}
[sigpic][/sigpic]

Benutzeravatar
Kryo
Clanleader
Beiträge: 2344
Registriert: Mi 7. Jun 2006, 17:27
Kontaktdaten:

Re: Kann jemand gut C programmieren?

Beitragvon Kryo » Fr 19. Feb 2016, 09:38

ah der Fehler muss übrigen beim Aufrufen / Ausführen des Befehls spline(); auftreten, denn wenn ich den rauskommentiere, gehts... der braucht aber eh nen integer wert, also keine ahnung.
[sigpic][/sigpic]

Benutzeravatar
Kryo
Clanleader
Beiträge: 2344
Registriert: Mi 7. Jun 2006, 17:27
Kontaktdaten:

Re: Kann jemand gut C programmieren?

Beitragvon Kryo » Fr 19. Feb 2016, 09:40

ahaha ich glaubs nicht. ich muss schneller im Forum schreiben, denn immer sofort danach finde ich die Lösung selbst.

Beim Aufrufen des spline und splint war in der Beispieldatei xa -1 und ya -1 und y2 -1. (Warum versteh ich nicht). Hab aber das -1 weggemacht und dann gings auf einmal... keine ahnung, die Werte, die Splint rausgibt, scheinen aber immer noch zu stimmen.
[sigpic][/sigpic]

Benutzeravatar
Zulan
VoW-Member
Beiträge: 633
Registriert: Sa 10. Mär 2007, 19:46

Re: Kann jemand gut C programmieren?

Beitragvon Zulan » Di 23. Feb 2016, 10:24

Gut dass es geholfen hat ;).

Ist leider ein schoenes Beispiel sich einfach in C in den Fuss zu schiessen... fuer pointer-arithmetik auf arrays gibt es nichtmal warnings in C :(.

Ich wuerd empfehlen sowas in C++ sauber mit vektoren zu machen... gibts auch genug spline bibliotheken.
Zu alt fuer diesen Scheiss

Benutzeravatar
Kryo
Clanleader
Beiträge: 2344
Registriert: Mi 7. Jun 2006, 17:27
Kontaktdaten:

Re: Kann jemand gut C programmieren?

Beitragvon Kryo » Do 25. Feb 2016, 12:30

ich bin zumindest momentan noch an C gebunden, da ich ein interface für ein anderes Programm, welches in C ist programmieren muss.

Ich hab noch ein größeres Probem beim nutzen von malloc.

Kann es sein, dass mit malloc beim allokieren von dynamischen arrays ( pointer) bisher benutzter memory überschrieben wird? Ich hab nämlich ein array, welches nachdem ein anderes mit malloc initialisiert wird, seine Werte verliert und blödsinn enthält.... jetzt mach ich die arrays mal fix in der größe, ist aber nur eine übergangslösung...
[sigpic][/sigpic]

Benutzeravatar
Kryo
Clanleader
Beiträge: 2344
Registriert: Mi 7. Jun 2006, 17:27
Kontaktdaten:

Re: Kann jemand gut C programmieren?

Beitragvon Kryo » Do 25. Feb 2016, 13:26

boah so eine scheiße, wenn man das komfortable programmieren von python oder matlab gewohnt ist xD

es liegt nicht am malloc... hab alle dynamischen arrays durch feste ersetzt und die werte verschwinden immer noch.
[sigpic][/sigpic]

Benutzeravatar
Zulan
VoW-Member
Beiträge: 633
Registriert: Sa 10. Mär 2007, 19:46

Re: Kann jemand gut C programmieren?

Beitragvon Zulan » Mo 29. Feb 2016, 15:08

Man kann relativ schmerzfrei C++ so programmieren, dass es durch C aufgerufen wird. Mach ich auch oft. Da muessen halt die Symbole in ein extern "C" und man faengt sich die abhaengigkeit an die libstdc++ ein.
Zu alt fuer diesen Scheiss


Zurück zu „Support / Hilfe“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste