2017-04-14 16 views
1

私はこの中でC.に基本的なスタックを使用するプログラムを作成しています、私は見出しに定義された2つの構造を有する:Cデータ構造エラー

  1. 構造という名前の文字列を持つノードと、前へのポインタをメンバーとしてのノード。
  2. メンバーは最後のノードへのポインタを持つStackという名前の構造体です。ここで

    は私のヘッダファイルでこれらの構造の定義は以下のとおりです。

    CreateStack:この関数は、スタックを作成します(等価

    #include <stdio.h> 
    #include <stdlib.h> 
    typedef struct Node { 
    const char* string; 
    struct Node *prev; 
    }; 
    
    typedef struct Stack { 
    size_t sizeOfStack; 
    size_t sizeOfElem; 
    struct Node *last; 
    }; 
    

一つの方法は私のエラーを与えることCreateStack()でありますコンストラクタ)。

(A)名称:CreateStack

(b)の戻り値の型:ヒープに割り当てられたスタックへのポインタ。ここで

は私の実装

Stack* CreateStack() { 
     Stack* stack = malloc(sizeof(*stack)); 
     if (stack == NULL) { 
      return NULL; 
     }//end of if 
     stack->sizeOfElem = 0; 
     stack->sizeOfStack = 0; 
     stack->last = NULL; 
     return stack; 
    }//end of CreateStack 

である。しかし、コンパイラはこれを吐き出している:

エラー: 'スタック{別名構造体スタックが}' = '最後の' stack->最後という名前のメンバーを持っていませんノード;

エラー: 'Stack {aka struct stack}'には 'last'という名前のメンバーはありません node-> prev = stack-> last;

エラー: 'Stack {aka struct stack}'には 'last'という名前のメンバーはありません Node * node = stack-> last;

誰かがこの問題をここで指摘できれば、私は大いに感謝します。なぜ私は最後のことが物事ではないと言っているのか混乱していますが、他の構造と同じように定義されているフラグはフラグを立てません。ありがとう。

+0

あなたのコンパイルエラーを使用すると、表示されたコードではありません。あなたのtypedefsは不完全です。 – aschepler

+0

"デバッグのヘルプを求める質問(「なぜこのコードは動作しませんか?」)には、目的の動作、特定の問題またはエラー、および問題そのものを再現するために必要な最短コードが含まれている必要があります。参照:[**最小限で完全で検証可能なサンプルを作成する方法**](http://stackoverflow.com/help/mcve)」を参照してください。 –

+0

@ascheplerはいそれは長いコードなので、このエラーは構造体を使用するメソッドに固有のように見えないので、構造体にエラーがあると推測します。私は構造そのものを提供しました。すべてのエラーは "最後"を存在しないものとして参照します。 –

答えて

1

型の名前を定義していないので、typedefステートメントは不完全です。以下を書いてください。

typedef struct Stack { 
    size_t sizeOfStack; 
    size_t sizeOfElem; 
    struct Node *last; 
}Stack; 

Stackstruct Stackと等価である型を定義注端でStack、。

+1

'Stack * stack = malloc(sizeof(* stack))'はOKです。 – PSkocik

+0

@PSkocik:right;私はタイプミスのために*スタックを保持し、OPは '* Stack'を意味すると仮定しました。 –

1

はのtypedefを修正して、それがコンパイルされます:

#include <stdio.h> 
#include <stdlib.h> 
typedef struct Node { 
const char* string; 
struct Node *prev; 
} Node ; 

typedef struct Stack { 
size_t sizeOfStack; 
size_t sizeOfElem; 
struct Node *last; 
} Stack; 

Stack* CreateStack() { 
    Stack* stack = malloc(sizeof(*stack)); 
    if (stack == NULL) { 
     return NULL; 
    }//end of if 
    stack->sizeOfElem = 0; 
    stack->sizeOfStack = 0; 
    stack->last = NULL; 
    return stack; 
}//end of CreateStack 
+0

彼のコードが構文エラーではないのはなぜですか? 'typedef'は本当に名前なしで許可されていますか?それは何をするためのものか? – Barmar

+0

@Barmar構文エラーを生成するメカニズムです。 :) – PSkocik