• ベストアンサー

printf()がないとエラー

現在、素因数分解プログラムを作っていて値を確認するために使って いたprintf()を取り除いて完成というところだったのですが、50の 倍数のときにセグメントエラーになり、再びprintf()を付け加えると 正常に動作するという不可解な現象が起きました。 こんな場合は、どんなことが起きていると考えられますか? そして、1回も使ったことがないのでよくわかりませんが、デバッガ を使えば原因がわかるものでしょうか? 回答よろしくお願いします。

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

  • ベストアンサー
  • hosuke_dx
  • ベストアンサー率33% (4/12)
回答No.2

printf()を付け加えていない時 「たまたま動いている状態」と考えるのが妥当だと 思います。 机上デバッグでまず、50の倍数の系を丹念に追いましょう。 それでもわからないならデバッガで、セグメントエラーに なる瞬間を捕まえましょう。 デバッガを使えば、エラーになる要因がわかるはずです。 が、タイミング関連のバグであれば、デバッガを使うと printf()を外しても、セグメントエラーが起きなくなったり することもありますね。(その逆-つまり、printf()を つけているのに落ちるということ-もありますが。) ご健闘をお祈りします。 バグ退治、がんばってください。

その他の回答 (2)

  • Kizz
  • ベストアンサー率47% (30/63)
回答No.3

曖昧な意見ですが・・。 処理に直接関係のない処理文の有無によって動きに変化がある場合には、可能性としてメモリーリークが上げられます。 ※絶対とはいえませんが、その場合がおおにしてかと。 nullアクセス。初期化抜け。変数領域オーバー格納とか。 トレースして変数のアドレス値の動きを確認するのが良いと思います。 ※デバッカーを使うとアドレス値の確認は容易になりますが、デバッカーは領域をきれい勝手にやってくれて不具合が出ないようになる、なんて悩ましい場合もあったりもします。。 処理を確認しているブロック(関数内とか)で定義している変数、またはそのブロック内で使用するグローバル変数もあればそれも対象にし、確認してみるのも良いかと。 上記理由とは限定できませんので、あくまでも「ありえるケース」として受け止めてください。

noname#41855
noname#41855
回答No.1

初期化していないポインタかローカル変数を使ってたりしませんか? ポインタが示す先の領域をちゃんと確保しているか? または ローカル変数(関数の中で宣言している変数)を値をセットせずに参照していないか? を、チェックしてみてください。

ume-kun
質問者

お礼

やっとバグが取れました!ループの中で確保していない領域に アクセスし続けていてループから抜け出せない状態でした。 つまらない質問に意見をくださってhosiharaさん、hosuke_dxさん、 Kizzさん ありがとうございました!

ume-kun
質問者

補足

回答ありがとうございます。これからチェックしてみます。

