卒論でプログラム作成しているのですが、Segmentation faultがでて困っています。
おそらく以下の個所があやしいと思うのですが、どこが危険か教えていただけるでしょうか?大きいプログラムなため以下にあやしい個所を一部抜粋します。

関数Bが特にあやしいと思っていますが、どう直していいのかわかりません;;

/* main一部 */
struct buf{
int id;
int no;
int wnd;
struct buf *next;
};

struct buf temp;
struct buf *restart1=&temp;
struct buf *resenddata1;
struct buf *rere;

/* 関数Aの一部 */
flowdata = (struct buf *)malloc(sizeof(struct buf));

resenddata1->next=flowdata;
flowdata->next=NULL;
resenddata1=flowdata;
temp_num[n]++;
resenddata1->no=temp_num[n];
resenddata1->wnd=cwnd[n];

/* 関数Bの一部 */
if(restart1->next != NULL){
rere = restart1->next;
restart1->next = rere->next;
if(check_no[n] == rere->wnd){
t_dep[n]=t+ceil(rto[n])*2-d12*2;
if(rere->no > max_no[n]){
max_no[n] = rere->no;
}
}
free(rere);
}

簡単に説明しますと、restartというスタート地点にどんどんresenddataをつなげていっています。(最後にNULL)ある地点にいくとrestart->nextをrereに入れてrereを解放という形です。ちなみにrestart1,restart2と同じようなものがあり、関数Aとrereは同じものを使うようにしています。(resenddata2として.rereは共通)
お手数ですが、よろしくお願いします。

A 回答 (2件)

>確かに(1)は必要ないですね^^;


いや、必要でした。
resenddata1には今まででに確保したbufのアドレスが入るわけですね。
しかも、No.1のお礼に記述の初期化処理があると。
その場合は確かにこの処理になります。

では更に質問です。
/* 関数Bの一部 */ では、データ列の中間部の開放処理しか書かれていないのですが、先頭部、および、最後尾の処理はどうなっているのでしょうか。

あと、
>struct buf temp;
>struct buf *restart1=&temp;
の部分ですが、この部分の処理に?となってしまいました。

このデータ構造の場合、tempを使わず、main()の始めのほうでmalloc()した領域をrestart1に設定するのが相場なので。
    • good
    • 0
この回答へのお礼

再度ご回答ありがとうございます。

私自身未熟なので四苦八苦しながら作っているので、プログラムに自信がまったくないので、hitomuraさんの回答に「ああ、必要なかったか・・」とすぐに思い込んでしまいました^^;

まず、ちょっと最初に説明足らずなところがあったことをお詫びします。かなり大きいプログラムなので全体をのせるわけにもいかず、抜粋したのですが大事なところが抜けていました^^;;以下の部分もそうです。

関数Bのリストの先頭と最後尾ですが関数Aの部分のリストそのものです。つまり
すべての関数が参照するexterns.hというヘッダ内で
extern struct buf temp;
extern struct buf *restart;
extern struct buf *resenddata;
という処理がしてあり、main.c内で
struct buf temp;
struct buf *restart=&temp;
struct buf *resenddata;
としています。つまり先頭はrestartで最後はNULLとなっています。

追加のご質問ですが、そこの部分の処理で最初の構造体の場所を記憶しているのですが、確かにご指摘の方法の方がスマートかと思います。そちらに変更してみようと思っています。

問題のあったプログラムですが、リストの数を表示するようにして問題個所をつめていったところ直りました。

最後になりましたが、hitomuraさん丁寧なご回答ありがとうございました。

お礼日時:2002/01/17 23:55

/* 関数Aの一部 */


flowdata = (struct buf *)malloc(sizeof(struct buf));

resenddata1->next=flowdata;  // (1)
flowdata->next=NULL;
resenddata1=flowdata; // (2)
temp_num[n]++;
resenddata1->no=temp_num[n];
resenddata1->wnd=cwnd[n];

(1)で設定したデータは(2)で消えてしまいますが、その前にrestartへのコピーは行われているのでしょうか?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

