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;
}
お礼
pyonmaeさん、ご回答頂きありがとうございます。 早速 iodefine.h を参考に書き直してみました。 現在実機が手元に無いので確認出来ないのですが、こんな感じでしょうか? 実機がある場所へ戻ったら確認してみます。 struct st_sram1 { int wk1[10]; }; struct st_sram2 { char cdata; int idata; }; #define SRAM1 (*(volatile struct st_sram1 *)(0x200000)) #define SRAM2 (*(volatile struct st_sram2 *)(0x200014)) #define SRAM3 (*(volatile unsigned int*)(0x200017)) SRAM1.wk1[0] = 1; SRAM1.wk2[1] = 2; SRAM2.idata = 1; SRAM3 = 1;
補足
お礼欄に書いた内容にミスがありました。 すみません。 SRAM1.wk2[1] = 2; → SRAM1.wk1[1] = 2;