Hallo leute. Habe an der FH Informatik als Pflichtfach und muss ein Programm schreiben dass einen springenden Ball simuliert. Ich habe es geschrieben aber bekomme es aufgrund dieses Fehlers im lcc compiler nicht zu laufen. Den compiler müssen wir übrigens benutzen.
Vielleicht kann ja mal jemand drüberschauen und mir auf anhieb sagen was an den fall(i), feder(i) und hoch(i) funktionen nicht passt.
gruß max
Vielleicht kann ja mal jemand drüberschauen und mir auf anhieb sagen was an den fall(i), feder(i) und hoch(i) funktionen nicht passt.
gruß max
Code:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "bmp.h"
#define name
#define PATH "e:\\uni\\ti2\\ball2\\name.bmp"
// Groesse des Bildes
#define XDIM 640
#define YDIM 960
// Farbe fuer Koordinatensystem
#define COLOR_C 0,0,0
// Farbe fuer Geschwindigkeit
#define COLOR_V 255,0,0
// Farbe fuer Hoehe
#define COLOR_H 0,255,0
// Erdanziehung
#define G (9.81f)
/* Prototypen */
double einlesend(char * ausgabe);
void plot(int c, double * y, int xn, int yn, int dimx, int dimy, int r, int g, int b);
void koordsys(int xn, int yn,int dimx,int dimy, int r, int g, int b);
double mind(double c, double * vec);
double maxd(double c, double * vec);
int fall(int);
int elast(int);
int hoch(int);
int main(int argc, char * argv[]){
/* Parameter fuer Simulation */
double bmass = 1; // Ballmasse in kg
double brad = 0.05; // Ballradius in m
double feder = 1000; // Federkonstante in N/m
float tstep = 0.001; // Schrittweite der Simulation
double tend = 50; // Simulationszeit in s
float t =0;
float h = 5; // Fallhoehe in m
float v = 0; // Anfangsgeschwindigkeit in m/s
float tmom=0;
float tges=0;
int veclength = (int) tend / tstep;
int vvec[3001]; // Dynamisches Array fuer Geschwindigkeit
int hvec[3001]; // Dynamisches Array fuer Hoehe
int i=0;
int j;
/*---- Eingabe ----*/
puts("Simulation eines Balls");
puts("Eingabe der Parameter fuer den Ball:");
puts("name der datei eingeben:");
puts("Parameter fuer Simulation");
bmass = einlesend("Masse (kg): ");
brad = einlesend("Radius (m): ");
feder = einlesend("Federkonstante in N/m: ");
h = einlesend("Fallhoehe (m): ");
v = 0;
tend = einlesend("Dauer der Simulation (s): ");
/*---- Verarbeitung ----*/
// Speicher fuer Ergebnisvectoren besorgen
vvec[0] = v;
hvec[0] = h;
for(tmom=0;tend+tstep<=1;)
{
i=fall(i);
i=elast(i);
i=hoch(i);
vvec[i] = v;
hvec[i] = h;
};
//Freier Fall bis Hoehe gleich Radius
int fall(i);
{
tmom=0;
for(i=j+1;tges+tstep<=tend;i++)
{ hvec[i]=hvec[0]+0.5*G*tmom*tmom;
vvec[i]=G*tmom;
tmom+=tstep;
if(hvec[i]<=brad)
{
j=i;
tges=tges+tmom;
hvec[i]=brad;
vvec[i]=G*tmom;
break;
}
}
return i;
}
//Elastische Feder wenn Hoehe kleiner Radius
int elast(i);
{
tmom=0;
for(i=i+1;tges+tstep<=t;i++)
{
tmom+=tstep;
vvec[i]=vvec[i-1]+tstep*(G+(feder*(brad-hvec[i-1]))/bmass);
hvec[i]=hvec[i-1]+vvec[i]*tstep+0.5*(G+(feder*(brad-hvec[i]))/bmass)*tstep*tstep;
if(hvec[i]>=brad)
{
hvec[i]=brad;
vvec[i]=-vvec[j];
tges=tges+tmom;
break;
}
}
return i;
}
//Ball bewegt sich wieder aufwärts
int hoch(i);
{
tmom=0;
for(i=i+1;tges+tstep<=t;i++)
{
tmom+=tstep;
hvec[i]=hvec[i-1]+vvec[i-1]*tstep+0.5*G*tstep*tstep;
vvec[i]=vvec[i-1]+G*tstep;
if(vvec[i]<=0)
{
tges=tges+tmom;
hvec[i]=hvec[0];
vvec[i]=0;
break;
}
}
return i;
}
/*---- Ausgabe (Bild) ----*/
/* Neue Grafikdatei erzeugen */
bmpNew(XDIM,YDIM);
//bmpLine(0,0,10,10, 0,0,0);
/* Hoehe einzeichnen */
plot(veclength, hvec, 20, 520, 600, 420, COLOR_H);
koordsys(20, 520,600,420,COLOR_C);
plot(veclength, vvec, 20, 20, 600, 420, COLOR_V);
koordsys(20, 20,600,420,COLOR_V);
printf("Bild nach %s gespeichert\n",PATH);
puts("Info:");
puts("Oben im Bild: Hoehe");
bmpSave(PATH);
free(vvec);
free(hvec);
return 0;
}
/*
* Zeichnet die Punkte in y mit linien verbunden auf ein Bild
* Parameter
* c : Anzahl der Werte im Array y
* y : Array mit den Zu plottenden Werten
* xn : Beginn des Plottens x-Wert
* yn : Beginn des Plottens y-Wert
* dimx : Breite des Plottfeldes
* dimy : H?he des Plottfeldes
* r,g,b : Farbwert mit denen der Graph geplottet wird
*/
void plot(int c, double * y, int xn, int yn, int dimx, int dimy, int r, int g, int b){
int ynull, scalex;
double ymin, ymax, scaley;
double oldy,newy;
int oldx,newx, i;
// Minimaler und Maximaler Wert die zu Plotten sind
ymin = mind(c,y); ymax = maxd(c,y);
// Skalierung in x und y Richtung (ceil aufrunden)
scaley = (double) dimy / (ymax - ymin);
scalex = ((double)c / (double)dimx);
// Nullpunkt fuer Koordinatensystem
ynull = yn; // Unterster Punkt des Zeichenbereichs
if(ymin < 0){
ynull += (-ymin) * (dimy/(ymax-ymin)); // Nullpunkt fuer Koordinatensystem => (xn,ynull)
}
// Nulllinie Zeichnen
bmpLine(xn,ynull,xn+dimx,ynull, r, g, b);
oldx = xn; // Beginn des Zeichnens
oldy = (double)ynull + (y[0] * scaley);
for(i = 1; i < c; i++ ){
if((i%(scalex)) == 0){ // jeden scalex-ten wert zeichnen
newx = oldx+1;
newy = (double) ynull + (y[i] * scaley);
// Linie Zeichnen
bmpLine(oldx,oldy,newx,newy, r,g,b);
oldx = newx;
oldy = newy;
}
}
}
/*
* Maximalwert im Array ermitteln
* Parameter
* c : Anzal der Felder in vec
* vec : Array
*
* Rueckgabe
* Groesster Wert im Array
*/
double maxd(double c, double * vec){
int i; // laufvariable
int max=0xffffffff; // kleine moegliche Zahl (32bit)
for(i=0; i<c; ++i){
if(vec[i] > max)
max = vec[i];
}
return max;
}
/*
* Minimalwert im Array ermitteln
* Parameter
* c : Anzal der Felder in vec
* vec : Array
*
* R?ckgabe
* Kleinster Wert im Array
*/
double mind(double c, double * vec) {
int i; // laufvariable
int min=0x7fffffff; // groesste moegliche Zahl
for(i=0; i<c; ++i){
if(vec[i] < min)
min = vec[i];
}
return min;
}
/*
* Zeichnet Abzisse und Ordinate mit Pfeilspitzen
* Paramerter
* xn : x-Ursprung
* yn : y-Ursprung
* dimx: Breite
* dimy: Hoehe
* r,g,b: Farbwerte
*/
void koordsys(int xn, int yn,int dimx,int dimy, int r, int g, int b) {
// Abzisse
bmpLine(xn,yn, xn+dimx,yn,r,g,b);
// Ordinate
bmpLine(xn,dimy+yn,xn,yn, r,g,b);
// Pfeilspitzen
// Abzisse
bmpLine(xn+dimx, yn, xn+dimx-10, yn+5, r, g, b);
bmpLine(xn+dimx, yn, xn+dimx-10, yn-5, r, g, b);
// Ordinate
bmpLine(xn,yn+dimy, xn-5, yn+dimy-10, r, g, b);
bmpLine(xn,yn+dimy, xn+5, yn+dimy-10, r, g, b);
}
/*
* Liest von der Tastatur einen Double wert ein
* Gelingt die Eingabe nicht so wird zur erneuten Eingabe aufgefordert.
* Parameter
* ausgabe : Info die dem Benutzer praesentiert wird
* Rueckgabe
* eingelesener Double-Wert
*/
double einlesend(char * ausgabe) {
double d;
// Benutzerinfo ausgeben
printf("%s",ausgabe);
// Wert von der Tastatur einlesen
while(scanf("%lf",&d) != 1) {
printf("Fehler beim Einlesen, bitte nocheinmal: ");
while('\n' != getchar()){}
}
// Wert zurueckliefern
return d;
}