電子書籍の厳選無料作品が豊富!

当方、c言語を2、3年に一度使うかどうかといった、初心者です。今回は、ネット上にある素数ファイルを小さい方から並べられている素数を読み込み、処理をして、ファイルに書き込むという、いたって単純なプログラムを書いております。作るのは半日で出来ましたが、デバッグで5、6日悩んでおります。書き変えられるところはほぼ終わりましたが、どうしても原因の不明な箇所(素数の100番目くらい、いつも同じ所)で自然に止まってしまいます。関数が3つあり、外部変数もあります。ネットで調べていたら、変数の順番を約束通り守っていないと、関数の中で勝手に変わってしまうというようなことが書かれていました。確かに、プログラム本分はいじらないで、変数の順番を変えただけで、結果がまるで違ってきます。
ちなみに、プログラムは以下のようなものです。少々長いですが、ご勘弁ください。ソフトは、VisualStudio6.0。たぶん、win2000年の頃使われていたかなり古いものです。

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <iostream>
#include <conio.h>

long int number(int,int,int,int,int,int);
/*int bara(long int,long int,long int,int);*/
int scrive(long int,long int,long int,long int,long int,long int,long int,long int,long int,long int,long int,long int,long int,long int,long int,long int,long int,long int,long int,long int,long int,long int,long int,long int,long int,long int,long int,long int,long int,long int);

long int k,max1,max2,num,moji[6];
int keta,space;
long int suji;
int keta_new;
long int number__x;
long int num__5,num__4,num__3,num__2,num__1;
long int kisuu30,kisuu29,kisuu28,kisuu27,kisuu26,kisuu25,kisuu24,kisuu23,kisuu22,kisuu21,kisuu20,kisuu19,kisuu18,kisuu17,kisuu16,kisuu15,kisuu14,kisuu13,kisuu12,kisuu11,kisuu10,kisuu9,kisuu8,kisuu7,kisuu6,kisuu5,kisuu4,kisuu3,kisuu2,kisuu1;
long int sa,max_1;
int error,amari;

int main()
{
moji[6]=moji[5]=moji[4]=moji[3]=moji[2]=moji[1]=0;
num = 1;
max1=0,max2=0;
keta = 1;

FILE *file;

char *filename = "primelist100000.txt";
file = fopen("primelist100000.txt","r");

/* ファイルのオープン */
if ((file = fopen(filename, "r")) == NULL)
{
printf("%sのオープンに失敗しました.\n", filename);
exit(EXIT_FAILURE);
}

/* 文字の読み込み */
while (( moji[k] = fgetc(file)) != EOF )
{
if ((moji[k]==48)&&(space==0))
{
suji=0;
keta_new++;
}
else if ((moji[k]==49)&&(space==0))
{
suji=1;
keta_new++;
}
‥‥‥
else if ((moji[k]==57)&&(space==0))
{
suji=9;
keta_new++;
}

number__x = 1;

if((moji[k]==10)||(moji[k]==32))
{
number__x=0;
}


/* 数字を取り込む */
if(((suji==1)||(suji==2)||(suji==3)||(suji==4)||(suji==5)||(suji==6)||(suji==7)||(suji==8)||(suji==9)||(suji==0))&&(keta_new==1)&&(! (number__x == 0)))
{
num__1=suji;
number__x ++;
}
else if(((suji==1)||(suji==2)||(suji==3)||(suji==4)||(suji==5)||(suji==6)||(suji==7)||(suji==8)||(suji==9)||(suji==0))&&(keta_new==2)&&(! (number__x == 0)))
{
num__2=suji;
number__x++;
}
‥‥‥

取り込んだ文字をとりあえず suji という変数に数字として格納して、別の関数で処理するものです。数字の区切りはスペース、そして、スペースと改行です。spaceはフラグで、問題なく処理は進みます。ところが、ある個所で、suji の中身が勝手に変わり、プログラムが止まってしまうのです。変数のこの書き方は、変数の置く場所を模索しているので、殆どを外部においています。だいたい察しはつくと思いますが、処理した数を、30個ほど溜めたら、一気にファイルに書き込むといったものです。main関数以外のものは、問題ありません。
変数の並べ方を教えていただけないでしょうか。もしくは、別の問題があるのか、よろしくご教示ください。

質問者からの補足コメント

  • どう思う?

    [補足]配列[k]は、私も気にはなっていた箇所です。素数ファイルは100,000以下の数字(5桁)が出てきます。ところが、初日に作ったプログラムでは、ここは何も気にせずに、ファイルを最後まで読み込んだようでした。また、後日(本日も)、折々の箇所でkの値を調べても、数十、数百と1ずつ加算されていくのです。そして、計算は合っています。今のところの問題は、変数の順序を、古い方から並べるべきかどうかといった、この点なのです。もしkの値が問題ならば、kは6以上の数を受け付けないでしょうし、変数の順序を変えたからといって、計算結果が変わるとも思われません。とりあえず、「ぷらぐろまあ」様、早々のご意見、有り難うございました。また、いろんなお考えをお持ちの方、忌憚なく、ご意見をお寄せください。

    No.1の回答に寄せられた補足コメントです。 補足日時:2020/11/01 21:57
  • HAPPY

    [補足]「ぷらぐろまあ」様、大当たり!! moji[6]を moji[100000]に書き変えただけで、完走しました。バカみたいなことで悩んでいました。ソフトも中途半端に動くものだから、紛らわしかったのであります。とにかく、第一号で解決したようであります。変数の順番に規則があるというのは、眉唾ものなんですかね。私も、今回初めて知ったことでした。何せよ、「ぷらぐろまあ」様に大当たり賞を差し上げます。

      補足日時:2020/11/01 22:27

A 回答 (1件)

配列は、0から始まります



moji[6]と宣言したのであれば、使えるのはmoji[0]〜moji[5]の6つです。
この回答への補足あり
    • good
    • 1
この回答へのお礼

Thank you

やっぱり、気になっているところは、調べてみるもんですね。有り難うございます。

お礼日時:2020/11/01 22:30

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!