2012-05-19 3 views
0
#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 


typedef struct user { 
    char *username; 
    struct sockaddr_in addr; 
} user; 

user* users; 

typedef struct room 
{ 
    char *roomname; 
    user* users; 
} room; 

room* rooms; 

int addToUsersArray(char *username) { 
    int i = 0; 

    for(; i<10; i++) { 
      if(users[i].username=='\0') { 
        users[i].username = username; 
       return 1; 
      } else if(strcmp(users[i].username, username) == 0) 
       return -1; 
    } 
    return -1; 
} 


void initUsersArray() { 
    users = (user*) calloc(10, sizeof(user)); 
} 

void initRoomsArray() { 
rooms = (room*) calloc(10, sizeof(room)); 
    int i =0; 
    for(;i<10;i++)  
     rooms[i].users = (user*) calloc(10,sizeof(user)); 
} 

int addToRoomsArray(char *roomname) { 
    int i = 0; 

    for(; i<10; i++) { 
      if(rooms[i].roomname=='\0') { 
        rooms[i].roomname = roomname; 
       return 1; 
      } else if(strcmp(rooms[i].roomname, roomname) == 0) 
       return -1; 
    } 
    return -1; 
} 

int addUserToRoom(char *roomname, user usr) { 
    int i = 0; 
    int k = 0; 

    for(; i<10; i++) { 
      if(rooms[i].roomname=='\0') { 
        rooms[i].roomname = roomname; 
        return 1; 
      } else if(strcmp(rooms[i].roomname, roomname) == 0) { 
      for(;k<10;k++) { 
       if(rooms[i].users[k].username==NULL) { //This line makes trouble 
        rooms[i].users[k] = usr; 
       } 
      } 
     } 

    } 
    return -1; 
} 


int main(int argc, char** argv) { 
    initUsersArray(); 
    initRoomsArray();  
    char *username = "Max"; 
    addToUsersArray(username); 
    username = "Ma1x"; 
    addToUsersArray(username); 
    printf("%s\n",users[0].username); 
    printf("%s\n",users[1].username); 

struct sockaddr_in addr; 
    addr.sin_family = AF_INET; 
    addr.sin_port = htons(4444); 
    addr.sin_addr.s_addr = inet_addr("127.0.0.1"); 

char *room = "sportchat"; 
addToRoomsArray(room); 
room = "berlinchat"; 
addToRoomsArray(room); 

    printf("%s\n",rooms[0].roomname); 
    printf("%s\n",rooms[1].roomname); 

user michi; 
michi.username = "michi"; 
michi.addr = addr; 

struct sockaddr_in addr2; 
    addr2.sin_family = AF_INET; 
    addr2.sin_port = htons(1234); 
    addr2.sin_addr.s_addr = inet_addr("127.0.1.1"); 

user willi; 
willi.username = "willi"; 
willi.addr = addr2; 

addUserToRoom(room,michi); 
addUserToRoom(room,willi); 


    return 1; 
} 

При запуске addUserToRoom (комната, michi) я получаю ошибку сегментации. Я все еще немного не уверен в использовании структур. При комментировании rooms[i].users[k] = usr; ошибка сегментации исчезает. Я использую gcc в системе unix. Gcc анализирует if-выражение с пустым блоком?массив структур в структуре

EDIT Как реализовать переменное количество пользователей и комнат? Я думаю, мне нужно использовать realloc. Но как? С уважением

+1

C++ оказывается настолько яснее в таких программах, как эти ... Возможно, вы забыли инициализировать какое-то поле. Слишком плохо, что вы используете unix, Visual Studio сломает вас в переменной, которая не инициализирована. –

+0

прежде всего, избегайте глобалов, сколько сможете! in "if (rooms [i] .users [k] .username == '\ 0')" rooms [i] .users - нулевой указатель, поэтому пропустил какую-то инициализацию где-то, но ваш код довольно грязный. – zmo

+0

Вы должны использовать класс функции 'strcmp' для сравнения строк * C * и не' == ' –

ответ

2

вы никогда не выделить память, ни инициализировать

room.users 

поэтому при попытке доступа номера [я] .users [к] вы получите ошибку сегментации.

как примечание стороны: НЕ ИСПОЛЬЗУЙТЕ GLOBALS, или вы будете делать глупые вещи (даже больше, когда вы используете глобальные переменные с тем же именем, что и члены ваших структур). Кроме того, всегда инициализируйте свои итерационные переменные в первой части циклов for. (Вы знаете, что люди умерли меньше, чем сделать:? P)

вот пример того, что должно быть вашей основной функцией:

int main() { 
    room* rooms; 
    user* users; 

    initUsersArray(users); 
    initRoomsArray(rooms); 

    char *username = "Max"; 
    addToUsersArray(users,username); 
    username = "Ma1x"; 
    addToUsersArray(users,username); 
    printf("%s\n",users[0].username); 
    printf("%s\n",users[1].username); 

    struct sockaddr_in addr; 
    addr.sin_family = AF_INET; 
    addr.sin_port = htons(4444); 
    addr.sin_addr.s_addr = inet_addr("127.0.0.1"); 

    char *room = "sportchat"; 
    addToRoomsArray(rooms,room); 

    /* ... */ 

    return 1; 
} 
+0

Я новичок в c. Почему использование глобальных таблиц настолько плохое? – user1324258

+0

, потому что вы не можете следить за жизнью каждой переменной в своем коде. Обычно вы объявляете свою переменную в своей функции main(), а затем передаете ее каждой функции. см. мое следующее редактирование. – zmo

+0

Таким образом, у вас есть свои комнаты и переменные пользователей, и вы можете правильно следить за их жизнью и иметь несколько экземпляров из них. И вы узнаете более легко, где в вашем коде вы должны были бы поместить недостающее распределение/инициализацию room.users – zmo

0

Есть несколько проблем с этим кодом. Чтобы ответить на вопрос, вы не выделили массив rooms[i].users.

Смежные вопросы