確かに(1)は必要ないですね^^;

補足として初期設定でmain内で
resenddata=restart;
restart->nest=NULL;
を行っています。

未熟なためいろいろおかしいかと思いますが引き続き募集させていただきます。

お礼日時:2002/01/17 20:43

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Qオフロードバイクのタイヤについて

XR250モタードの購入を考えているのですが、オフロードも走りに行きたいと思っています。オフロードツーリングに行くときにだけ、オフロードタイヤのホイールに履き替えて使うということはできるのでしょうか?

Aベストアンサー

こん**わ

 まず回答としては「可能です」

 ただ、モタードホイールは17インチ
 オフロードホイールは前21インチ後ろ18インチとなっているので
 タイヤの大きさが変わります。
 となるとホイールだけ変えただけではスピードメーターや距離計が変わってしまいます。
 メーターギヤーも交換が必要でしょう。

 また、リヤスプロケの大きさも変わるとチェーンも交換しないと行けなくなります。
 結構手間なので両方したいのならオフロードモデルをお薦めします。

 がんばってください

Qfor(int i = 100, long n = 1; i > n/3i; i++)

for(int i = 100, long n = 1; i > n/3i; i++)
のように、初期設定で型の違う変数を宣言したいんだけど
C++ではこんなふうに2つ以上の型を宣言してはいけないんですか?

Aベストアンサー

,

コンマ演算子の原理です。
forの初期化文で "," で区切れるのは値を返す文だけです。
よってintステートメントもlongステートメントも値を返さないので、この文では使用できません。

というか、むしろ、intステートメントの第2引数としてlongが認識されてしまいます。
外で

int i; long n;

とし

for(i = 0, n = 0; hoge; hoge)

なら可能です。

Qオフロードバイクはテクニックが無ければ乗るのは危険でしょうか?

オフロードバイクはテクニックが無ければ乗るのは危険でしょうか?
オフ車の素人がオフロードバイクのテクニックが皆無な状態で、オンもオフも走るのは危険でしょうか?

乗っていくにつれて分かってくるものなのでしょうか?
それともオフロードを乗っている方々はどこかで習っているのでしょうか?
よろしくお願いします。

Aベストアンサー

<オフロードバイクはテクニックが無ければ乗るのは危険でしょうか?>
全くそんな事ありません。
どこまでを「テクニックと言うか?」になってしまいますが、、、
オフ車はオフ車なりの「乗り方」みたいなモノがあるにはあります。

ですが、これまでに過去にオフ車に全く乗って無かったけど、、、ってヒトでも最初は「ん?何じゃ?」って思う事はあるけど、それとて30分も乗れば「ああ、こんな感じなんだな」ってスグに慣れてしまうはずです。

<オフ車の素人がオフロードバイクのテクニックが皆無な状態で、オンもオフも走るのは危険でしょうか?>
んな事はありません。
危険な乗り方すれば、オフでもオンでも危険なだけです。
いきなりオフ車でオフロードは危険もありますが、それとて少しづつ慣れていけば問題無いです。

<乗っていくにつれて分かってくるものなのでしょうか?>
そうですね、そんなもんですよ。。。

<オフロードを乗っている方々はどこかで習っているのでしょうか?>
そういう方もいるでしょう。
しかし、普通に乗る場合には特段の練習なんか必要ありません。
「オフロード車の乗り方」みたいな本を一読して実践出来ることからやってみるだけでも十分ですよ。

一般に市販されてるバイクで特別な訓練やテクニックを必要としてるバイクなんかありません。

どんなタイプのバイクだろうと、普通に(街乗り程度)使うのであれば訓練やテクニックなんて必要無いんです。
(普通に乗る事が出来るって事が条件ですけどね)

ただ、そのバイク固有に特化した何かに合わせた使い方をするのであれば、それなりのテクニックは必要です。

そのバイクの持っている特徴=性能=を最大限に出せる場所に於いて、そのバイクの能力を引き出すのであれば、そこはテクニックがモノを言う世界なんです。。。

