2016-12-10 2 views
1

У меня есть сервер-клиентская программа, которую я могу добавить или удалить. Когда достигнут максимальный номер пользователя (10), у меня есть ошибка при удалении одного из пользователей.memset clearing, что это не предполагается

Вот часть функции, которая удаляет пользователя:

int i; 
int confirmacao = 0; 
msg_t msg; 
char cliname[10]; 
if (strlen(estrutura.id) == 3) { 
    for (i = 0; memoria->x[i].id[0] != '\0'; ++i) { 
     if (strcmp(estrutura.id, memoria->x[i].id) == 0) { 
      confirmacao = 1; 
      for (; memoria->x[i].id[0] != '\0'; ++i) { 
       memoria->x[i] = memoria->x[i + 1]; 
      } 
      // I think the problem is with this memset 
      memset(memoria->x[i].id, '\0', sizeof(memoria->x[i].id)); 
      printf("IA antes de decrementar: %i\n", memoria->ia); 
      memoria->ia--; 
      printf("Ia depois: %i\n", memoria->ia); 
      break; 
     } 
    } 
} else { 
    ... 
} 

Here is the print from gdb

memoria-> НМА suposed быть уменьшен на единицу, и я могу понять, почему MemSet является установка его до нуля.

Memoria глобальный указатель на эту структуру:

typedef struct mmap_uti_s { 
    uti_t x[NUTI]; 
    int ia; 
} mmap_uti_t; 

и uti_t эта структура:

typedef struct uti_s { 
    char id[NDIG + 1]; 
    char nome[NDIM + 1]; 
    char portas[NPOR + 1]; 
} uti_t; 

ответ

1

Вы не сбросить последний элемент после копирования предыдущего, потому что приращение i перед тестированием на конец массива. Кроме того, как вы правильно отметили, вы должны всегда останавливать копирование до того, как достигнете конца массива.

Вы должны изменить тест на вложенной for петли для:

for (; i + 1 < 10 && memoria->x[i + 1].id[0] != '\0'; i++) 

И вы должны также изменить тест в основном цикле, чтобы остановить сканирование в конце массива, если она полна.

Хотя это не является строго необходимым, лучше использовать другой индекс для фазы копирования, чтобы избежать изменения индекса текущего цикла.

Очистить всю структуру, а не только член id, кажется предпочтительным тоже.

Вот измененный код:

int i, j; 
int confirmacao = 0; 
msg_t msg; 
char cliname[10]; 
if (strlen(estrutura.id) == 3) { 
    for (i = 0; i < 10 && memoria->x[i].id[0] != '\0'; ++i) { 
     if (strcmp(estrutura.id, memoria->x[i].id) == 0) { 
      confirmacao = 1; 
      for (j = i; j + 1 < 10 && memoria->x[j].id[0] != '\0'; ++j) { 
       memoria->x[j] = memoria->x[j + 1]; 
      } 
      // I think the problem is with this memset 
      memset(&memoria->x[j], 0, sizeof(memoria->x[j])); 
      printf("IA antes de decrementar: %i\n", memoria->ia); 
      memoria->ia--; 
      printf("Ia depois: %i\n", memoria->ia); 
      break; 
     } 
    } 
} else { 
    ... 
} 
+0

Tank вы очень бы принять возрастов для меня, чтобы обнаружить, что! –

+0

Он работает так, как вы сказали, но, подумав об этом, если я сделаю так, если массив будет заполнен, то в последнем цикле он будет выполнять «memoria-> x [9] = memoria-> x [10]; ведьма не существует. Или я ошибаюсь? –

+0

Я думаю, что это должно быть 'i + 2' для условия, а затем' i + 1' в memset –

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