![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
当方、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関数以外のものは、問題ありません。
変数の並べ方を教えていただけないでしょうか。もしくは、別の問題があるのか、よろしくご教示ください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# アセンブラ指令 3 2023/06/17 14:47
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のサフィックスについて
-
零元のはいっている
-
テキストボックスかラベル上の...
-
Excel VBAでsub,dimは何の略?
-
【VB.NET】テキストボックスに...
-
subsequentとnextの違いってな...
-
他のフォームから別のフォーム...
-
C#のループでtextboxに値を入れ...
-
VB.NETのグラフィック描画で困...
-
PictureBoxでのアニメーション...
-
VBでの入力値制限について
-
VB.NETでのイベントの途中終了
-
【VBS】クリップボード操作につ...
-
テキストボックスを下から上へ...
-
プロシージャまたは関数の引数...
-
日付の重複
-
アクセスできない保護レベルエ...
-
sublimit textっていうエディタ...
-
プログラムの素朴な質問です 分...
-
xmlの値を配列に格納したいんで...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のサフィックスについて
-
変数の型でlong longとunsigned...
-
「ずっと憧れていました」は英...
-
Excel にて変数の宣言の仕方
-
初期化関数でmallocしたい
-
動的配列の受け渡しについて
-
アドレスp (char *p) からの連...
-
C言語で32Bit*32Bitの演算は出...
-
C言語の変数の並べ方について教...
-
VBA public変数はどのようなこ...
-
他のフォームから別のフォーム...
-
C#のループでtextboxに値を入れ...
-
エクセルVBAでテキストボッ...
-
VBAでcallで呼び出したsubを終...
-
VB.NETでのイベントの途中終了
-
ドラゴン曲線を再帰で書く
-
Functionの戻り値を配列にした...
-
アクセスできない保護レベルエ...
-
VBAで入力数値について
-
プロシージャまたは関数の引数...
おすすめ情報
[補足]配列[k]は、私も気にはなっていた箇所です。素数ファイルは100,000以下の数字(5桁)が出てきます。ところが、初日に作ったプログラムでは、ここは何も気にせずに、ファイルを最後まで読み込んだようでした。また、後日(本日も)、折々の箇所でkの値を調べても、数十、数百と1ずつ加算されていくのです。そして、計算は合っています。今のところの問題は、変数の順序を、古い方から並べるべきかどうかといった、この点なのです。もしkの値が問題ならば、kは6以上の数を受け付けないでしょうし、変数の順序を変えたからといって、計算結果が変わるとも思われません。とりあえず、「ぷらぐろまあ」様、早々のご意見、有り難うございました。また、いろんなお考えをお持ちの方、忌憚なく、ご意見をお寄せください。
[補足]「ぷらぐろまあ」様、大当たり!! moji[6]を moji[100000]に書き変えただけで、完走しました。バカみたいなことで悩んでいました。ソフトも中途半端に動くものだから、紛らわしかったのであります。とにかく、第一号で解決したようであります。変数の順番に規則があるというのは、眉唾ものなんですかね。私も、今回初めて知ったことでした。何せよ、「ぷらぐろまあ」様に大当たり賞を差し上げます。