Kann jemand gut C programmieren?

Themen rund um Probleme mit Hard- und Software
Post Reply
User avatar
Kryo
Clanleader
Posts: 2349
Joined: Wed 7. Jun 2006, 17:27
Contact:

Kann jemand gut C programmieren?

Post by Kryo » Fri 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]

User avatar
Zulan
VoW-Member
Posts: 636
Joined: Sat 10. Mar 2007, 19:46

Re: Kann jemand gut C programmieren?

Post by Zulan » Wed 17. Feb 2016, 19:01

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

User avatar
Kryo
Clanleader
Posts: 2349
Joined: Wed 7. Jun 2006, 17:27
Contact:

Re: Kann jemand gut C programmieren?

Post by Kryo » Wed 17. Feb 2016, 19:43

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

User avatar
Kryo
Clanleader
Posts: 2349
Joined: Wed 7. Jun 2006, 17:27
Contact:

Re: Kann jemand gut C programmieren?

Post by Kryo » Fri 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: Select all

/*
 * 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: Select all

/*

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]

User avatar
Kryo
Clanleader
Posts: 2349
Joined: Wed 7. Jun 2006, 17:27
Contact:

Re: Kann jemand gut C programmieren?

Post by Kryo » Fri 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]

User avatar
Kryo
Clanleader
Posts: 2349
Joined: Wed 7. Jun 2006, 17:27
Contact:

Re: Kann jemand gut C programmieren?

Post by Kryo » Fri 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]

User avatar
Zulan
VoW-Member
Posts: 636
Joined: Sat 10. Mar 2007, 19:46

Re: Kann jemand gut C programmieren?

Post by Zulan » Tue 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

User avatar
Kryo
Clanleader
Posts: 2349
Joined: Wed 7. Jun 2006, 17:27
Contact:

Re: Kann jemand gut C programmieren?

Post by Kryo » Thu 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]

User avatar
Kryo
Clanleader
Posts: 2349
Joined: Wed 7. Jun 2006, 17:27
Contact:

Re: Kann jemand gut C programmieren?

Post by Kryo » Thu 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]

User avatar
Zulan
VoW-Member
Posts: 636
Joined: Sat 10. Mar 2007, 19:46

Re: Kann jemand gut C programmieren?

Post by Zulan » Mon 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

Post Reply

Who is online

Users browsing this forum: No registered users and 2 guests