例えば、オフ車を普通の街乗りで使う場合であれば、テクニックなんか必要ありませんが、このオフ車を林道や瓦礫道へ持って行って、このオフ車が持つ能力を最大限まで引き出すような走行をするなら、オフ車特有のテクニックが必要なだけです。
これはSSだとて同じ事です。

そして、オフ車は比較的誰にでも扱い易いモノです。
(SSなんかと比べればの話ですけどね)

<オフロードバイクはテクニックが無ければ乗るのは危険でしょうか?>
全くそんな事ありません。
どこまでを「テクニックと言うか?」になってしまいますが、、、
オフ車はオフ車なりの「乗り方」みたいなモノがあるにはあります。

ですが、これまでに過去にオフ車に全く乗って無かったけど、、、ってヒトでも最初は「ん?何じゃ?」って思う事はあるけど、それとて30分も乗れば「ああ、こんな感じなんだな」ってスグに慣れてしまうはずです。

<オフ車の素人がオフロードバイクのテクニックが皆無な...続きを読む

Qint select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)について

見当違いな質問かもしれませんがお願いします。

複数のソケットを監視する際にselectを使う場合のことですが、
selectの動作と戻り値について疑問があります。

http://www.linux.or.jp/JM/html/LDP_man-pages/man2/select.2.html
ここを参照すると、selectの戻り値は
「更新された 3 つのディスクリプタ集合に含まれているディスクリプタの数 (つまり、 readfds, writefds, exceptfds 中の 1 になっているビットの総数) を返す。」
とあります。
私の中でselectは登録してあるFDのうち、一つでも動きがあれば即座にselectを抜けるもの、という認識です。
この認識だとreadfds,writefdsが引数として与えられているとしても、
どちらかのfd_setのうち、一つでも動きがあればselect文は
抜けてしまうことになります。とすると、戻り値として
「readfds, writefds, exceptfds 中の 1 になっているビットの総数」
は常に1ということになってしまいます。しかし、総数というからには
複数同時に1になることもあるはずです。

私の認識が間違っているとは思うのですが、どう間違っているのかわかりません。
select文の動きについて詳しく教えていただけないでしょうか。
または良いページがあれば教えてください。

見当違いな質問かもしれませんがお願いします。

複数のソケットを監視する際にselectを使う場合のことですが、
selectの動作と戻り値について疑問があります。

http://www.linux.or.jp/JM/html/LDP_man-pages/man2/select.2.html
ここを参照すると、selectの戻り値は
「更新された 3 つのディスクリプタ集合に含まれているディスクリプタの数 (つまり、 readfds, writefds, exceptfds 中の 1 になっているビットの総数) を返す。」
とあります。
私の中でselectは登録してあるFDのうち、一つでも動きが...続きを読む

Aベストアンサー

>私の中でselectは登録してあるFDのうち、一つでも動きがあれば即座にselectを抜けるもの、という認識です。
この認識はあっています。
しかし、selectを呼び出す以前にOKになっているFDがあれば、それらは全てビットがONになります。

話しを簡単にする為に、受信のみのソケットを3つ作成したとします。
これらの3つのソケットに向けて相手が電文を送ったとします。
その状態でまだ、こちらはselectを呼び出さずにいます。しばらくしてから、selectを呼び出すと、selectは即座にリターンし、3つのビットが一度にONになっているはずです。
一方、相手が、一切電文を送ってない状態で、selectを呼び出した場合は、何れかのビットがONになればリターンするので、そのときは、貴方が想像しているように
ビットの総数は1になる可能性が高いです。
従って、相手が電文を送る前にselectを呼び出すか、送った後にselectを呼び出すかは、その時のタイミングにより異なります。従って、ビット数の総和が常に1であるとは、考えない方が無難です。(1つのソケットしか使用しない場合は別ですが・・・)

>私の中でselectは登録してあるFDのうち、一つでも動きがあれば即座にselectを抜けるもの、という認識です。
この認識はあっています。
しかし、selectを呼び出す以前にOKになっているFDがあれば、それらは全てビットがONになります。

