На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> поиск по структурам (gcc FreeBSD) , поиск по структурам
    Подскажите, что за ботва. Хочу массив структур в памяти, создавать и менять данные в переменных.
    Приведенный пример, по идее, должен заполнять тестовый шаблон 5-ю элементами.
    Затем найти элемент с индексом 2 (счёт от 0) и вернуть указатель на структуру (если найдено совпадение по содержимому поля client_ip).
    Почему-то возвращаемый указатель больше базового на 800 байт, хотя должен (20 байт/структуру * 2 индекс=) 40 байт.
    В чём я не прав и как исправить процедуру find_ip() чтобы она возвращала правильный указатель?

    // gcc pointers.c -o pointers
    #include <stdlib.h>
    // #include <malloc.h>

    struct client_ip_traffic_sum {
    unsigned long client_ip;
    unsigned long traffic_all_low;
    unsigned long traffic_all_high;
    unsigned long traffic_cached_low;
    unsigned long traffic_cached_high; };

    int client_ips, i; struct client_ip_traffic_sum * pointer;
    void * void_ptr; unsigned long ip; struct client_ip_traffic_sum * select_client;

    struct client_ip_traffic_sum * find_ip(void) { struct client_ip_traffic_sum * selected_client, *ipa;
    pointer=void_ptr; selected_client=pointer;
    printf("selected_client before=\t%u\n",selected_client);
    if (client_ips!=0) { i=0; // ip=pointer[i].client_ip; ip=pointer->client_ip;
    ip_searching: if (ip==pointer[i].client_ip) {goto ip_searched;}
    else {if (i<client_ips) {i++; goto ip_searching;} else {goto ip_not_searched;}}
    }
    ip_not_searched: selected_client=NULL; return selected_client;
    ip_searched:
    //printf("Current:%u\tIndex:%u\tSize:%u\n",selected_client,i,sizeof(struct client_ip_traffic_sum));
    ipa = selected_client;
    printf("selected_client after=\t%u\n",selected_client);
    selected_client=selected_client+(sizeof(struct client_ip_traffic_sum)*i);
    //printf("Previous:%u\tSelected:%u\tDifferense:%u\n",ipa,selected_client,selected_client-ipa);
    printf("selected_client=\t%u\n",selected_client);
    return selected_client;
    }

    int main() {
    void_ptr = malloc(sizeof(struct client_ip_traffic_sum)*1024);
    if (!void_ptr) {printf("Could not allocate memory!\n"); exit(1);}
    printf("Void_ptr=%u\n",void_ptr);

    pointer=void_ptr; ip=1; client_ips=5; //=0;
    for (i=0; i<client_ips; i++){pointer[i].client_ip=ip; ip++;}

    ip=3; select_client=find_ip();
    //if (select_client!=NULL) {printf("Select_client=%u\tip=%u\n",select_client,select_client->client_ip);} else {printf("F*ck\n");}

    //printf("Start:%u\tCurrent:%u\n",void_ptr,select_client);
    //printf("S:%u\tC:%u\tD:%u\n",void_ptr,select_client,select_client-void_ptr);
    free(void_ptr);

    //printf("Size:%u\n",sizeof(struct client_ip_traffic_sum));
    }
      ExpandedWrap disabled
        ip_searched:
                //printf("Current:%u\tIndex:%u\tSize:%u\n",selected_client,i,sizeof(struct client_ip_traffic_sum));
                ipa = selected_client;
                printf("selected_client after=\t%u\n",selected_client);
               selected_client=selected_client+i;   //(sizeof(struct client_ip_traffic_sum)*i);

      т.к. struct client_ip_traffic_sum * select_client;
      Сообщение отредактировано: dnk -
      1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0165 ]   [ 15 queries used ]   [ Generated: 19.05.24, 09:52 GMT ]