Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 05.12.2010
Сообщений: 20
1

Использование memmove()

19.04.2012, 23:11. Показов 2660. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Приветствую всех.
Появилась необходимость использования memmove вот в такой подзадаче:
Есть динамический массив указателей на структуру. Он расширяется по мере надобности(разрешается только malloc и memmove). Использую gcc.
Это часть. Не вдавайтесь в подробности реализации. Все параметры в функцию передаются корректно.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
struct buf 
{
        int vi;
        int vi2;
        int vi3;
        double vd;
        char vc[256];
        char vc2[256];
} buffer;
 
struct r_relation
{
    struct r_atribute * atts;
    int                 num;    
    struct memory_man * mem;
    struct r_buffer *   buffer;
    struct korteg   **  vector;
    int                 vector_sz;
    struct korteg   **  pool;
    int                 pool_sz,
                        rsize;
} _t;
...
    for(i=0;i<TEST_ROW;i++)
    {
        buffer.vi = i/1000;
        buffer.vd = (double)buffer.vi;
        sprintf(buffer.vc,"%d",buffer.vi);
        r_insert(&r);//вот тут вызывается функция и segmentation fault
    }
 
...
//m_allocate
void *m_allocate(struct memory_man *_m, size_t _size)
{
        size_t* ptr;
 
        ptr = (size_t*)malloc(_size + sizeof(size_t));
        *ptr = _size;
        _m->amount += _size;
    ptr++;
        return (void*)ptr;
}
//r_insert
 
    i = 0;
    tmp = tmp1 = NULL;
    tmp3 = _t->vector;
    tmp2 = NULL;
    
    if (_t->pool_sz == 0) {
        _t->vector_sz++;            
        tmp = (r_pointer)m_allocate(_t->mem,_t->num*sizeof(struct korteg));
        printf("vsz - %d rsz - %d\n",_t->vector_sz,_t->rsize);
        if (_t->vector_sz >= _t->rsize) {                                   // увеличиваем д.м. вдвое,если нет места
            _t->rsize *= 2;
            tmp2 = (r_pointer *)m_allocate(_t->mem,_t->rsize*sizeof(r_pointer));
            printf("alloc %d\n",_t->rsize);
            while (i < (_t->vector_sz - 1)) {           
                memmove(*tmp2,*tmp3,sizeof(r_pointer));//вот тут не работает
                i++;
                tmp3++;
                tmp2++;
                printf("i=%d\n",i);
            }
            tmp2 -= i;
            _t->vector = tmp2;
        }
        tmp2[_t->vector_sz - 1] = tmp;
    }
    else {
        _t->pool_sz--;
        tmp = *_t->pool + _t->pool_sz - 1;//используем уже существующий     
        tmp1 =  *_t->vector;             // Найдём куда записать адрес в д.м.
        i = 0;      
        while (tmp1 !=NULL) {
            tmp1++;
            i++;
        }
        _t->vector[i]= tmp;
    }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.04.2012, 23:11
Ответы с готовыми решениями:

Почему memmove быстрее цикла?
Почему вставка элемента с помощью функции memmove иногда быстрее,чем с помощью цикла? Ведь memmove можно заменить циклом,но он работает...

Реализовать аналог `void *memmove(void *to, void *from, size_t n)`
Добрый день, подскажите пожалуйста, как реализовать такой метод самостоятельно? который копирует из одного массива в другой n элементов ...

memmove
Сижу тренируюсь перед экзаменом, там одна из задач будет реализовать одну из фун. С. Вот memmove (Работает нормально..) void...

3
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
19.04.2012, 23:47 2
C++
1
memmove(*tmp2,*tmp3,sizeof(r_pointer));//вот тут не работает
По обрывкам мало что можно понять и сказать. Какой тип у *tmp2 и *tmp3? r_pointer это что? Указатель или структура? Если указатель, то разве цель скопировать указатель? А усли структура, то непонятно использование этого типа выше при преобразовании типа результата m_allocate.
0
20.04.2012, 13:52 3

