メモリリークor領域アクセスが分かりません
Posted: 2012年7月27日(金) 00:55
大学のプログラミングの課題で100の階乗を求め、表示するプログラムを作っているのですが
自分のパソコンではcygwinを使っていて、プログラムの動作確認はできたので
ネット提出で教授に提出したのですが
”実行時エラー:メモリリーク, 領域アクセスが適切に行われているか確認して下さい”
と返ってきます。
いろいろと試行錯誤をしたのですが、毎回同じ結果が返ってきます。
これ以上は僕には分からないです。助けてください。
プログラムは
varint型という10000進数で数値を扱うようにした型を作り、大きな桁の数値を扱っています。
もし、こうしたほうが良いよという点があればそれも教えてほしいです。
よろしくお願いします。
自分のパソコンではcygwinを使っていて、プログラムの動作確認はできたので
ネット提出で教授に提出したのですが
”実行時エラー:メモリリーク, 領域アクセスが適切に行われているか確認して下さい”
と返ってきます。
いろいろと試行錯誤をしたのですが、毎回同じ結果が返ってきます。
これ以上は僕には分からないです。助けてください。
プログラムは
varint型という10000進数で数値を扱うようにした型を作り、大きな桁の数値を扱っています。
もし、こうしたほうが良いよという点があればそれも教えてほしいです。
よろしくお願いします。
#include <stdio.h>
#include <stdlib.h>
#define NUMDIGITS 50
typedef struct {
int val[NUMDIGITS];
} varint;
varint vi_assign(long num); /* long型の数値をvarint型に変換する */
int vi_keta(varint var); /* 桁数を調べる */
varint vi_zero(); /* 値を0に初期化する */
void vi_print(varint var); /* 値を表示する */
varint vi_add(varint a,varint b); /* a+b */
varint vi_mul(varint a,varint b); /* a*b */
int main(void){
int i;
varint ans=vi_assign(1);
for(i=1;i<=100;i++)
ans=vi_mul(ans,vi_assign(i));
printf("%d!=",i-1);
vi_print(ans);
return 0;
}
varint vi_assign(long num){
varint v=vi_zero();
int i;
for(i=0;num>0;i++){
v.val[i]=num%10000;
num=num/10000;
}
return v;
}
int vi_keta(varint var){
int i=NUMDIGITS-1;
while(var.val[i]==0)i--;
return i+1;
}
varint vi_zero(){
int i;
varint v;
for(i=0;i<NUMDIGITS;i++)v.val[i]=0;
return v;
}
void vi_print(varint var){
int i=vi_keta(var)-1;
if(i<0)i=0;
printf("%d",var.val[i]);
i--;
while(i>=0){
printf("%04d",var.val[i]);
i--;
}
printf("\n");
}
varint vi_add(varint a,varint b){
int i,k;
if(vi_keta(a)>=vi_keta(b))k=vi_keta(a);
else k=vi_keta(b);
for(i=0;i<k;i++){
a.val[i]=a.val[i]+b.val[i];
if(a.val[i]>=10000){
a.val[i]=a.val[i]-10000;
a.val[i+1]++;
}
}
return a;
}
varint vi_mul(varint a,varint b){
varint v=vi_zero(),seki=vi_zero();
int i,j,ak=vi_keta(a),bk=vi_keta(b);
for(i=0;i<bk;i++,v=vi_zero()){
for(j=0;j<ak;j++){
v.val[j+i]=a.val[j]*b.val[i]+v.val[j+i];
if(v.val[j+i]>=10000){
v.val[j+i+1]=v.val[j+i]/10000;
v.val[j+i]=v.val[j+i]%10000;
}
}
seki=vi_add(v,seki);
}
return seki;
}