C言語に直して下さい
VisualC++で円周率を求めるプログラムなのだそうですが、
自分はC言語しか使ったことがないため、よく分かりません。
Cでコンパイルできるように直していただけないでしょうか。
よろしくお願いします。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 21
#define K 100000
void add(unsigned long a[],unsigned long b[])
{
int c = 0, tmp;
for (int i = N - 1; i > -1; i--) {
tmp = a[i] + b[i] + c;
a[i] = tmp % K;
c = tmp / K;
}
}
void sub(unsigned long a[],unsigned long b[])
{
int c = 0, x = 0;
for (int i = N - 1; i > -1 ; i--) {
x = c;
if (a[i] < b[i] + x ) c = 1;
else c = 0;
a[i] = c * K + a[i] - b[i] - x;
}
}
void div(unsigned long a[], unsigned long x)
{
int c=0, tmp;
if (x >= K) {
printf("Div Error\n");
getchar();
exit(1);
return;
}
for (int i = 0; i < N ; i++) {
tmp = (a[i] + c * K) / x;
c = (a[i] + c * K) % x;
a[i] = tmp;
}
}
void clear(unsigned long a[])
{
memset(a,0x00,sizeof(a)*N);
}
void set(unsigned long a[], unsigned long b[])
{
memcpy(a,b,sizeof(a)*N);
}
void set(unsigned long a[], unsigned long b)
{
if (b<K) {
clear(a);
a[0]=b;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
unsigned long pai[N], fn[N], gn[N], tmp1[N], tmp2[N];
int i;
unsigned long n;
clear(pai);
clear(fn);
clear(gn);
clear(tmp1);
clear(tmp2);
set(fn, 16*5);
set(gn, 4*239);
for(n=0;n<40000;n++) {
div(fn, 25);
div(gn, 239); div(gn, 239);
set(tmp1, fn);
div(tmp1, 2*n+1);
set(tmp2, gn);
div(tmp2, 2*n+1);
if (n%2==0) {
add(pai, tmp1);
sub(pai, tmp2);
}else{
add(pai, tmp2);
sub(pai, tmp1);
}
}
for (i=0;i<N;i++) {
printf("%5lu ", pai[i]);
}
getchar();
return 0;
}
お礼
>えと、そもそも最終的に this->TimerProc をWin32APIに渡そうとしているんですよね? おそらく、そういうことになると思います。 >メンバー関数をコールバック関数に使うことは、それが staticなものでなければ 確認してみたらコールバック関数を扱うクラス側での定義が、 void CALLBACK TimerProc(UINT, UINT, DWORD, DWORD, DWORD); だけでしたので、staticをつけたらうまくいきました。 ご回答、どうもありがとうございます。