Не по теме:

Цитата Сообщение от vani2 Посмотреть сообщение
(разрешается только malloc и memmove)
А realloc() по идейно-политическим соображениям не проходит?

0
0 / 0 / 0
Регистрация: 05.12.2010
Сообщений: 20
21.04.2012, 00:45  [ТС] 4
Цитата Сообщение от easybudda Посмотреть сообщение

Не по теме:


А realloc() по идейно-политическим соображениям не проходит?

По заданию.
C
1
2
3
4
5
6
7
8
9
10
11
...
typedef struct korteg * r_pointer
...
struct korteg
{
    char name[32];
    int iv,flag;
    double dv;
    char * cv;
}
....
Я тут проще написал во фрагменте с memmove, но тот же Seg. fault:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
r_pointer r_insert(struct r_relation * _t)
{
    r_pointer tmp, tmp1, *tmp2, *tmp3;
    struct r_atribute * ptr_atr;
    struct r_buffer * ptr_buf;
    char * ch;
    double * m;
    int *   p,
            i = 0;
    tmp = tmp1 = NULL;
    tmp3 = _t->vector;
    tmp2 = NULL;
    
    if (_t->pool_sz == 0) {                                                 //если пул пуст
        _t->vector_sz++;            
        tmp = (r_pointer)m_allocate(_t->mem,_t->num*sizeof(struct korteg));//выделение под новый кортеж
        printf("vsz - %d rsz - %d\n",_t->vector_sz,_t->rsize);
        if (_t->vector_sz > _t->rsize) {                                    // увеличиваем д.м. вдвое,если нет места
            _t->rsize *= 2;
            tmp2 = (r_pointer *)m_allocate(_t->mem,_t->rsize*sizeof(r_pointer));
            printf("alloc %d\n",_t->rsize);
            memmove(tmp2,tmp3,_t->vector_sz*sizeof(r_pointer));
            printf("F\n");          
            _t->vector = tmp2;  
            m_deallocate(_t->mem,tmp3);
        }
        printf("FF\n");
        _t->vector[_t->vector_sz - 1] = tmp;
        printf("1F\n");
    }
    else {
        _t->pool_sz--;
        tmp = *_t->pool + _t->pool_sz - 1;//используем уже существующий    последний  
        tmp1 =  *_t->vector;             // Найдём куда записать адрес в д.м.
        i = 0;      
        while (tmp1 !=NULL) {
            tmp1++;
            i++;
        }
        _t->vector[i]= tmp;
    }
    printf("G\n");
    ptr_atr = _t->atts;
    ptr_buf = _t->buffer;
    tmp1 = tmp;
    i = 0;    
 
    while (_t->num > i) {
        if (ptr_buf->pointer != NULL) {
            if (ptr_atr->type == 0) {
                p=(int*)ptr_buf->pointer;
                tmp1->iv = *p;
                tmp1->flag = 0;
            }
            if (ptr_atr->type == 1) {
                m = (double*)ptr_buf->pointer;
                tmp1->dv = *m;
                tmp1->flag = 0;
            }
            if (ptr_atr->type == 2) {
                ch=(char*)m_allocate(_t->mem,ptr_buf->size*sizeof(char));
                strncpy(ch,(char*)ptr_buf->pointer,ptr_buf->size);
                tmp1->cv = ch;
                tmp1->flag = 1;
            }
        }
        strcpy(tmp1->name,ptr_buf->name);
        tmp1++;
        ptr_buf++;
        ptr_atr++;
        i++;
    }
    printf("ret\n");
    return tmp;
}
C
1
2
3
4
5
6
void m_deallocate(struct memory_man *_m, void *_ptr)
{
        size_t* ptr = ((size_t*)_ptr) - 1;
        _m->amount -= *ptr;
        free(ptr);
}
Функции для работы с памятью нужны для учёта общего объема, занимаемого программой.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.04.2012, 00:45
Помогаю со студенческими работами здесь

