Форум программистов, компьютерный форум CyberForum.ru

memset - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 48, средняя оценка - 4.71
Syltan
181 / 7 / 0
Регистрация: 27.08.2009
Сообщений: 868
23.02.2010, 22:25     memset #1
Попробовал потренироватся, как работает функция мемсет.
Вот попробовал самый простенький код, но не выдаёт результат 7, хотя все поля
инициализированны этой функцией семёрками.
Вот исходник:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using namespace std;
 
class A{
public:
    int a,b;
    float c;
};
 
int main()
{
A r;
memset(&r,7,sizeof(A));
cout<<r.a;
cin.get();
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.02.2010, 22:25     memset
Посмотрите здесь:

C (СИ) Ошибка в memset
memset, memcpy C++
C++ memset()
Что делает memset в приведенном коде C++
C++ Порядок хранения структур в ОЗУ и memset
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vourhey
Почетный модератор
6469 / 2244 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
23.02.2010, 22:44     memset #2
Цитата Сообщение от Syltan Посмотреть сообщение
хотя все поля
инициализированны этой функцией семёрками.
Почитай-ка про memset. Найди, где там сказано, что эта функция инициализирует какие-нибудь поля, и напиши сюда.
Syltan
181 / 7 / 0
Регистрация: 27.08.2009
Сообщений: 868
23.02.2010, 23:24  [ТС]     memset #3
Вообще прочитал ,что эта функция заполняет буфер определённым числом или символом, если это строчный буфер.
Но прочитал также что эта функция применяется для обнуления структур, это означает значит,
что поля. которые были в струткуру они инициализируются нулями?
А что обстоит склассами тогда?
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
23.02.2010, 23:33     memset #4
Цитата Сообщение от Syltan Посмотреть сообщение
А что обстоит склассами тогда?
для этого надо знать как представляются класы в памяти
Syltan
181 / 7 / 0
Регистрация: 27.08.2009
Сообщений: 868
23.02.2010, 23:50  [ТС]     memset #5
Покажите хоть простой пример с классом, как она работает.
Вот что я попробовал и вышло.
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
#include <iostream>
using namespace std;
 
class A{
public:
    int a,b;
    float c;
};
 
struct m{
    int p,x;
    float k;
};
 
int main()
{
A r;
m x;
memset(&r,7,sizeof(A));
cout<<r.a<<endl;
memset(&x,7,sizeof(x));
cout<<x.p;
cin.get();
}
Результат:
117901063
117901063
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
23.02.2010, 23:57     memset #6
Syltan, скорей всего все переменные в сруктуре удут не в смежных участках памяти, тоже касается и самой структуры (ссылки на нее)
Syltan
181 / 7 / 0
Регистрация: 27.08.2009
Сообщений: 868
24.02.2010, 00:00  [ТС]     memset #7
Русским языком можно и на примерах, я на жестах не понимаю. Я учусь С++ только на примерах. У меня какие-то бредовые результаты.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,309
24.02.2010, 00:04     memset #8
Цитата Сообщение от Syltan Посмотреть сообщение
Я учусь С++ только на примерах.
Я бы взял на себя смелость рекомендовать тебе почитать книжку/учебник.............
Syltan
181 / 7 / 0
Регистрация: 27.08.2009
Сообщений: 868
24.02.2010, 00:10  [ТС]     memset #9
Хорошо, скажите в двух словах, смысл memset какой?
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
24.02.2010, 00:14     memset #10
Syltan, поймешь с опытом, а для этого тебе нужно прочитать о нем все что только можешь, кстати гуглить никто не запрещал
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
24.02.2010, 00:17     memset #11
Цитата Сообщение от Syltan Посмотреть сообщение
Хорошо, скажите в двух словах, какой смысл от memset?
Цитата Сообщение от Syltan Посмотреть сообщение
Вообще прочитал ,что эта функция заполняет буфер определённым числом или символом, если это строчный буфер.
Но прочитал также что эта функция применяется для обнуления структур
Вы сами себе ответили Функция memset() заполняет каждый(!) байт в переданной последовательности указанным значением. Для обнуления структур в С её действительно удобно использовать:
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
typedef struct {
    int ival;
    double dval;
} TwoVals_t;
 
int main(void){
    TwoVals_t *arr;
    int i, cnt = 3;
    
    if ( ( arr = (TwoVals_t*)calloc(cnt, sizeof(TwoVals_t)) ) == NULL )
        exit(1);
    memset(arr, 0, cnt * sizeof(TwoVals_t));
    
    for ( i = 0; i < cnt; ++i ){
        if ( arr[i].ival != 0 || arr[i].dval != 0.0 ){
            printf("Shit happens!\n");
            exit(1);
        }
    }
    printf("All values is set to zero\n");
    
    free(arr);
    exit(0);
}
В STL С++ есть функция fill - вот с её помощью можно заполнять сразу все поля класса, и то при условии, что для класса определён оператор = (ну или тот, который компилятор сам сделает, подойдёт)...

Добавлено через 1 минуту
Цитата Сообщение от outoftime Посмотреть сообщение
скорей всего все переменные в сруктуре удут не в смежных участках памяти
Да ну?!

кстати, calloc() и так значения в 0 устанавливает, для чистоты эксперимента лучше
C
1
if ( ( arr = (TwoVals_t*)malloc(cnt * sizeof(TwoVals_t)) ) == NULL )
написать, но сути не меняет...
Syltan
181 / 7 / 0
Регистрация: 27.08.2009
Сообщений: 868
24.02.2010, 00:18  [ТС]     memset #12
А на С++ можно пример, а то эти калок только на С и exit(1);
такое не видал на С++ и free(arr); также.
Скажите, ещё что это за подход?
C++
1
2
3
4
typedef struct {
        int ival;
        double dval;
} TwoVals_t;
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
24.02.2010, 00:28     memset #13
Цитата Сообщение от Syltan Посмотреть сообщение
Скажите, ещё что это за подход?
C
1
2
3
4
5
6
7
struct TwoVals{
        int ival;
        double dval;
};
...
TwoVals a, b; /* ОШИБКА!!! */
struct TwoVals a, b; /* только так */
Вот, чтобы каждый раз struct не писать, можно описать безымянную (не обязательно) структуру и с помощью typedef объявить такой тип данных. Тогда запись вида
C
1
TwoVals_t a, b;
будет вполне нормальной...
Vourhey
Почетный модератор
6469 / 2244 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
24.02.2010, 00:30     memset #14
Цитата Сообщение от Syltan Посмотреть сообщение
что поля. которые были в струткуру они инициализируются нулями?
memset о твоих полях ничего не знает. Он видит указатель на буфер и просто забивает его значениями. Никакими полями он не руководствуется. И что будет если четыре байта int забить 7?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
24.02.2010, 00:43     memset #15
Цитата Сообщение от Syltan Посмотреть сообщение
А на С++ можно пример
Ага.
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
#include <iostream>
#include <algorithm>
#include <vector>
#include <iterator>
    
class TwoVals {
public:
    TwoVals() : ival(0), dval(0.0) {}
    TwoVals(int i, double d) : ival(i), dval(d) {}
    friend std::ostream& operator << (std::ostream& ost, const TwoVals& t){
        ost << "ival = " << t.ival << std::endl << "dval = " << t.dval << std::endl;
        return ost;
    }
private:
    int ival;
    double dval;
};
 
int main(){
    const int cnt = 3;
    std::vector<TwoVals> arr(cnt);
    TwoVals test(7, 7.7);
    
    std::fill(arr.begin(), arr.end(), test);
    std::copy(arr.begin(), arr.end(), std::ostream_iterator<TwoVals>(std::cout, "\n"));
    
    return 0;
}
Syltan
181 / 7 / 0
Регистрация: 27.08.2009
Сообщений: 868
24.02.2010, 00:51  [ТС]     memset #16
Спасибо за код, но я c operator+, функцией fill, copy,vector(первый раз) begin и френдом пока не знаком.
Есть вопрос к вам по поводу тайпдеф.
Вы говорите - это чтоб не писать много раз слово структ, можно использовать смежные структуры, вот я попробовал но у меня не получается.
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
#include <iostream>
using namespace std;
class A{
public:
    int a;
    float b;
    A(){
        a = 10;
        b = 3.14;
    }
};
typedef struct
{
    int sd;
    double bet;
} q1,q2,q3,q4;
 
q3{
    int syltan;
}
void main()
{
    A z;
    cout << "a = " << z.a << ", b = " << z.b << "\n";
    memset(&z, 0, sizeof(z));
    cout << "a = " << z.a << ", b = " << z.b << "\n";
    cin.get();
}
Программа не компилится.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.02.2010, 07:20     memset
Еще ссылки по теме:

Запустить программу. Библиотека для memset C++
C++ Memset для двухмерного массива
Assembler Функция memset

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

Или воспользуйтесь поиском по форуму:
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
24.02.2010, 07:20     memset #17
Цитата Сообщение от Syltan
Хорошо, скажите в двух словах, смысл memset какой?
одно и то же значение записывается в каждый байт

C
1
2
3
4
struct {
    int a;
    int b;
} s;
дана структура s, в ней два поля a и b
если размер int равен четырём байтам, то каждое поле равно четырём байтам
размер структуры равен 2*4 = 8 байт

C
1
memset(&s, 1, sizeof s)
в каждый байт каждого поля запишет значение 1

в поле a будет хранится число 0x01010101
в поле b будет хранится число 0x01010101

иллюстрация

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main(void) /* ANSI C89 */
{
    struct {
        int a;
        int b;
    } s;
    
    memset(&s, 1, sizeof s);
    
    printf("%#.8x" "\n", s.a);
    printf("%d" "\n", s.a);
    
    exit(EXIT_SUCCESS);
}
Код
[guest@station test]$ ./test
0x01010101
16843009
[guest@station test]$
Yandex
Объявления
24.02.2010, 07:20     memset
Ответ Создать тему
Опции темы

Текущее время: 07:00. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru