掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.26991

セグメンテーションエラーが解決できません。
投稿者---しげ(2006/05/28 18:42:28)


ファイルにある10進数の10000のデータを
読み込んで、2進数に変換して、新たなファイルに
書き込むプログラムを作っているのですが、
コンパイルの成功した後、実行すると
”セグメンテーションエラーです”
と表記されて上手くいきません。forから抜け出せないのかと
考え、breakなどかきたしましたが上手くいきません。
どうしたら良いのでしょう?ご教授よろしくお願いいたします。





#include <stdio.h>
#include <stdlib.h>

main()

{

int j, kazu[j];

FILE *fp, *fp1;

fp = fopen("9000z.txt", "r");
if(fp == NULL)

fp1 = fopen("9000zx.txt", "w");
if(fp1 == NULL)

for(j=1; j<=10000; j++ )

{

fscanf(fp,"%d\n", &kazu[j] );
{
if((kazu[j] = kazu[10000]))
{
break;
}
}
}

fclose(fp);

int k, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10 ;

for(j = 1; j <= 10000; j++)

{

k = kazu[j];


fprintf(fp1, "%d\n", k);

m1 = k % 2; k = k / 2;

m2 = k % 2; k = k / 2;

m3 = k % 2; k = k / 2;

m4 = k % 2; k = k / 2;

m5 = k % 2; k = k / 2;

m6 = k % 2; k = k / 2;

m7 = k % 2; k = k / 2;

m8 = k % 2; k = k / 2;

m9 = k % 2; k = k / 2;

m10 = k % 2; k = k / 2;
{
if((kazu[j] = kazu[10000]))
{
break;
}
}
fprintf(fp1, "%d%d%d%d%d%d%d%d%d%d\n",
              m10, m9, m8, m7, m6, m5, m4, m3, m2, m1);

}
fclose(fp1);

}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:セグメンテーションエラーが解決できません。 26992 επιστημη 2006/05/28 18:49:50
<子記事> Re:セグメンテーションエラーが解決できません。 26993 しげ 2006/05/28 18:50:36
<子記事> Re:セグメンテーションエラーが解決できません。 26996 επιστημη 2006/05/28 19:25:41
<子記事> Re:セグメンテーションエラーが解決できません。 27005 nop 2006/05/29 12:52:50


No.26992

Re:セグメンテーションエラーが解決できません。
投稿者---επιστημη(2006/05/28 18:49:50)


> int j, kazu[j];

kazu[j] ってなんですか?



この投稿にコメントする

削除パスワード

No.26994

Re:セグメンテーションエラーが解決できません。
投稿者---しげ(2006/05/28 18:54:39)


>> int j, kazu[j];
>
>kazu[j] ってなんですか?

早速のご投稿ありがとうございます。
付け足したのですが、ファイルが縦に
3桁から4桁の数字が10000程度並んだ物で
kazu[j]はそれを1個ずつ読み込むために組んだ配列のつもりです。
jは10000回まわすための整数として宣言いたしました。
説明が不十分で申し訳ありませんでした。


この投稿にコメントする

削除パスワード

No.26998

Re:セグメンテーションエラーが解決できません。
投稿者---Blue(2006/05/28 20:58:07)


コンパイラはC99をサポートしたものでしょうか?(たとえばgccとか)
でないと

> int j, kazu[j];

という書き方はできませんけど。

それと、jの値はどうなっていますでしょうか?
j = 10000 ではないですよね?

普通は
int j = 10000;
int* kazu = ( int* )malloc( j * sizeof( int ) );

とのように大きな配列を扱いたいときはmallocを使って動的に取得します。


この投稿にコメントする

削除パスワード

No.26999

Re:セグメンテーションエラーが解決できません。
投稿者---しげ(2006/05/28 21:43:13)


おっしゃる通り、コンパイラにはgccを用いております。
自分の勉強不足ですがmallocというのは、初めて耳にいたしました。
明日にでも早速試してみようと思います。
わざわざありがとうございます。




この投稿にコメントする

削除パスワード

No.26993

Re:セグメンテーションエラーが解決できません。
投稿者---しげ(2006/05/28 18:50:36)


すいません、ファイルは
1235
215
785
1254
325
1254
1327
といったものが10000個の物です。


この投稿にコメントする

削除パスワード

No.26996

Re:セグメンテーションエラーが解決できません。
投稿者---επιστημη(2006/05/28 19:25:41)


> fp = fopen("9000z.txt", "r");
> if(fp == NULL)
>
> fp1 = fopen("9000zx.txt", "w");
> if(fp1 == NULL)

ここもわからん。fp,fp1 == NULL なら、どうするのん?



この投稿にコメントする

削除パスワード

No.27000

Re:セグメンテーションエラーが解決できません。
投稿者---しげ(2006/05/28 21:51:24)


すいません、ここはもともと、nullの場合、
printfでread ok等と表記していた箇所の消し忘れです。
みっともない形で申し訳ありません。


この投稿にコメントする

削除パスワード

No.27001

Re:セグメンテーションエラーが解決できません。
投稿者---ぽへぇ(2006/05/29 06:51:04)


字下げ代行しました。
とりあえず突っ込みを試みましたが、
途中から挫折しました。

#include <stdio.h>
#include <stdlib.h>

