2011-06-21 7 views
0

これは本当に私を得ています。私はいくつかの追加機能も追加していますが、私がしようとしていることはリンクリストを実装することです。まず、いくつかのコード:ポインタの割り当てがプログラムのストールの原因となる

#include <stdio.h> 
#include "host.h" 
#include "misc.h" 
#include "machine.h" 

struct miss_pile{ 
    md_addr_t tag; 
    unsigned int isCon; 
    char block_type; 
    char culprit_type; 
    struct miss_pile * next; 

}*head=0, *linkPtr, *tail=NULL, *newLink; 
typedef struct miss_pile mp; 

void add_beg(md_addr_t new_tag/*int new_tag*/, char blk_type, char evicter_type){ 

    newLink = (mp *)malloc(sizeof(mp)); 
    newLink->tag = new_tag; 
    newLink->block_type = blk_type; 
    newLink->culprit_type = evicter_type; 
    newLink->isCon = 0; 

if (head == NULL){ 
    head=newLink; 
    head->next=NULL; 
    head->tag = new_tag; 
    head->block_type = blk_type; 
    head->culprit_type = evicter_type; 
    head->isCon=0; 
    } 
else if (head != NULL) 
    { 
    newLink->next=head; 
    head = newLink; 
    } 
} 

私はプログラムは、私はこのコードを除外すると、プログラムは正常に実行されますが、もちろんその

head=newLink;

を停止するようだところ、この行があると判断しましたかなり重要なコード。どのような助けや洞察力があれば幸いです。

注意しておきたいことですが、プロセッサはプログラムが「座っている間」100%のままです。また、リストに追加するプログラムは、SimpleScalarの「sim-cache」シミュレータです。

+1

どのシステムを実行していますか?私はLinux上でgdbのようなデバッガで、あるいはWindows上のビジュアル・スタジオの中のビルトインでそれを実行しようとします。 GDBの場合は、-gフラグを使用してプログラムをコンパイルします。 gdbにはたくさんのチュートリアルがありますので、私は細部まであなたを退屈させません。 –

+0

私はUbuntu 10.10を仮想マシンで実行しています。 gdbを実行するといくつかの便利な情報が得られ、リスト検索ループのいくつかに詰まっているように見えます。これはちょうど時間の集中的な仕事かもしれませんか?このリストは数十万に達する可能性が非常に高いです。しかし、リストを短く保つべきsimplescalarの命令の数を制限しても効果はありません。 – morgan

+0

私は、誰かがすぐに来て、「malloc()の結果をキャストしないでください」と言っている気がします: –

答えて

1

まず、私はあなたがこのようなあなたの機能を簡素化することができると思います。

void add_beg(md_addr_t new_tag/*int new_tag*/, char blk_type, char evicter_type){ 

    newLink = (mp *)malloc(sizeof(mp)); 
    newLink->tag = new_tag; 
    newLink->block_type = blk_type; 
    newLink->culprit_type = evicter_type; 
    newLink->isCon = 0; 
    /* on the first call, head is NULL, and it's exactly what we want */ 
    newLink->next = head; 
    /* then head point to the new element */ 
    head = newLink; 
} 

は、第二に、私はあなたのバグがどこかにあなたのコード内から来ている、と対話するいくつかの他の関数であってもよいことはかなり確信していますあなたのグローバル変数の頭ですか?またはそれはもちろん何か他のものかもしれません:)

+0

ああ、あなたは正しいですが、問題は私のコードのどこかにあります。私は検索ループがうまく設計されていませんでした。 \t linkPtr = head; 一方(linkPtr = NULL!) \t {\t IF(linkPtr->タグ= fnd_tag!)次 \t \t {linkPtr = linkPtr->;} 他\t {ブレーク;}} \t – morgan

関連する問題