話しを簡単にする為に、受信のみのソケットを3つ作成したとします。
これらの3つのソケットに向けて相手が電文を送ったとします。
その状態でまだ、こちらはselectを呼び出さずにいます。しばらくしてから、selectを呼び出すと、selectは即座にリターンし、3つのビ...続きを読む

Qオフロードバイクの街乗りメリット

オフロードバイクの街乗りメリット

オフロードバイクを街乗りメインにして乗るのは邪道ですか?やはり林道メインでしょうか。

また街乗りでオフロードバイクに乗ることでオンロードバイクにはない、メリットはありますか?

ヤマハセローがとても気になっています。
よろしくお願いします。

Aベストアンサー

街乗りこそ オフ車です 街中は コンクリートジャングルですから
車体がスリム=すり抜けが楽 ステアの位置が高い=すり抜け時四輪のミラー擦らない
ステアの切れ角が大きい=わき道にすぐ入れる 
減速比が低い=スタートダッシュが良い 全般に着座位置が高い=前方視界が良い 
爆窃団の標的になり辛い 万が一コケても レバーやミラー程度で済む

 オマケとして 多少傷があったほうが オフ車ぽく見える

こんなトコデスガ

Q&str[n]とpstr + nと&pstr[n]

あるプログラミングの本で

&str[n]
pstr + n
&pstr[n]

は同じだと書いてあり、考えたのですが、
上の二つはstr[n]のアドレスを表しているとしても、
三つ目はstr[n]のポインタのアドレスを表していると思うのですが
どこが間違っているのでしょうか?教えてください。

Aベストアンサー

>本にも突然でてきているのでよくわからないのですが・・・。

よくわからないもの同士が同じかと聞かれても、よくわからないというのが答えです。
本当に、突然出てきているのなら、そんな本は捨てましょう。

Qオフロード車でオンロードを走るメリットとは?

オフロード車でオンロードを走るメリットとは?
どのような所なのでしょうか?普通の道路でよくオフロードバイクを見るので疑問に思いました。

Aベストアンサー

オンもオフも混ぜて10数台乗り継いでる人間です。

オフロード車で走る「メリット」もありますが、あえてオフロード者に乗る人は「魅力」に魅かれている場合も多いです。


・軽量な車体でとり回しが楽
例えば250ccですとオンロードバイクが140kg~に対して
オフロードバイクはせいぜい重くても~120kgぐらいです。
住宅街を抜けての通勤や買い物に行くときは本当に便利です。
後、オンロードバイクのような高回転でパワーを出すものと違い
低回転から力強く足を運んでくれるのでキビキビ走ってくれます
それに全体的に見て燃費のいいバイクも多いです。