main()
{
    // jが初期化されていないため、
    //  kazuがどのくらい確保されるかわからない。
    int j, kazu[j];

    FILE *fp, *fp1;

    // 9000z.txtって何?
    fp = fopen("9000z.txt", "r");

    // 9000z.txtのオープンでエラーが発生したら9000zx.txtをオープンするの?
    // 9000zx.txtって何? 2進数に変換した結果を書き込む予定のファイル(?)
    if(fp == NULL)
        fp1 = fopen("9000zx.txt", "w");

    // ここも変。このままでは9000zx.txtのオープンに失敗したら
    // for文の中を実行する、という意味。
    if(fp1 == NULL)
        for(j=1; j<=10000; j++ )
        {
            fscanf(fp,"%d\n", &kazu[j] );
            {
                // これは比較? それとも代入?
                // まだ kazu[10000] を読み込んでも
                // いない時ってどんな数字をどうするの?
                if((kazu[j] = kazu[10000]))
                {
                    break;
                }
            }
        }

    fclose(fp);

    int k, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10 ;
    for(j = 1; j <= 10000; j++)
    {
        k = kazu[j];
        fprintf(fp1, "%d\n", k);
        m1 = k % 2; k = k / 2;
        m2 = k % 2; k = k / 2;
        m3 = k % 2; k = k / 2;
        m4 = k % 2; k = k / 2;
        m5 = k % 2; k = k / 2;
        m6 = k % 2; k = k / 2;
        m7 = k % 2; k = k / 2;
        m8 = k % 2; k = k / 2;
        m9 = k % 2; k = k / 2;
        m10 = k % 2; k = k / 2;
        {
            // 上のifと同じ
            if((kazu[j] = kazu[10000]))
            {
                break;
            }
        }
        fprintf(fp1, "%d%d%d%d%d%d%d%d%d%d\n",
            m10, m9, m8, m7, m6, m5, m4, m3, m2, m1);

    }

    fclose(fp1);
}




この投稿にコメントする

削除パスワード

No.27002

Re:セグメンテーションエラーが解決できません。
投稿者---あしっど(2006/05/29 09:39:13)


朝っぱらからお疲れ様です
後半突っ込んでみます。


  // C言語では関数の途中での変数宣言は出来ません。
  // 先頭で一括で宣言しましょう。
  // またこういう場合は、m[10]のように配列を用います。
  // kも上ですでに宣言しているので、違う名前にしましょう
  int k, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10 ;
    for(j = 1; j <= 10000; j++)
    {
        // 多分ここは10進-2進変換をしてるんだろうが・・・
        // もしも、この10回の計算で答えが求まらなかった時はどうなるでしょう。
        // また、途中でkの値が0になった時、以降の計算は無意味です。
        k = kazu[j];
        fprintf(fp1, "%d\n", k);
        m1 = k % 2; k = k / 2;
        m2 = k % 2; k = k / 2;
        m3 = k % 2; k = k / 2;
        m4 = k % 2; k = k / 2;
        m5 = k % 2; k = k / 2;
        m6 = k % 2; k = k / 2;
        m7 = k % 2; k = k / 2;
        m8 = k % 2; k = k / 2;
        m9 = k % 2; k = k / 2;
        m10 = k % 2; k = k / 2;
        
        // こういう無意味な{}の字下げは好ましくありません
        {
            // ここはまったく意味が分かりませんね。
            if((kazu[j] = kazu[10000]))
            {
                break;
            }
        }
        fprintf(fp1, "%d%d%d%d%d%d%d%d%d%d\n",
            m10, m9, m8, m7, m6, m5, m4, m3, m2, m1);

    }

    fclose(fp1);
}

//  以下、10進-2進計算のサンプル
//  kに10個の10進数が入っています。
//  kのそれぞれの値を2進数に変換してfp1に書き込むサンプルです
//  後は自分で工夫してみてください
    for (i = 0; i <= 10; i++) {
        z = k[i];
        fprintf(fp1, "%5d = ", z);
        while (z != 0) {
            m = z % 2;
            z = z / 2;
            fprintf(fp1, "%d", m);
        }
        fprintf(fp1, "\n");
    }
    return 0;
}




この投稿にコメントする

削除パスワード

No.27003

Re:セグメンテーションエラーが解決できません。
投稿者---あしっど(2006/05/29 09:45:24)


うわー、一箇所訂正です。
for文の終了条件間違えた…

    for (i = 0; i < 10; i++) {  // ここ訂正
        z = k[i];




この投稿にコメントする

削除パスワード

No.27004

Re:セグメンテーションエラーが解決できません。
投稿者---通りすがり(2006/05/29 11:37:28)


while (z != 0) {
m = z % 2;
z = z / 2;
fprintf(fp1, "%d", m);
}

だと逆に表示されると思われ。

e.g. 4 = 001

z%2の結果を配列に格納していくか、再帰を使うとよいんでは?



この投稿にコメントする

削除パスワード

No.27005

Re:セグメンテーションエラーが解決できません。
投稿者---nop(2006/05/29 12:52:50)


まずは、問題を分割しましょう。

・ファイルから一つの10進数のデータを読み込めますか?
・ファイルから複数の10進数のデータを読み込めますか?
・一つの数値を2進数として表示できますか?
・複数の数値を2進数として表示できますか?
・一つの数値を2進数としてファイルに出力できますか?
・複数の数値を2進数としてファイルに出力できますか?


これらがクリアできなければ、
あなたが作ろうとしているプログラムは作れません。

ソースを見る限り、Cに関する理解度がなさ過ぎます。
もっと、順を追って勉強しましょう。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