• ベストアンサー

プログラムが正しく動きません。

http://plaza.rakuten.co.jp/kakuekiteisha5/diary/200912260000/のページの素数判定プログラムで、 コンパイルは問題なく通るのですが、 実行すると、同じ入力でも結果が変わったり、 デバッグ時に同じ入力で Program terminated with signal SIGABRT, Aborted. というエラーが出たり出なかったりします。 原因がどうしてもわかりません。 どなたかよろしくお願いします。 ちなみに、コンパイラはgcc、デバッガはgdbを使っています。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

isprime関数の行っていることがおかしいのでは? 具体的には x=myalloc(m); y=myalloc(m); one=myalloc(m); nt=myalloc(m); q=myalloc(m); np1m=myalloc(m+1); で領域を確保した後、 それぞれのポインタを nt=sub(n, one, m); とか q=nt; などと更新しています。更新することはかまわないのですが、その後、 free(x); free(y); free(one); free(nt); free(q); free(np1m); と更新したポインタを用いてfreeしています。 こんなことすると、一度開放した領域を再度開放したり、開放すべき領域を開放しなかったり、へんな領域を開放したりしてしまいます。その結果、メモリの内容がおかしくなると思うのですが・・・・・・。

その他の回答 (2)

  • asuncion
  • ベストアンサー率33% (2126/6286)
回答No.2

ある1個の数値が素数かどうかを判定するためだけに そんなに長いコードが必要でしょうか。 今のコードでは、2も3も素数ではないと判定しています。 isprime関数を中心に、全体のロジックを見直す方がよいと思います。

回答No.1

解説はおろかコメントすらない400行を越えるコードを読んでもらおうというのが非常識

