質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

540閲覧

次のコードでクラッシュします。何が原因かわかりません。よろしくお願いします。

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/02/26 01:12

編集2020/02/26 01:27
typedef struct { unsigned short n; unsigned short a; } oterm; typedef struct{ oterm t[DEG]; } OP; typedef struct { unsigned int x[DEG]; } vec; typedef struct { OP u; OP v; OP d; } EX; EX xgcd(OP f,OP g){ OP h={0},ww={0},v[K*2]={0},u[K*2]={0}; oterm a,b; int i=0,j,k; EX e={0}; u[0].t[0].a=1; u[0].t[0].n=0; u[1].t[0].a=0; u[1].t[0].n=0; u[2].t[0].a=1; u[2].t[0].n=0; v[0].t[0].a=0; v[0].t[0].n=0; v[1].t[0].a=1; v[1].t[0].n=0; //printpol(o2v(f)); printpol(o2v(g)); printf(" in xgcd============\n"); // exit(1); k=0; //i=1; for(i=0;i<T;i++){ if(LT(g).a==0 || LT(f).a==0) break; h=omod(f,g); ww=odiv(f,g); v[i+2]=oadd(v[i],omul(ww,v[i+1])); u[i+2]=oadd(u[i],omul(ww,u[i+1])); printf("i+1=%d\n",i+1); f=g; g=h; } //exit(1); //v[i]=odiv(v[i],h); //u[i]=odiv(u[i],h); // h.t[0].a=1; //h.t[0].n=0; printf("i=%d\n",i); printpol(o2v(v[i])); printf(" v=============\n"); printpol(o2v(u[i])); printf(" u=============\n"); printpol(o2v(h)); printf(" h=============\n"); e.d=h; e.v=v[i]; e.u=u[i]; // exit(1); return e; }

次のコードにバグがあり、クラッシュしてしまいます。-O2オプションをつけると正常動作するのですが、なぜオプションをつけないと暴走するのかわかりません。どなたか手を貸してほしいです。これはコードレビューの一部です。全体についてはGitHubにあるのでそちらをご覧ください。構造体は一変数多項式を表現するために作りました。otermは単項式で、次数と係数のメンバを持っています。単項式の配列がOP構造体です。

https://github.com/anang0g0/GoppaDecorder

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/02/26 01:16

EXやOPはどのような型でしょうか?
y_waiwai

2020/02/26 01:17

コードの一部だけ出されても意味不明です また、このままではコードが読みづらいので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
guest

回答2

0

コードレビューについてに回答した通り、クラッシュの原因はスタックオーバーフローです。

gcc -O2 オプションで動作するので気にしない

といえるような事ではなく、質問者自身が「使ってないOP構造体がたくさんありすぎ」たと気づいたようですが、デフォルトで8MB割り当てられるスタック領域を使い果たすほどメモリを消費しています。-O2オプションは使われない変数を割り当てないように最適化するのでスタックオーバーフローが起こらなくなったのです。
どこの処理に、どんな変数が必要なのか、どうメモリを割り当てれば良いのか、設計がぞんざいなままコーディングを進めたことが一番の問題です。C言語プログラミングに慣れて、効率良い使い方ができれば、必要なメモリサイズを劇的に減らす可能性があると思います。

投稿2020/02/26 22:55

rubato6809

総合スコア1382

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/02/26 23:19 編集

設計がぞんざいだというのは全くそのとおりです。あくまで趣味で作ったものなので、main関数にあった変数をそのままコピペとかやって、全然使ってない変数は数多あります。今後レビューを通しして完成度を上げていくつもりなのでよろしくお願いします。とりあえず次世代暗号に使えるスケルトンを作ることを第一目標にしたので、その点完成度が低いのです。プロなら一発でかけるようなきれいなコードを書く才能は私にはありません。自分が目標としているのは動作速度の向上です。鍵生成や暗号化に時間がかかれば実用的なコードとは言えませんので。あと自分はC言語の基礎しか知りません。なのでポインタも理解してないし、オブジェクト指向もマルチタスクもプロセス間通信もソケットも何もわかりません。言い訳になってしまいますがこの程度です。これも生涯学習の一環です。フリーソフトを通して貢献したいと思います。
rubato6809

2020/02/27 00:01

> プロなら一発でかけるようなきれいなコードを書く才能 そんな才能はプロでも滅多にあるものではありません。何度も書きなおして、考えなおすことの繰り返しで技術を鍛えていくのです。 > ポインタも理解してない そうだと思いました。そこが必要メモリを劇的に減らし、効率を良くするカギになります。 論文からコードを起こすことができて、プログラミングの技術が伴えば、オリジナルなソフトウェアを生み出す力になります。私は期待します。
退会済みユーザー

退会済みユーザー

2020/02/27 00:17

ポジティブな意見をありがとうございます!嬉しいです。
退会済みユーザー

退会済みユーザー

2020/02/27 00:35

自分でもまだよく分っていない部分があります。例えばwhile文の条件設定など、終了条件がわからないまま実装しているので多くのバグがあると思います。そのへんまだレビューにはまだ早いのかなとも思います。
guest

0

ベストアンサー

gcc -O2 オプションで動作するので気にしないことにしました。ありがとうございました。

1763行目のxgcd関数に入る瞬間にコアダンプします。関数の内部にexit関数を記述して、計算内容を表示させることはできるのですが、exitを外すと再び関数に入ると同時にコアダンプします。なぜだかわかりません。exitを入れないと、xgcdの計算内容の表示をする前にコアダンプします。

追記:どうやら構造体の配列のメモリが確保できなかったらしく、v[K*2]={0};から
mallocでメモリを確保したあとに、memsetで初期化したら動くようになりました。
デバッグは難しいですね。

OP h={0},ww={0},*v,*u;
oterm a,b;
int i=0,j,k;
EX e={0};

v=malloc(sizeof(OP)K2);
u=malloc(sizeof(OP)K2);
memset( v, 0, sizeof(v) );
memset( u, 0, sizeof(u) );

投稿2020/02/26 01:29

編集2020/02/26 03:28
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/02/26 01:36

それは「運良く動いているだけ」です。 コンパイラのバージョンやマシン環境、メモリ配置など、なにかが変わった表紙に動かなくなることも考えられますので、放置するのは危険です。
退会済みユーザー

退会済みユーザー

2020/02/26 01:39

どうすればいいのかわかりません。
maisumakun

2020/02/26 01:43

まずは、デバッガを入れるなり途中経過を出力するなりして、どこまで意図通りに動いているのかたどっていきましょう。
退会済みユーザー

退会済みユーザー

2020/02/26 01:58

1763行目のxgcd関数に入る瞬間にコアダンプします。関数の内部にexit関数を記述して、計算内容を表示させることはできるのですが、exitを外すと再び関数に入ると同時にコアダンプします。なぜだかわかりません。exitを入れないと、xgcdの計算内容の表示をする前にコアダンプします。
maisumakun

2020/02/26 02:07

> 関数の内部にexit関数を記述して、計算内容を表示させることはできるのですが、exitを外すと再び関数に入ると同時にコアダンプします。 このようなことが起きているということは、xgcd関数に入る「より前に」メモリを破壊するコードの誤りがあって、それを関数への出入りで拾ってしまう、というような状況が考えられます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問