2016-10-19 14 views
3

配列内の2つの構造体を交換するプログラムを作成しました。コードは次のようになります。バイナリ*に無効なオペランドがあります( 'ab {aka struct a}'と 'ab * {aka struct a *}')

#include <stdio.h> 
struct a { 
    char *name; 
    int id; 
    char *department; 
    int num; 
}; 
typedef struct a ab; 

void swap(ab *, ab *); 

int main(int argc, char *argv[]) 
{ 
    ab array[2] = {{"Saud", 137, "Electronics", 500}, {"Ebad", 111, "Telecom", 570}}; 
    printf("First student data:\n%s\t%d\t%s\t%d", array[0].name, array[0].id, 
      array[0].department, array[0].num); 

    printf("\nSecond Student Data\n%s\t%d\t%s\t%d\n", array[1].name, array[1].id, 
      array[1].department, array[1].num); 

    swap(&array[0], &array[1]); 
    // printf("") 
    return 0; 
} 

void swap(ab *p, ab *q){ 
    ab tmp; 
    tmp = *p 
    *p = *q; 
    *q = tmp; 
} 
それがエラーを与えるコンパイルで

newproject.c: In function ‘swap’:
newproject.c:26:3: error: invalid operands to binary * (have ‘ab {aka
struct a}’ and ‘ab * {aka struct a *}’)
*p=*q;

間違いは何ですか?

+2

エラーが報告される行にはなく、前の行のいずれかに表示されることがあります。前の行を見て、それが大丈夫かどうかを見てください。例えば、セミコロンがないかもしれません。 –

+0

[なぜコンパイラがセミコロンを見つけられないのですか?](http://stackoverflow.com/questions/40135392/why-doesnt-compiler-report-missing-semicolon) –

答えて

9

26行目(前の行)の最後にセミコロンがありません。これにより

tmp=*p 

、コンパイラは、文全体は以下のように解釈されることを意味し、次の行が同じ文の一部であると考える:

tmp=*p * p = *q; 

*は、の乗算と見られています二つのオペランド - *pp - エラーメッセージがどこから来るのである:

invalid operands to binary * (have ‘ab {aka struct a}’ and ‘ab * {aka struct a *}’)

(ので、はタイプabであり、pはタイプab *です。

関連する問題