ここから本文です

paizaの問題をC言語で解いた所、下記URLの様な結果になりました。

ext********さん

2018/11/1315:49:43

paizaの問題をC言語で解いた所、下記URLの様な結果になりました。

https://paiza.jp/challenges/share/MjiwsfyhmRoJUJOLhOqSD43JS8fbGbTnI...

失敗の説明がランタイムエラーと出るだけで原因が想像できません。

ここで質問なのですが、C言語でランタイムエラーが出た場合、どのような原因が上がりますか?(配列のインデックス外にアクセスした時とか...)
ありがちなミスとかがあればご教示ください。よろしくお願いします。


paizaの規約で問題とソースコードはお見せできません。
曖昧な質問になってしまい申し訳ありません。

閲覧数:
397
回答数:
2

違反報告

ベストアンサーに選ばれた回答

yay********さん

2018/11/1316:45:25

ランタイムエラーは想定外のことが実行時に起きたということです。
大抵は配列の範囲超えたとか文字列の対処の誤りとかプログラム構文はミスってないけどロジックはおかしいと分かるものが多いです。

実行時エラーなのでどうしてもロジックが追えないならデバッグプリントいれます。
assert()
でも
データ確かめるための
printf()
でも
ここまで動いたという確認の
printf()
でもいいので入れて確認します。

※IDEとかの環境があるならブレークポイント置くだけで済む話なのですけど。

怪しいのはメモリ扱い部分です。
scanf()
配列の領域外に行きそうな処理
文字列の取扱
ポインタ制御の中でも書き込み

ランタイムエラーとでて時間が経っているの見ると無限ループも候補に入れるべきかな

  • 質問者

    ext********さん

    2018/11/1317:09:05

    ご回答ありがとうございます。
    デバッグをもっと綿密にやってみたいです。
    それと、今回は甘えてscanf使ってしまってるのでfgetsに修正する等も試してみます。
    ご指摘頂いたように多くの可能性があるのですね、大変参考になります。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

質問した人からのコメント

2018/11/14 00:28:15

今まで失敗していた理由が分かりました!
要素数が10000×10000のような二次配列を静的に確保しようとしていたのが原因でした。
10000でも累乗すれば爆発的に大きくなるという発想が出来なかったのが失敗ですね。

mallocを使うことで解決し、paizaのテストもすべて通りました。
ご回答頂いた内容すべてが参考になりました。

本当にありがとうございました。

ベストアンサー以外の回答

1〜1件/1件中

エヌさん

2018/11/1316:58:33

その問題をやってみました。時間がかかりすぎるのは「タイムオーバー」と出るので…メモリを使いすぎとかいうことはないでしょうか。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

あわせて知りたい

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる