2011-10-29 30 views
3

先ず、私はC言語の新機能で、Cを使用しなければならないプログラムに投げ込まれました。今では私の問題はポインタと関係していると思いますが、リストを印刷しようとすると(私が正しい順序でプログラムを保存していることを確認するために、私のプログラムが2回目のループの後でクラッシュする)印刷中の無限ループ

これは私の挿入機能で、必要最低限​​の時間で挿入します。ここに私の印刷がクラッシュ

void insertProcess(Process& process, Process* &head, Process* curr, Process* prev){ 
curr = head; 
if(head == NULL){ 
    head = &process; 
} 
else{ 
    prev = head; 
    while(process.timeNeeded > curr->timeNeeded){ 
     prev = curr; 
     curr = curr->next; 
    } 
    prev->next = &process; 
    process.next = curr; 
} 
} 

としてそれをテストすることと、リストを印刷する必要があり、私の単純なループである。これは、「アクセスVIOを与える前に数回実行されます読み込み場所 '

while(curr->next != NULL){ 
    printf("%s %i %i %i\n", process.processName, process.arrivalTime,  process.timeNeeded, process.priority); 
    curr = curr->next; 
} 

エラーがこれらのコードセグメントの1つにあると確信していますが、私は助けていただければと思います。

編集:最初のポスターの助けを借りて元の問題を修正しましたが、今は印刷する際に無限ループが発生します。私は順番に挿入しているので、最後の項目の後にNULLポインタを設定しないので、それが本当に確実だろう。それは正しいと思われますか?そうであれば、それを修正する方法はありますか?あなたの機能のおかげで再び

+1

'Process *&head'は有効ではありません。あなたは参照渡すことはできません。 – Dave

+0

これをC++コンパイラでコンパイルしていますか? – Dave

+0

私はCのことを知りませんでしたし、私のクラスが何をしていたのか、それを学ぶ時間も実際に私はよく知っていました。 Cを使用していた本当の理由は、C++のオブジェクト指向のプロパティを使用しないということでした。そして私はそれが正しいと思わなかったのですが、私が挿入を呼び出すたびに頭がリセットされていたことを知っていました。これを行う別の方法があれば、私はそれを喜んで修正します。 – user1019430

答えて

2

あなたは値でProcessを渡すと、この関数は、関数が終了したときに破壊されるProcessオブジェクトのローカルコピーで作業することを意味します。

あなたのコードはこのローカルコピーにリンクされています。したがって、関数を終了すると、リンクリストは既に破棄されたProcessオブジェクトを使用しています。

もう1つの問題は、挿入ポイントを検索するためにループするときに、挿入されたプロセスが最後のものである場合を考慮していないことです。この場合、ループではcurrがNULLになります。

+0

固定された1つの問題、私は見たことがありますありがとう。私は挿入した最後の項目を印刷する無限ループを取得していますが、おそらく問題を見つけることができます。 – user1019430

0

デバッガの使い方を学ぶ必要があります。 Linuxでは、-g(コンパイラによって生成されたデバッグ情報を取得する)とgccまたはg++に渡される-Wall(すべての警告を取得する)の両方でコンパイルする必要があります。その後、実行可能ファイルにgdbデバッガを使用することができます。