2015-05-09 88 views
1
struct Users{ 
     int id; 
     char msg[]; 
}; 

int nUsers; 

struct Users users[10]; 

void connectUser(struct Users user){ 
    if(nUsers<10){ 
     for(int i=0;i<10;i++){ 
       if(users[i]==NULL){ 
         users[i]=user; 
         printf("user %d connected!\n", user.id); 
         nUsers++; 
       } 
     } 
    }else 
     printf("number of users reached!\n"); 
} 

這是我的代碼,當我嘗試編譯,自帶錯誤:惱人的問題與結構用C

[[email protected] ~]$ gcc -std=c99 socketserver.c -o socketserver 
socketserver.c: In function ‘connectUser’: 
socketserver.c:24: error: invalid operands to binary == (have ‘struct Users’ and ‘void *’) 
socketserver.c:21: note: The ABI of passing struct with a flexible array member has changed in GCC 4.4 
socketserver.c: In function ‘disconnectUser’: 
socketserver.c:37: error: incompatible types when assigning to type ‘struct Users’ from type ‘void *’ 

每次我嘗試編譯,這些錯誤出現。你們能幫我嗎?

+0

刪除'如果(用戶[I] == NULL)'。另一個錯誤是在'disconnectuser'中。哦。從'disconnectuser'中刪除'users [i] = NULL'。 'NULL'用於指針。你不能用'NULL'分配/比較'users [i]'(哪個*不是一個指針)。 –

回答

3

當說我i = 0時的用戶類型是Struct Users。它不是一個指針,所以不能有NULL的值。這是你的編譯器抱怨的。當它不能時,你正在檢查值是否爲NULL。比較指針時只檢查NULL。

// you already check here that you do not exceed bounds of array - 10 
for(int i=0;i<10;i++){ 
    users[i]=user; 
    etc 
1

正如@CoolGuy所注意的那樣,問題歸因於if(users[i]==NULL)。由於usersstruct Users的數組,因此users[i]struct Users,並且struct Users不能與NULL相比較。

指向struct Users的指針,聲明爲struct Users*可以與NULL進行比較。

現在發現問題了,該如何解決?

  • 直接的答案是使用約定。例如,假設users[i].id==0表示該用戶已斷開連接。在節目開始時,用戶必須進行初始化:

    for(i=0;i<10;i++){ 
        users[i].id=0; 
    } 
    

    當用戶連接空閒插槽必須找到:

    for(int i=0;i<10;i++){ 
         if(users[i].id==0){ 
           users[i]=user; 
           printf("user %d connected!\n", user.id); 
           nUsers++; 
           break; 
         } 
        } 
    

    不要忘了break聲明:用戶必須是隻連接一次! 由於用戶是diconnected,users[i].id=0;

  • 另一種選擇是聲明struct Users *users[10];。因此users是一個指向struct Users的指針數組。再次,這些指針必須被初始化:

    for(i=0;i<10;i++){ 
        users[i]=NULL; 
    } 
    

    作爲一個新的用戶連接,一些存儲器必須被分配或必須提供一個有效的指針。

    for(int i=0;i<10;i++){ 
         if(users[i]==NULL){ 
           users[i]=malloc(1*sizeof(struct user)); 
           if(users[i]==NULL){printf("malloc failed\n");exit(1);} 
           users[i]->id=user.id; 
           printf("user %d connected!\n", user.id); 
           nUsers++; 
           break; 
         } 
        } 
    

    使用users[i]=&user;不會是一個好主意,因爲user是一個局部變量:它不存在了功能connectUser(struct Users user)的。如果這樣做,它可能會在別的地方觸發未定義的行爲。

    當用戶斷開連接時,存儲器必須被釋放並且指針必須被設置爲NULLfree(users[i]);users[i]=NULL;

+0

@CoolGuy:謝謝!應該是'if(users [i] .id == 0)' – francis

+0

感謝您的答案兄弟!所以,我會嘗試在main()函數中解釋一下菜單(連接,斷開,存入,檢索,查詢)......這個程序是一種信使,所以,當你選擇連接,你將被連接到一個「聊天室」,所以,執行connect()函數,並且每個用戶在聊天室中輸入時都會有一個ID ...所以,我想要的東西,連接時插入此用戶一個矢量(聊天室)併爲他提供一個ID,當你想斷開連接時,從聊天室刪除等......所以,你有更好的解決方案嗎?或者你認爲這足夠了? – JamesThiago

+0

我在想你的解決方案,但我雖然只是在連接時初始化用戶... – JamesThiago