windows 10
gcc version 5.2.0 (Rev4, Built by MSYS2 project)
の環境で主にアルゴリズムの勉強をしております。
通常は-Wallオプションのみ使用してコンパイルしていました。
あるソースをコンパイルしたところ正常動作しなかったので、いろいろ調べたところ最適化オプション(-On, n=1,2,3,s)を使用すると正常動作する実行ファイルができることが分かりました。
これはgccのバグなのでしょうか?
それとも、最適化オプションは必ず使用するという前提なのでしょうか?
ご教示をお願いします。
No.2
- 回答日時:
「正常動作しなかった」というのが、「具体的にどうせ異常でなかったのか?」すら不明なので、想像するしか有りませんが、最適化オプションの有無で結果が変わるなら、一般的にはソースのどこかがおかしいのだと思います
本来
・必要な変数初期化をしていない
・バッファ・オーバー・フローも含めて、変数のサイズが不適切
等です
ご回答ありがとうございました。
真っ先にコンパイラのバグを疑ってしまいましたが、確かに仰るとおりでした。
今後は注意するようにします。
No.3
- 回答日時:
char** read(void) {
> char buf0[BUF_SIZE];
> char buf1[BUF_SIZE];
> static char* string_pair[2];
fputs("比較元:", stdout);
fgets(buf0, BUF_SIZE, stdin);
fputs("比較対象:", stdout);
fgets(buf1, BUF_SIZE, stdin);
> string_pair[0] = buf0;
> string_pair[1] = buf1;
> return string_pair;
}
>の付いた部分はいいんでしたっけ?
No.4ベストアンサー
- 回答日時:
> char **
> read (void)
> {
> char buf0[BUF_SIZE];
> char buf1[BUF_SIZE];
> static char * string_pair[2];
>
> fputs ("比較元:", stdout);
> fgets (buf0, BUF_SIZE, stdin);
> fputs ("比較対象:", stdout);
> fgets (buf1, BUF_SIZE, stdin);
> string_pair[0] = buf0;
> string_pair[1] = buf1;
>
> return string_pair;
> }
この関数には1つ推奨できない点と1つの間違いがあります。
read はある処理系において予約関数です、この名前は使用すべきでなないです。(←余談です)
問題は、変数 buf0 と buf1 です。この変数は、ローカル変数でスタック上に記憶領域がとられます。よって、この変数はこの関数から戻ったら無効になります。
最適化した場合にうまく動作するのは、恐らくインライン展開のような最適化が行われ、結果的に変数の記憶領域がスタック上に置かれない、もしくはmain () と同一のスタック上に置かれるためと思われます。
確認するには、最適化した時のアセンブラーコードを確認する必要がありますが。
詳しいご説明をありがとうございました。
ご説明いただいた内容に納得です。
なお、buf0とbuf1をstaticにしたところ、最適化しなくても正常動作することを確認しました。
出力したアセンブラーソースを読み取るのは、能力的に無理でしたw
とりあえず自分の使用しているコンパイラのバグでないことが判りホッとしました。
C言語の、この手の間違いは一旦ハマると見つけるのは大変なのでしょうね、簡単に見つけ出せる方法があると良いのですが。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(IT・Webサービス) ホームページにカウント数を表示する 2 2022/10/28 10:37
- Excel(エクセル) 「Excelのオプション」の「ユーザーインターフェイスのオプション」の設定値をVBAで取得したい 1 2022/07/31 23:49
- Windows 10 Windows10でセーフモードが出来ません。 2 2022/04/22 23:37
- Windows 10 フォルダの新規作成を必ず「ドキュメント」にする方法 1 2023/06/24 09:08
- CPU・メモリ・マザーボード 起動時にF1を要求されます。 2 2023/01/22 12:55
- Visual Basic(VBA) VBA アドインについて お詳しい方 ご教授をお願いします。 相談事項 現在以下の対応を実施した所、 1 2022/11/02 16:53
- 教育・文化 高校生です。将来政治家になって犯罪率を0.0%代にしたいのですが、可能だと思いますか? ㅤ 大まかな 8 2022/08/27 18:51
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- ドライブ・ストレージ Android端末でSDカードが機能しなくなりました 6 2023/02/17 17:20
- Excel(エクセル) VBA : スクレイピングできない 4 2023/05/12 22:26
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のfor文です。 繰り返しの...
-
fgetsなどのときのstdinのバッ...
-
間接操作のレベルとは
-
CStringをwchar_tに変換したい
-
バイトスワップをやりたい
-
c言語でユーザ関数を利用して入...
-
C言語の入力した文字を反転させ...
-
atoi( ) の反対をやりたい
-
文字列から空白を取り除きたい...
-
Linuxでフォルダ内全ファイル名...
-
enumの記述について。
-
配列をnビットシフトする
-
ユニコード文字列の分割
-
DPマッチング
-
C言語です
-
RGB→YUV変換のプログラム
-
C言語のビットフィールドについて
-
c++ 文字列を入力して、一文字...
-
C言語のポインターで詰まっている
-
ワイルドカードを用いた文字列検索
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
charでの計算?
-
C言語のfor文です。 繰り返しの...
-
charからLPTSTRへの変換方法
-
文字列から空白を取り除きたい...
-
C言語の入力した文字を反転させ...
-
'const char *' 型は 'char *' ...
-
配列をnビットシフトする
-
str系関数を使わずに二つの文字...
-
int main()の・・・
-
atoi( ) の反対をやりたい
-
CStringをwchar_tに変換したい
-
c++ 文字列を入力して、一文字...
-
switch文で文字を比較すること...
-
干支のプログラム
-
3桁区切(コンマ)記号をつけ...
-
絶対パスからのファイル名の切...
-
間接操作のレベルとは
-
間接参照のレベルが異なっています
-
型変換
おすすめ情報
>「正常動作しなかった」というのが、「具体的にどうせ異常でなかったのか?」すら不明なので
失礼しました。対象ソースは
https://oshiete.goo.ne.jp/qa/9343826.html のNo.11で提示されているものです。
正常な動作結果は、当該質問欄に「出力例」として提示されている内容です。
私の環境で最適化オプションをつけず-Wallのみつけて、コンパイルした結果は下記になります。
※関数char** read(void)内で、2箇所のfgets()の前にfflush(stdout);を追加しています。
$ gcc -Wall test.c
$ ./a.exe
比較元:ABCDEFG
比較対象:AVCEFZG
A(挿入)G(脱落)
編集距離:0.429