2012-04-19 9 views
0

を機能させる構造のポインタを渡して、私はこれをコンパイルするとき、私は私のstructの各部分がのラインに沿って、無効であるというエラーメッセージがたくさん出る:C - トラブル

sort.c:16: request for member 'last' in something not a structure or union

そして、私が使用例のためにだから私は、ポインタを悪用しなければならない

sort.c:18: warning: passing arg 2 of 'strcpy' from incompatible pointer type

...しかし、私はなぜわからない:strcpyの、エラーが読み。

私はDBrecord.hで定義されたstructを持っている:

typedef struct{ 
    int DBrecordID;   //ID for each entry, range 0-319 
    char *last;    //student last name 
    char *first;   //student first name 
    char studentID[8];  //student ID 
    int age;    //student age 
    class year;    //year in school 
    float gpa;    //GPA 
    int expGradYear;  //expected graduation year 
}DBrecord; 


#include <stdio.h> 
#include <string.h> 
#include "DBrecord.h" 

void bubbleSort(DBrecord **record, int numEntries, int sortChoice) { 
int i, j; 
char temp[100]; 

for(i=0; i<numEntries; i++) 
    for(j = 0; j < numEntries-1; j++) 
     switch(sortChoice){ 
      //sort by last name 
      case 1 : if(strcmp(record->last[j], record->last[j+1]) > 0){ 
        //swap the two elements 
        strcpy(temp, record[j]); 
        strcpy(record[j], record[j+1]); 
        strcpy(record[j+1], temp); 
        } 
      //sort by first name 
      case 2 : if(strcmp(record->first[j], record->first[j+1]) > 0){ 
        //swap the two elements 
        strcpy(temp, record[j]); 
        strcpy(record[j], record[j+1]); 
        strcpy(record[j+1], temp); 
        } 
      //sort by student ID 
      case 3 : if(atoi(record->studentID[j]) > atoi(record->studentID[j+1])){ 
        //swap the two elements 
        temp = record[j]; 
        record[j] = record[j+1]; 
        record[j+1] = temp; 
        } 
      //sort by age 
      case 4 : if(atoi(record->age[j]) > atoi(record->age[j+1])){ 
        //swap the two elements 
        temp = record[j]; 
        record[j] = record[j+1]; 
        record[j+1] = temp; 
        } 
      //sort by class 
      case 5 : if(record->class[j] > record->class[j+1]){ 
        //swap the two elements 
        temp = record[j]; 
        record[j] = record[j+1]; 
        record[j+1] = temp; 
        } 
      //sort by gpa 
      case 6 : if(atoi(record->gpa[j]) > atoi(record->gpa[j+1])){ 
        //swap the two elements 
        temp = record[j]; 
        record[j] = record[j+1]; 
        record[j+1] = temp; 
        } 
      //sort by expected graduation year 
      case 7 : if(atoi(record->expGradYear[j]) > atoi(record->expGradYear[j+1])){ 
        //swap the two elements 
        temp = record[j]; 
        record[j] = record[j+1]; 
        record[j+1] = temp; 
        } 
      default : break; 
} 

答えて

3

recordDBrecordへのポインタへのポインタであるので、record->last[j]はどんな 意味がありません。 recordのオブジェクト(ポインタへのポインタ)にはlastというフィールドはありません。フィールドはまったくなく、単なるポインタです。

おそらくrecord[j]->lastを意味し、lastのj番目のDBレコードのメンバーを取得します。等々。

+0

私はそれが私の言いたいことだと信じています...おかげで、今、お試しください。 – manalishi

2

テイクrecord->last[j]。これは(*record).last[j]に相当します。しかし*recordstructではありません。タイプはDBrecord*です。言い換えれば、ポインタを2度参照解除する必要がありますが、ポインタを一度参照解除しただけです。

+0

は、上に掲示されているものをやり直すための別の方法ですか?それはうまくいくように見えましたが、今は2つの異なるエラーがあります。「代入は、キャストのないポインタから整数を作ります」または「代入がキャストなしの整数からポインタを作る」 – manalishi

+0

まあ、 'DBrecord * * '。これは 'DBrecord'へのポインタの配列です。 'record [j]'は 'record'を一度参照解除し、' - > 'は第二の参照解除を行います。 –

+0

DBrecord.record [j] - > last'を入れる必要がありますか? – manalishi