・高い目線
ミニバン人気の一つ「車体からの視野の広さ」と同じ部分があります
オンロードバイクのように前傾姿勢になりにくいので目線が高く遠くまで見えます。
街中をレーサーレプリカで走ると首が疲れます(笑


・週末のツーリングにもってこい
気合を入れて峠に通うような人でなければオフロード車の走行性能で十分です
尚且つ標準キャリアのバイクが多くて箱をつけてても「ツーリングライダー」として様になります
オンロードバイクはツアラーでないと、なかなか「箱付き」は不恰好ですから…。


・車体の整備性のよさ、頑丈な作り
単気筒のバイクが多く、パーツ点数の少なさからDIY整備が非常に楽です
ある程度バラす前提があること(泥が色んなところに入り込みますので)から
基本的には各部パーツのはずし方も複雑でなく、簡単なものが多いです
また、林道などでコケることも前提に作ってますので道路で緊急回避でコケたとしても
大体の場合はそのままなにごともないようにエンジンかけて走ってけれます。
オンロード車はすぐハンドル曲がったとかタンクヘコんだとか外装に色々気を使いますから…。

・二人乗りが楽
意外なメリットで、私の場合はこれがありました。
一つ前の型のKLXに乗っていたのですが、シートがちょうどよい弾力で
それなりに幅広、かといってまたを開くわけでもないので
女の子を乗せて「このバイクが一番いい」といわれました
アメリカンは密着できず背もたれ便りになるのが逆に怖かったそうです。


私がオフロードに乗っていて感じたメリットはこんなところです。

質問主さんのように「なんで?」と感じる方やカッコ悪いという方も多く
私も当初はそう感じていたのですが、次第にはまっていきました
無骨なデザインやタフで頼れる相棒という感じで、とても信頼がおけます。
オフロード好きって、本当にバイク好きそう…と、自分に酔いしれてた時期もありました(笑

オンもオフも混ぜて10数台乗り継いでる人間です。

オフロード車で走る「メリット」もありますが、あえてオフロード者に乗る人は「魅力」に魅かれている場合も多いです。


・軽量な車体でとり回しが楽
例えば250ccですとオンロードバイクが140kg~に対して
オフロードバイクはせいぜい重くても~120kgぐらいです。
住宅街を抜けての通勤や買い物に行くときは本当に便利です。
後、オンロードバイクのような高回転でパワーを出すものと違い
低回転から力強く足を運んでくれるのでキビキビ走ってくれます...続きを読む

Qfp = fopen(argy[1], "r");の[1]の意味は

https://oshiete.goo.ne.jp/qa/8940272.html
 の11行目に
fp = fopen(argv[1], "r");の[1]の意味が分かりません。
試したいのですが、ソフトがうまく動きません
 よろしくお願いいたします。

Aベストアンサー

前の例題も読みました。

大分苦戦しているようですが、配列については理解が進みましたでしょうか?
お答えしますと、最初のパラメータ文字列が代入されています。

古いC言語の約束でして大変有名なものです。

コマンドラインコンソールから実行ファイル名を書いて、
パラメータをスペースで区切って指定したとします。

このパラメータ文字列が[1]以降に入ります。
例として、"test"と言う名前の実行ファイルがあったとします。

例)> test test1 test2 3 4

このようにコマンドラインから入力し実行すると、

argc = 5
argv[0] = "test"
argv[1] = "test1"
argv[2] = "test2"
argv[3] = "3"
argv[4] = "4"

と文字列が入ってきます。

以下はサンプル。

void main( int argc , char *argv[])
{
if( argc < 2 )
{
// パラメータ指定がなかった場合の表示
printf( "test に続けて4つまでパラメータを入力できます\n");
exit(0);
}
if( argc > 5 )
{
 // パラメータが5つ以上あった場合の表示
printf( "5つ以上のパラメータは受け付けません\n");
exit(-1);
}

// 正常ルート
printf( "パラメータの数は%d個ですね?ニヤッ\n", argc-1);
printf( "最初のパラメータは%sでしょ?\n", argv[1]);
printf( "残りはargv[2]以降ですが、面倒なので表示しません\n");
}

と言う具合に、引数を活用できます。argv[0]には、実行ファイル名が入ります。
argc は実行ファイルの名前も含めてカウントされます。

プログラムによっては必要な引数の数が変わりますし、
ユーザーのコマンドラインからの入力ミスなどでパラメータがなかったり、
必要なパラメータが不足していたりしますので、
argcとargvを使って最初にシンタックスエラーチェックをするのが常道です。

実行ファイル名の指定がなく、プログラムが実行されることはないと思われます
から、argcは1以上の値になります。

argc, argvの活用は、
実行コマンドを手打ちで打ち込むコンソール形式でよく用いられる基本的な
アプリケーションの開発手法です。

ご質問の箇所は、
第一パラメータにプログラム内で読み込むファイルのファイル名を指定してるの
でしょう。(よくあります)

しかし、Windowsなどのウィンドウを使用するアプリケーションは、
これとは違っておりますので注意が必要です。
(C言語とは別に、Windowsに特化した開発ノウハウの勉強が必要です)

Windows系で上記の様な基本的なプログラムを作成する場合は、
プロジェクトの作成時に(VisualStudioなどで)コンソールアプリケーション
を選んで作成します。実行時にコンソールが開きます。

Linuxの場合は、コンソールがデフォルトになっているでしょうから、
(特殊な設定がなければ)そのまま作成できます。

テキストエディタでソースを記述し、gcc などでコンパイルします。
実行形式ファイルが出来ていれば、想定どおりの動作をするでしょう。

ファイルの読み込みが出来るようになったら、
ファイルの内容を書き換えて保存したり、
ファイル名を変えたり、
ディレクトリ内のファイルを全て表示したり、
ファイル内に含まれる文字列を検索し、該当するファイルをリストしたりなど、

有用なサンプルプログラムを沢山作って練習します。

ファイルを読み込む先は、char型の配列でバイトサイズのメモリーとして確保
します。メモリーと変数の関係を充分に理解することをお勧めします。
殆どのプログラムは、このメモリーの確保やメモリーサイズの計算と格闘する
場合が多くなるからです。

バイナリー形式のファイル(すべてはバイナリー形式として良いのですが)に
ついて理解が深まった後は、
bmpの画像ファイル、wavなどの音声ファイルをあけて、
これの中身を書き換えて遊びます。

特にwavファイルは、音量の変更や周波数フィルタなども掛けれますので、
メモリ、配列、ファイルの関係を(焦らずに)ゆっくり理解するだけで、
今の知識レベルでも面白いことが沢山出来ます。

以上、ご参考に成れば。

前の例題も読みました。

大分苦戦しているようですが、配列については理解が進みましたでしょうか?
お答えしますと、最初のパラメータ文字列が代入されています。

古いC言語の約束でして大変有名なものです。

コマンドラインコンソールから実行ファイル名を書いて、
パラメータをスペースで区切って指定したとします。

このパラメータ文字列が[1]以降に入ります。
例として、"test"と言う名前の実行ファイルがあったとします。

例)> test test1 test2 3 4