関連するQ&A

  • printf関数の振る舞い?に関して

    皆様、こんにちは。 C言語のデバッグに関して詳しい方どなたか教えてください。 現在、静的SQLを使ったC言語でのプログラム開発をおこなっております。DBはIBM DB2で、マシンはAS400、言語は C/400です。最初はPCで、Microsoft Visual Stadio .NET 2003で開発して、やはりPC上のIBM DB2にアクセスしてテストしておりました。 問題のCのソースはステップ数が巨大(Cで5,000ステップ)なため、printf関数をとこどどころに入れてテストしておりました(プリコンパイル→コンパイルの作業がある為?にデバッガーは使えなかった為)。 全てのテストが完了したので、ソース上からprintf関数を全て削除して、実行させてみました。 ところがprintf文が入って、正しい結果を出力していたころのプログラムとは思えないほどの、エラーが続出しました。 まず、メモリーエラーと思われるエラー、永久ループ、重複レコード出力エラーなどです。これらは今までと、同じデータで実行したので、全く同じロジックを通るはずなのですが、まるで別人のような振る舞いをしまます。 以前、デバッガーにはデバッガー自身が動くためにメモリーを整理して実行するため、このような事がおきるとは聞いておりましたが、ただのprintf関数で、このような事が起きる事があるのでしょうか? 本プログラムはstrcpyやstrcmp関数が多用されていて、NULL -STOPが正しくセットされていないのではかと、現在調査・改修しているところです。 皆様、このような現象って何が考えられるでしょうか? 宜しくお願いいたします。

  • 素因数分解をこの問題でどう使うのか??

    問題 「a、b、cは自然数とする。 2^3a×3^2b×5^cで表せる6桁の数があり、その中央の4桁は0736であることがわかっているとき、a,b,cの値を求めよ。」 これは中学生の問題です。私は家庭教師をしているのですが、情けないことにこの問題がわかりません。この問題のテーマは「素因数分解の利用」ということなのですが、どう素因数分解を利用するのかわかりません。 ~私の解法(素因数分解の利用なし)~ 3^2b=9の倍数なので、9の倍数の性質と2×5=10を利用して6桁の数が「207360」とわかったのですが、素因数分解を利用していないので、この解法ではないと思います。そもそも9の倍数の性質を知らないと解けない問題自体見たことがありません。 素因数分解を利用する解法がわかる方はぜひ教えて下さい。お願いします。

  • 最小公倍数の求め方

    高校で、最小公倍数の求め方を習いました。 素因数分解をし続けたらわかる!ということでした。 最大公約数は、その組の共通の素因数というのは理解できます。 ですが、最小公倍数はよくわからないです。 回答よろしくお願いいたします。

  • 素因数分解について

    中学三年で習う素因数分解についてです。 素因数分解をするときに、数字を最小の素数で割らなければいけない理由は何ですか? また、素因数分解を利用して最大公約数と最小公倍数を求めるための式(共通の素数をかけていくという式です)の意味が理解できません。。 何故あの式で最小公倍数と最大公約数が出るんでしょうか? テストが近いのでかなり焦っています。 どなたか詳しく説明してくださる方、回答よろしくお願いします。

  • 小5算数「整数の性質」について。

     小学5年の算数で,整数の性質を学びます。そこでは,最大公約数や最小公倍数を求めることも扱います。そこで質問です。  この際,算数の内容に素因数分解を取り入れ,素因数分解を用いて最大公約数や最小公倍数を求めることも扱うべきだと思いますか。

  • 小5算数 整数の性質

    どの程度まで扱うべきだと思いますか。以下私案: 1 約数と倍数:偶数と奇数,約数と倍数の意味,倍数の見分け方 2 素数と素因数分解:素数,素因数分解 3 最大公約数とその利用:2数及び3数の最大公約数とその利用 4 最小公倍数とその利用:2数及び3数の最小公倍数とその利用 5 2つの整数とその最大公約数・最小公倍数との関係

  • 32bitについて…

    32bitについて… 以前、素因数分解のプログラムについて質問させていただきました。 http://okwave.jp/qa/q6132983.html int型では32bitなので、 -2147483648 ~ 2147483647(2^31-1) の値までしか扱えないことは理解しました。 もし、20桁の素因数分解をしたい場合どうすればよいのですか? long型とかですか?具体的に教えていただきたいです!! 同様に100桁でしたらどうするのでしょうか? よろしくお願いしますm(_ _)m

  • 素因数分解で最大公約数、最小公倍数を求める方法

    例えば  24と18を使って素因数分解すると 2 |24 18 3 |12  9    4 3 となって共通の素因数をかけて6が最大公約数 共通の素因数と、共通の素因数を抜いた数を掛けて 72が最小公倍数 というふうに求めますが これは素数である必要はあるのですか? 別に 6| 24 18    4  3 として求めても同じではないのですか? 下の方法で何か困ることはあるのでしょうか?

  • 二重ループを使うプログラムについて(C言語)

    素因数分解するプログラムで、例えば360を入力したとき、 2^3 * 3^2 * 5^1 と表示するプログラムを作りたいのですが、scanfとprintfの部分は分かるのですが、肝心の二重ループの部分が分かりません…。 最後に*が表示されないようにするというのが条件なのですが、初心者で慣れてないので、詳しく教えていただけないでしょうか?

  • 和と最小公倍数の問題

    2つの自然数で、その和が4984、最小公倍数が162540であるものを求めよという問題なのですが、162540を素因数分解して2^2×3^3×5×7×43となることが分かりましたがそこからが分かりません。ご教授お願いします。