2016-03-23 23 views
1

私はこの質問/エラーを多く見ましたが、何が間違っているのか分かりません。私はスレッドに関するいくつかの情報を含む構造体を作成し、基本的にはスレッドを作成するたびにいくつかの値(スレッド番号、現在のスレッドなど)を割り当てたいと思っています。スレッドはこのエラーとは関係ありません。これまでのところ、私はちょうど私の構造体を動作させるためにしようとしていますが、私はエラー:不完全な型へのポインタの参照

thread->num=num;

の一部に不完全な型へのポインタをdeferencingためエラーを取得しておくと、それはメモリ割り当てエラーですか?または何か手がかり? は、ここに私のコードです:

のmain.c //私にすべてのエラーを与えるものではありません

struct sPRIME_THREAD *new_thread = create_thread(1,0,0,20); 
printf("Thread Info:\n"); 
print_info(new_thread); 

がheader.h

#include <stdio.h> 
#include <assert.h> 
#include <stdlib.h> 
#include <string.h> 

/* Macro definitions */ 
#define MAX_THREADS  5 // Maximum number of prime search threads 

/* Data types */ 
typedef struct    // Prime search thread data 
{ 
    unsigned int num;  // Prime search thread number 
    unsigned int current; // Number currently evaluating for primality 
    unsigned int low;  // Low end of range to test for primality 
    unsigned int high;  // High end of range to test for primality 
} sPRIME_THREAD; 

/* Shared global variables */ 
extern sPRIME_THREAD primeThreadData[MAX_THREADS]; // Prime search thread data 
int numThreads;          // Number of prime search threads 

struct sPRIME_THREAD *create_thread(unsigned int num, unsigned int current, 
            unsigned int low, unsigned int high) 
    { 
     struct sPRIME_THREAD *thread = (sPRIME_THREAD *)malloc(sizeof(sPRIME_THREAD)); 

     thread->num = num; 
     thread->current = current; 
     thread->low = low; 
     thread->high = high; 

     return thread; 
    } 

void destroy_thread(struct sPRIME_THREAD *thread) 
{ 
    free(thread); 
} 

void print_info(struct sPRIME_THREAD *thread) 
{ 
    printf("Num: %d\n", thread->num); 
    printf("Current: %d\n", thread->current); 
    printf("Low: %d\n", thread->low); 
    printf("High: %d\n", thread->high); 
} 
+1

'struct sPRIME_THREAD'は未定義です。 'typedef struct {...} sPRIME_THREAD; 'を実行することによって、' sPRIME_THREA'型を定義するだけです。 – alk

+0

私はやってみた typedef struct sPRIME_THREAD \t {...} sPRIME_THREAD; と私は多くの複数の定義エラーを取得します。 –

答えて

0

struct sPRIME_THREADtypedef

チェックが定義されていない参照してください。 typedef struct {...} sPRIME_THREAD;を実行すると、匿名のstructがタイプsPRIME_THREADと定義されます。

このドロップにtypedefを

typedef struct    
{ 
    unsigned int num;  
    unsigned int current; 
    unsigned int low;  
    unsigned int high;  
} sPRIME_THREAD; 

を修正しstructタイプを定義

struct sPRIME_THREAD    
{ 
    unsigned int num;  
    unsigned int current; 
    unsigned int low;  
    unsigned int high;  
}; 

により、常に型に参照のうえときstruct sPRIME_THREADを使用します。

+0

これまでにやったことがありますが、さらに多くのエラーがありました。例: 'ilopez_prime.h:24:8:エラー: 'sPRIME_THREAD'タイプの名前が不明です extern sPRIME_THREAD primeThreadData [MAX_THREADS]; ilopez_prime.h:関数 'create_thread': ilopez_prime.h:30:35:エラー: 'sPRIME_THREAD'はここでは宣言されていませんstruct sPRIME_THREAD * thread =(sPRIME_THREAD *)malloc(sizeof(sPRIME_THREAD)); ' –

+0

' struct'型は 'sPRIME_THREAD'だけでなく' struct sPRIME_THREAD'です。 – alk

+0

ああ、あなたのコメントが表示されます。私の謝罪は、実際にそれを修正しました。どうもありがとうございました :) –

0

あなたがtypedefを使用している場合は、structキーワードを使用する必要はありません。この

/* Data types */ 
typedef struct    // Prime search thread data 
{ 
unsigned int num;  // Prime search thread number 
unsigned int current; // Number currently evaluating for primality 
unsigned int low;  // Low end of range to test for primality 
unsigned int high;  // High end of range to test for primality 
} sPRIME_THREAD; 

/* Shared global variables */ 
extern sPRIME_THREAD primeThreadData[MAX_THREADS]; // Prime search thread data 
int numThreads;          // Number of prime search threads 

sPRIME_THREAD *create_thread(unsigned int num, unsigned int current, 
           unsigned int low, unsigned int high) 
{ 
    sPRIME_THREAD *thread = (sPRIME_THREAD *)malloc(sizeof(sPRIME_THREAD)); 

    thread->num = num; 
    thread->current = current; 
    thread->low = low; 
    thread->high = high; 

    return thread; 
} 

void destroy_thread(sPRIME_THREAD *thread) 
{ 
free(thread); 
} 

void print_info(sPRIME_THREAD *thread) 
{ 
printf("Num: %d\n", thread->num); 
printf("Current: %d\n", thread->current); 
printf("Low: %d\n", thread->low); 
printf("High: %d\n", thread->high); 
} 
+0

それを取り除くだけで、エラーの束がスローされます –

+0

'extern'を削除してどこにも定義されていないことを確認します –

+0

@LilithDeficiency関数で' struct'キーワードを取り除くことで、プログラムは正常にコンパイルされます –

関連する問題