WitchCraft
November 7th, 2009, 09:24 AM
I have made a program which calculates the standard deviation.
My problem is, when I used memset to initialize the array FragArray, then my program crashes.
The problem is the memset.
If I omit the memset, then it doesn't crash.
What's wrong with the memset?
Here my code:
/*
average
squaredist=(frags[i]- average)^2
sum(squaredist[i])
sumdivn = sum/(n)
sample_sumdivn = sum/(n-1)
sample_sigma = sqrt(sample_sumdivn)
sigma = sqrt(sumdivn)
*/
#include <iostream>
#include <cstdlib>
#include <cmath>
template <class DataType>
DataType generic_abs(DataType dt_Data)
{
if (dt_Data < (static_cast<DataType> (0.0)))
dt_Data = dt_Data * (static_cast<DataType> (-1.0)) ;
return static_cast<DataType> (dt_Data) ;
}
inline int FuncRandomNumberInRange( int intMinInRange, int intMaxInRange )
{
return ( rand() % (intMaxInRange - intMinInRange + 1) ) + intMinInRange ;
}
typedef struct
{
int kills;
int killed ;
double kills_killed_ratio;
bool isValid ;
} FragArray_t;
FragArray_t FragArray[100] ;
int main()
{
memset( (void*) FragArray, 0, sizeof(FragArray)*100);
//memset( (void*) &FragArray, 0, sizeof(FragArray)*100);
//memset( (void*) FragArray[0], 0, sizeof(FragArray)*100);
//memset( (void*) &FragArray[0], 0, sizeof(FragArray)*100);
for(int i = 0; i< 100; ++i)
{
FragArray[i].kills = FuncRandomNumberInRange(0, 10);
FragArray[i].killed = FuncRandomNumberInRange(0, 10);
FragArray[i].kills_killed_ratio = (double) (FragArray[i].kills+1) / (double) (FragArray[i].killed + 1) ;
FragArray[i].isValid = (bool) FuncRandomNumberInRange(0,1);
}
double average_kills = 0;
double average_killed = 0;
double average_ratio = 0;
int n = 0;
for(int i = 0; i< 10; ++i)
{
if(FragArray[i].isValid)
{
++n;
average_kills += (double) FragArray[i].kills;
average_killed += (double) FragArray[i].killed;
average_ratio += FragArray[i].kills_killed_ratio;
}
printf("FragArray[%d].kills = %d, killed = %d, ratio = %d, isValid = %d\n", i, FragArray[i].kills, FragArray[i].killed, FragArray[i].kills_killed_ratio, FragArray[i].isValid);
}
average_kills = average_kills / (double ) n;
average_killed = average_killed / (double ) n;
average_ratio = average_ratio / (double ) n;
printf("Average kills: %f, average killed: %f, average ratio: %f.\n",average_kills,average_killed,average_ratio);
double sum_kills = 0;
double sum_killed = 0;
double sum_ratio = 0;
for(int i = 0; i< 10; ++i)
{
if(FragArray[i].isValid)
{
++n;
sum_kills += std::pow(( (double) FragArray[i].kills - average_kills),2);
sum_killed +=std::pow(( (double) FragArray[i].killed - average_killed),2);
sum_ratio += std::pow((FragArray[i].kills_killed_ratio - average_ratio),2);
}
}
sum_kills = sum_kills / (double) n;
sum_killed = sum_killed / (double) n;
sum_ratio = sum_ratio / (double) n;
printf("sum Average kills: %f, sum average killed: %f, sum average ratio: %f.\n",sum_kills,sum_killed,sum_ratio);
double sigma_kills = std::sqrt(sum_kills);
double sigma_killed= std::sqrt(sum_killed);
double sigma_ratio = std::sqrt(sum_ratio);
printf("sigma kills: %f, sigma killed: %f, sigma ratio: %f.\n",sigma_kills,sigma_killed,sigma_ratio);
return EXIT_SUCCESS ;
}
My problem is, when I used memset to initialize the array FragArray, then my program crashes.
The problem is the memset.
If I omit the memset, then it doesn't crash.
What's wrong with the memset?
Here my code:
/*
average
squaredist=(frags[i]- average)^2
sum(squaredist[i])
sumdivn = sum/(n)
sample_sumdivn = sum/(n-1)
sample_sigma = sqrt(sample_sumdivn)
sigma = sqrt(sumdivn)
*/
#include <iostream>
#include <cstdlib>
#include <cmath>
template <class DataType>
DataType generic_abs(DataType dt_Data)
{
if (dt_Data < (static_cast<DataType> (0.0)))
dt_Data = dt_Data * (static_cast<DataType> (-1.0)) ;
return static_cast<DataType> (dt_Data) ;
}
inline int FuncRandomNumberInRange( int intMinInRange, int intMaxInRange )
{
return ( rand() % (intMaxInRange - intMinInRange + 1) ) + intMinInRange ;
}
typedef struct
{
int kills;
int killed ;
double kills_killed_ratio;
bool isValid ;
} FragArray_t;
FragArray_t FragArray[100] ;
int main()
{
memset( (void*) FragArray, 0, sizeof(FragArray)*100);
//memset( (void*) &FragArray, 0, sizeof(FragArray)*100);
//memset( (void*) FragArray[0], 0, sizeof(FragArray)*100);
//memset( (void*) &FragArray[0], 0, sizeof(FragArray)*100);
for(int i = 0; i< 100; ++i)
{
FragArray[i].kills = FuncRandomNumberInRange(0, 10);
FragArray[i].killed = FuncRandomNumberInRange(0, 10);
FragArray[i].kills_killed_ratio = (double) (FragArray[i].kills+1) / (double) (FragArray[i].killed + 1) ;
FragArray[i].isValid = (bool) FuncRandomNumberInRange(0,1);
}
double average_kills = 0;
double average_killed = 0;
double average_ratio = 0;
int n = 0;
for(int i = 0; i< 10; ++i)
{
if(FragArray[i].isValid)
{
++n;
average_kills += (double) FragArray[i].kills;
average_killed += (double) FragArray[i].killed;
average_ratio += FragArray[i].kills_killed_ratio;
}
printf("FragArray[%d].kills = %d, killed = %d, ratio = %d, isValid = %d\n", i, FragArray[i].kills, FragArray[i].killed, FragArray[i].kills_killed_ratio, FragArray[i].isValid);
}
average_kills = average_kills / (double ) n;
average_killed = average_killed / (double ) n;
average_ratio = average_ratio / (double ) n;
printf("Average kills: %f, average killed: %f, average ratio: %f.\n",average_kills,average_killed,average_ratio);
double sum_kills = 0;
double sum_killed = 0;
double sum_ratio = 0;
for(int i = 0; i< 10; ++i)
{
if(FragArray[i].isValid)
{
++n;
sum_kills += std::pow(( (double) FragArray[i].kills - average_kills),2);
sum_killed +=std::pow(( (double) FragArray[i].killed - average_killed),2);
sum_ratio += std::pow((FragArray[i].kills_killed_ratio - average_ratio),2);
}
}
sum_kills = sum_kills / (double) n;
sum_killed = sum_killed / (double) n;
sum_ratio = sum_ratio / (double) n;
printf("sum Average kills: %f, sum average killed: %f, sum average ratio: %f.\n",sum_kills,sum_killed,sum_ratio);
double sigma_kills = std::sqrt(sum_kills);
double sigma_killed= std::sqrt(sum_killed);
double sigma_ratio = std::sqrt(sum_ratio);
printf("sigma kills: %f, sigma killed: %f, sigma ratio: %f.\n",sigma_kills,sigma_killed,sigma_ratio);
return EXIT_SUCCESS ;
}