2

このリンクされたリストと宣言を含む C プログラムの header.h ファイルがあります。

typedef struct _seg
{
    int bits[256];        // # of bits in array = 256

    struct _seg *next;    // link to the next segment
} seg;  

EXTERN seg *head;         // this points to the start of the linked list

main.cの には、次のものがあります。

seg * p;
head = NULL;
...
for (i = 0; i < N; i++) {    // N is a parameter; irrelevant for this problem
    p = ( seg *) malloc(sizeof (seg));    // make a new segment
    p->next = head;        // add the new segment to the list
    head = p;
}

ファイルclearAll()から関数を呼び出します。関数には次のものがあります。 main.cfunctions.c

void clearAll() {
    int i;
    for (i = 0; i < 256; i++) {
        p->bits[i] = 0;
    }
}

ビット配列のすべてのビットをクリア (0 に設定) できるようにしたいと考えています。コンパイルするたびに、ステートメント'p' undeclared (first use in this function)があってもそれを示すエラーが発生します。#include "header.h"リンクされたリストとその中の配列を参照してアクセスできるようにしたいだけです。

私はこれを正しく行っていますか?

4

2 に答える 2

2

[コメントの新しい情報に基づいて明確にするために編集]

エラーの正確な理由:変数pは別の関数のローカル変数です。この場合、pはその関数の実行中にのみ (スタック上に) 存在するため、 内では未定義clearAllです。

推奨事項: @ErikN が示唆するように、リストの先頭を に渡しclearAllます。別のモジュールでリスト ヘッドにストレージを割り当てて、それをグローバル変数にしました。これは機能しますが (未解決であるというコンパイラの警告が表示される場合がありますが、リンカーによって解決されます)、この方法で行うのは不必要な結合です。

また、clearAllリストの残りの部分ではなく、ヘッド ノードでのみ機能するようです。そのため、おそらくリスト内の他のノードも同様に歩きたいと思うでしょう。

于 2013-05-03T16:55:51.913 に答える
0

私がこれを正しく読んでいれば、ノードをclearAll引数として関数に渡す必要があると思います。関数シグネチャを変更して、パラメーターとして受け入れるようにします。

void clearAll(seg* listHead);

この宣言を含むヘッダーをclearAllmain.c ファイルにインポートします。このようにして、特定のリストだけでなく、任意のリストに対して操作できる、より一般的な関数が得られます。

于 2013-05-03T16:55:36.787 に答える