Объясните работу ф-ии memmove
Я не понимаю как работает ф-ия memmove. Объясните пожалуйста на простом, доступном языке, как она работает.

Ошибка в функции memmove
Уважаемые форумчане, компилятор выдает: &quot;expected primary-expression before ')' token&quot; в элементе кода cell *cell_buf; border...

Не корректная работа функции memmove
Мой код хоть и написан с помощью winapi, но все же вопрос связан не с этим. При первом вызове моей функции DeleteShip, все работает...

Аналог memmove() из C++ для сдвига массива
Мне нужно сдвинуть массив, на плюсах это делал через memmove, какие эквиваленты есть в c#? Спсибо

Аналог strcpy, memmove но только для бинарних файловых типов fstream
Есть ли функциям аналог strcpy, memmove но только для бинарных файловых типов fstream. Например, надо вставить данные в определенную...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Новые блоги и статьи
Winforstrap или красявый дизайн своими руками на HTML+JS+Winform­s
anomal6 04.03.2025
Сидел тут вечером ковырял проект на MAUI, и как же глупо создаются пакеты MSIX и система обновлений пакета публикации, но не об этом. Бывает нужен современный дизайн программы а писать на MAUI,. . .
Формат данных для симуляции физики, посредством распространённы­­­­­­­х не обученных моделей.
Hrethgir 04.03.2025
Что-то как-то снова потерялось, зато катангенсы закатангесились в одном сообщении. На днях писал, что планирую для работы апгрейдить (на этот раз удачно) девайс для работы (конкретно - здоровья для,. . .
Концепция variadic
CoderHuligan 04.03.2025
Мне не очень нравится (а кому это нравится?) что у нас есть отдельно компилятор, отдельно линковщик, причем со своим собственным командным языком. При этом усложнении надо знать помимо языка. . .
Java Record или Kotlin Data Class: что лучше для неизменяемых данных
Wired 04.03.2025
Java Record и Kotlin Data Class — два мощных инструмента для обуздания неизменяемых структур данных, каждый со своим уникальным подходом к решению этой задачи. История их появления весьма. . .
Создание производительны­­­х API с Java и gRPC
Wired 04.03.2025
В мире микросервисной разработки вопрос производительности часто становится краеугольным камнем. И хотя REST API давно завоевал сердца разработчиков своей простотой и интуитивностью, при высоких. . .
Что нового в JDK 24
Wired 04.03.2025
JDK 24 — это настоящий прорыв в эволюции Java, который кардинально меняет правила игры. В этом релизе разработчики Oracle наконец-то довели до ума множество критически важных улучшений в. . .
Разработка блокчейн с использованием Java: смарт-контракты и dApp
Wired 04.03.2025
Погружаясь в мир блокчейн-разработки на Java, разработчик получает доступ к внушительному арсеналу инструментов. В отличие от Solidity, который "заперт" в экосистеме Ethereum, Java предоставляет. . .
WebAssembly в Kubernetes
stackOverflow 03.03.2025
В современной экосистеме облачных технологий WebAssembly (Wasm) становится все более значимым компонентом, предлагая уникальный подход к выполнению кода в распределенных системах. Эта технология. . .
GitHub Actions или Jenkins: Выбираем CI/CD платформу
stackOverflow 03.03.2025
Непрерывная интеграция и развертывание (CI/ CD) изменили подход к разработке программного обеспечения, превратив его в бесшовный процесс от написания кода до развертывания в продакшн. GitHub Actions и. . .
Автоматизация тестирования Pull Request в Kubernetes: Интеграция с GitHub Actions и GKE
stackOverflow 03.03.2025
Масштабные проекты с использованием Kubernetes требуют надежной системы тестирования изменений перед их внедрением в продакшн-среду. Традиционный подход с ручной проверкой Pull Request не справляется. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru