## MiloTN Newbie Poster

Hey there^^

Just a quick sort out hopefully, ive been hacking at this for a good while and cant figure out whats wrong for thie life of me! I have a program that uses calculates the maximum deflection of a beam under load (with some assumptions were allowed); and im now trying to add to that program a for loop that repeats it 1000 times (simple enough), and a function that calculates random stiffness values for each repetition. Trouble is, the function is giving me this funny error message :/

Anyhoo, here it is; the errors are generating on lines 27 and 31.

``````#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#define L 0.8
#define F 10000
#define E 1.36E+10                          //defined constants.
#define s_dev E+9
#define delta_x 0.016
double RandInvNormal(double , double);           //random stiffness function header.

int main(int argc, char *argv[])
{
double I, C, y, z;             //double precision arrays.
float percentage_error;             //counter for error convergence.
int i, x;                       //increment counter for array assignment.
union  { unsigned int i; time_t d;} t;
t.d=time(NULL);
srand(t.i);
for(x = 1; x < 1000; x++)               //repeats entire algorithm for 1000 iterations.
{
for (i = 0; i < 51;  i++)               //for loop assigns array values.
{
I[i] = 6.833E-07 *exp ( -19.02 *pow( ((delta_x*i) - (L/2)), 2 ));               //calculates and assigns I values into array.
if((delta_x*i)<= L/2)               //calculates and assigns 1/R values into C[]array, using I values.
{
C[i]=F*(delta_x*i)/(2.0*RandInvNormal(&E, &s_dev)*I[i]);
}
else
{
C[i]=F*(L-(delta_x*i))/(2.0*RandInvNormal(&E, &s_dev)*I[i]);
}
y[i] = 0;                       //sets initial guess for deflection to zero.
}
percentage_error = 1;               //resets error inside greater for loop.
while (percentage_error >= 0.001)           //while loop for testing change in max deflection.
//continues if change is greater than 0.001%.
{
for (i = 1; i < 50; i++)            //loop iterates previous values.
{
z[i] = (y[i+1] + y[i-1] + (C[i] *pow(delta_x, 2)))/2;
//simply supported ends - zero vertical deflection.
z=0;
}
percentage_error = (z - y) *(100/z);            //test while loop condition.
for (i = 1; i < 50; i++)            //loop appends y-array with new set of iterations for iterative loop.
{
y[i] = z[i];
}
}
printf("\nY(max) = %lf\n", y);              //displays maximum deflection of beam   *assumed to be at mid-point*
}
}
//------------------------------FUNCTIONS---------------------------------
double RandInvNormal(double mean, double stdev)``````

If you'd like to run the program and test it out, the function code is:

``````{
// Define constants to curve fit for integral
const double A1 = -3.969683028665376e+01;
const double A2 = 2.209460984245205e+02;
const double A3 = -2.759285104469687e+02;
const double A4 =  1.383577518672690e+02;
const double A5 = -3.066479806614716e+01;
const double A6 =  2.506628277459239e+00;
const double B1 = -5.447609879822406e+01;
const double B2 =  1.615858368580409e+02;
const double B3 = -1.556989798598866e+02;
const double B4 =  6.680131188771972e+01;
const double B5 = -1.328068155288572e+01;
const double C1 = -7.784894002430293e-03;
const double C2 = -3.223964580411365e-01;
const double C3 = -2.400758277161838e+00;
const double C4 = -2.549732539343734e+00;
const double C5 = 4.374664141464968e+00;
const double C6 = 2.938163982698783e+00;
const double D1 = 7.784695709041462e-03;
const double D2 = 3.224671290700398e-01;
const double D3 = 2.445134137142996e+00;
const double D4 = 3.754408661907416e+00;
const double P_LOW = 0.02425;
const double P_HIGH = 0.97575;  // P_high = 1 - p_low
double p, q, r, x;
do
{
p = (float)(rand())/RAND_MAX;     // Get a random number between 0 and 1
// rand() returns an int between 0 and RAND_MAX
} while (p <= 0 || p >= 1);             // Repeat making sure p is not 0 or 1
if (p > 0 && p < P_LOW)
{
q = sqrt(-2*log(p));
x = (((((C1*q+C2)*q+C3)*q+C4)*q+C5)*q+C6) / ((((D1*q+D2)*q+D3)*q+D4)*q+1);
} else if (p >= P_LOW && p <= P_HIGH)
{
q = p - 0.5;
r = q*q;
x = (((((A1*r+A2)*r+A3)*r+A4)*r+A5)*r+A6)*q /(((((B1*r+B2)*r+B3)*r+B4)*r+B5)*r+1);
} else {
q = sqrt(-2*log(1-p));
x = -(((((C1*q+C2)*q+C3)*q+C4)*q+C5)*q+C6) / ((((D1*q+D2)*q+D3)*q+D4)*q+1);
}
return (mean + x*stdev);
}``````

Thanks for any help :)

## Ancient Dragon 5,243

RandInvNormal() on line 10 is prototyped to take two double arguments. On line 27 you are attempting to pass two pointers. One or the other is wrong.