関連するQ&A

  • リモートデバッグについて

    リモートデバッグについて質問があります。 現在、Red Hat Linux 9.0にて、C言語のプログラミングをしています。 いま作っているプログラムは、CUIの簡単なものです。 環境は以下のとおりです。  エディタ :vi  コンパイラ:gcc  デバッガ :gdb ですが、viに慣れていないのとgdbだとデバッグは全てコマンドになるので、 効率が上がらないです。(スキルも無いのですが。) そこでWindowsXPのマシンで、samba共有のソースをエディタで 編集してみると便利でした(パソコンは2台あります) ただ、コンパイルとデバッグはLinux上になってしまうので、そこから先は同じです。。。 WindowsマシンでLinuxに入っているgdbのフロントエンドみたいなことできないでしょうか? (コンパイル・実行は、Linux上で行われるけど、デバッグは、Windowsから行える) 何か、いい環境はありませんでしょうか? また可能であれば、手順等をお教えいただけますか? ※ちなみにLinuxマシンは、中古の5000円で購入したボロの為、Xウインドウを入れていないです。  なので、GUIの統合環境をLinuxマシンで使用するというのは無しでお願いします。  また、windowsマシンにcygwinを入れるというのもLinuxマシンが可哀想なので、  今回は無しでお願いします。 下記のアドレスにあるソフトを使うと私のしたいことが出来るような気がするのですが、 英語のページなので、細かいところがわかりません。。。 BVRDE http://bvrde.sourceforge.net/index.htm

  • C言語 メモリ?

    最近、C言語の勉強を始めているものです。 gccでコンパイルし、実行ファイルを実行すると 強制終了 と表示されます。 gdbで実行してみると、 Program terminated with signal SIGKILL, Killed. The program no longer exists. You can't do that without a process to debug. と表示されました。 プログラムの中で、二次元配列 a[10000][10000],b[10000][10000] というような大きい配列を使っているのが原因なのかなと思っていますが、どうなんでしょうか?mallocでメモリを確保したらいいのでしょうか? ソースを載せることができなく申し訳ないですが、よろしくお願いします。

  • gdbデバッガって?

    「gdbデバッガでスタックトレースを解析して、どこでアプリケーションが落ちているか解析してください。」 と言われました。 はっきり言って、何を言ってるのか全然分かりません・・・ プログラム開発はしたことが無いので、デバッグとかも全然わかりません。 誰かそのやり方とか、言葉説明をしてもらえませんか? 御願いします。

  • gdbでの引数の指定

    起動時に引数を必要とするプログラムを作っていて、 引数が無いと、エラーを表示して終了するようになっています。 このプログラムの終盤で挙動がおかしく、 gdbでデバッグしようとしているのですが、 引数がないため、途中で終了してしまい、 問題の箇所まで進めません。 gdbでデバッグする際に、引数を指定するにはどうすればよいのでしょうか。 環境は以下のとおりです。 よろしくお願いします。 redhat7.2、gdb-5.1-1、gcc-2.96-98

  • デバッガをデバッガに掛けたい

     GDBを使ってとあるプログラムをデバッグしているんですが、GDBの動作に疑問があって詳細を調べたくなりました。そこで、デバッグ中のGDBをまたGDBに掛けてデバッグすることを考えたのですが、これを単純にやると二番目のGDBに端末を取られちゃって、一番目のほうは入力がブロックされてしまうようです。  GDBのソースを変更せずに、こういうことを実現する方法はないでしょうか?

  • arm-linux-gdbをMeadowで使う方法ありますか?

    Cを書くのに、GDB + Meadowを使い始めました。 今回、arm-linux-gccで、組込み用のプログラムをクロスコンパイルしています。そこで、M-x gdbのような感じで、arm-linux-gdbをMeadow上で使うことはできますでしょうか?(例えば、M-x arm-linux-gdb みたいな)やり方、もしくは、参考になるサイトがあればお教えください。 ちなみに、現段階では、gdbserverをターゲットに置いて、arm-linux-gdbをCygwin上から直接起動してデバッグすることには成功しております。Cygwin暦はそれなりにあるのですが、emacs関連の知識は最近始めたばかりで、ほぼ初心者レベルです。よろしくお願いいたします。

  • モニタプログラムとの通信ソフトHtermのソースレベルデバッグについて

    自分は現在実務訓練において、h8/3048Fマイコンを使用して、光センサを用いた測定機器を作成しようとしている学生です。 その中でルネサス様のサイトで公開しているHtermというマイコンのROMに書かれたモニタプログラムとの通信ソフトウェアのソースレベルデバッグについて質問があります。 ソースレベルデバッグを行うにはコンパイルしたプログラムの出力形式がデバッグ情報をつけたELF/DWALF2形式ではいけないみたいです。 例えば同じくルネサス様のコンパイル、ビルドの総合開発環境のHEWだと、出力形式がELF形式にできるみたいなのですが、他にもcygwinを用いてgccのコンパイル環境を自分で構築すれば可能であるとインターネットで調べているうちに発見しました。 実際にそのコンパイラ環境 binutlis version 2.16 gcc version gcc-core-3.4.3 newlib version 1.13.0 (target=h8300-elf) で構築を行いました。そして、LCDに文字を出力するサンプルプログラムをデバッグ情報をつけるコマンド(-g)をオプションにつけてコンパイルし、Htermを使ってマイコンのRAMに書き込みましたが、 その後に「ソースプログラムを表示しますか」というコメントが表示されるのはいいのですが、「Ok]をクリックすると 「CPUないし動作モードが正しくありません」 と表示されてしまいます。これでは、ソースレベルのデバッグを行うことができません。 動作モードはそれぞれ一通りのモードで同じ事をやってみましたが、上記のエラーが表示されてしまいます。h8用のコードを作成するために-mhというコマンドもつけてコンパイルしています。 このエラーに対してなにか知っている人がいましたら、回答のほうよろしくおねがいします。

  • GPLについて

    gcc でコンパイルしたプログラムは gccのライブラリとリンクされることになると思いますが、このプログラムは配布する時に GPL にのっとって配布しなければならないのでしょうか? 一般的に linux で動く商用で配布されているプログラムなどのようなコンパイラでコンパイルされているのでしょうか?

  • gccコンパイラー

    今、gccでコンパイルするc言語のコンパイラーを探しています。 フリーでダウンロードできるいいコンパイラーはないでしょうか。 お勧めなどがありましたら教えてほしいです。 あと、C言語ではgccやbcc等のコンパイラーで プログラムソースの書き方容が変わったりするものなのでしょうか? 一応、ボーランド?のコンパイラーは持ってます。 ただ、今度OJTでUNIX環境のc言語開発の現場に行く事になり gccでコンパイルするもので勉強しとくようにいわれています。 宜しくお願いします。

  • C++プログラムにおけるexeファイルサイズ

     borland C++でプログラムを記述し、コンパイルするとexeファイルサイズがソースのそれの約100倍に増えます。  これを低減する方法を教示ください?  gcc、g++、vccなど各種コンパイラによって異なるそうですが。