このようにコマンドラインから...続きを読む

QKSR-(2)のオフロードタイヤ

KSR-(2)に合うオフロードタイヤはあるのでしょうか??
会社の先輩に、『オフロードコースを走ろう!』と誘われたのですが
純正タイヤは、オンロード・・・
『オフロードタイヤはあるのかな??』と言う疑問に・・・
ご存知のかた、アドバイスよろしくお願いします。

Aベストアンサー

オフロードタイヤをはいたKSRを見た事があるので、あると思いますよ。

公道不可でもいいならミニモト用のモトクロタイヤという手もあります。
http://www.inoac.co.jp/irc/mc/products/jr_kids_mx.html
他にも各社から出ています。
カタログサイズでは入りそうだけど、ブロックハイトがあるから、実際はどうかな?
あんまり勧めないけどね。
バイク屋さんにある販売店用のカタログにはいろいろ載っているので、
なじみの店で見せてもらうといいですよ。

参考URL:http://www.inoac.co.jp/irc/mc/products/jr_kids_mx.html

Qfor(s=p; *p; p++)の*p(ポインタ)の意味

for(s=p; *p; p++)の*p(ポインタ)の意味
C言語初心者です。
今ポインタを勉強しているのですが、
for文で上記のようなものが出てきて、意味が分からず困っています。
*pで*p != NULL と同じような意味になるみたいなのですが…。
どうしてそのような意味になるのでしょうか?

ちなみにsとpはポインタで、
sには配列(入力した文字列)の先頭アドレスが入っています。
pは文字列を指していて○○○○○NULL ←になるから上記のような条件で
回るんだろうなぁとはなんとなく考えているのですが。

Aベストアンサー

念のため:
ヌルポインタは「ビットパターンとして」0 じゃないかもしれませんが, ソースプログラムにおいて「ポインタが要求される場面」で「0」とあれば, それは「ヌルポインタ」です.
もうちょっと厳密に書くと「整定数 0」はヌルポインタに変換される.


人気Q&Aランキング

おすすめ情報