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

Проверить массив на инициализированность - C++

Восстановить пароль Регистрация
 
zek921
9 / 9 / 2
Регистрация: 30.04.2011
Сообщений: 130
Записей в блоге: 1
21.06.2012, 22:28     Проверить массив на инициализированность #1
std::list<my_type> c ;
при с.push_back(my_type что_угодно) ;
нужно скопировать значения одного массива А в массив В ,при этом не известно было ли в массиве В что-нибудь до этого ,закинутого туда пользователем .0xcdcdcdcd сейчас адрес ,но там будет что угодно в релизной версии,коли правильно я понял .
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
21.06.2012, 22:36     Проверить массив на инициализированность #2
Прочел. Не увидел ни одного вопроса.
zek921
9 / 9 / 2
Регистрация: 30.04.2011
Сообщений: 130
Записей в блоге: 1
21.06.2012, 22:49  [ТС]     Проверить массив на инициализированность #3
ок . При копировании данных один из массивов может быть BadPtr .Есть ли что-нибудь для проверки на сабж ,дабы не переделывать программу ?
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
21.06.2012, 22:56     Проверить массив на инициализированность #4
Все равно не понял. Надо проверить, не пустой ли список? Есть функция empty.

Добавлено через 3 минуты
О каких массивах идет речь? Обычные, обертки над ними, или что?
zek921
9 / 9 / 2
Регистрация: 30.04.2011
Сообщений: 130
Записей в блоге: 1
21.06.2012, 23:16  [ТС]     Проверить массив на инициализированность #5
Хотел не грузить деталями ,но получилось только хуже (= .

В общем ,есть my_type класс .У него есть поле A (char указатель) .
Нужно выделить место под данные (char * ====> бла-бла-бла динамический массив )от другого объекта при вызове конструктора копирования .Но объект не я создавал , при (это std::list<my_type>) с.push_back(my_type что_угодно) ;
конструктор копирования вызывается для пустого узла списка ,а кто или что там выделяет память ,я не контролирую.

Проблема в том ,что конструктор копирования общий и для фигни сверху ,и длячего-нибудь типа my_type a ;
my_type b;
a = b;
Во втором случае я контролирую все выделения памяти и вызовы функций.В первом - нет ,что для чего вызывается мне несколько непонятно .

Я извиняюсь если много не читаемой фигни .Если так - переформулирую вопрос .
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
21.06.2012, 23:27     Проверить массив на инициализированность #6
Во втором случае я контролирую все выделения памяти и вызовы функций.В первом - нет ,что для чего вызывается мне несколько непонятно .
Если речь идет о выделениях и вызовах в конструкторе, то проблемы не вижу. Если не о них, то пример
C++
1
2
3
my_type a;
my_type b;
a = b;
не отображает всей картины.
zek921
9 / 9 / 2
Регистрация: 30.04.2011
Сообщений: 130
Записей в блоге: 1
21.06.2012, 23:37  [ТС]     Проверить массив на инициализированность #7
Короче говоря ,у меня проблема в том ,что вызывается конструктор копирования для указателя на хвост списка std::list<my_type> .Там память я не выделял .Там мусор .Просто проверить на null уже не катит .

Добавлено через 3 минуты
есть указатель на char , где нужно выделять память в случае ,когда я выделял там уже память (старое нужно очистить) и когда не выделял (старого там ничего нет ,только мусор)

Добавлено через 1 минуту
Имеется в виду конструктор копирования .Код конструктора копирования .Общий для разных случаев .
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
21.06.2012, 23:47     Проверить массив на инициализированность #8
zek921, Сможете сделать компилябельный вариант, где a = b работает, а вариант с добавлением в лист нет? Я что-то не могу уловить, каким образом ваш класс связан с указателем на хвост std::list.
zek921
9 / 9 / 2
Регистрация: 30.04.2011
Сообщений: 130
Записей в блоге: 1
21.06.2012, 23:58  [ТС]     Проверить массив на инициализированность #9
Ох ,выложил бы сразу код ...

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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
class subnet
{
private:
    unsigned char *net_addr;
    unsigned char *broadcast_addr;
    //list<unsigned char *>occupied_addr;
 
    typedef struct _info
    {
    unsigned char *occupied_addr;
    string Name;
    string Comment;
    }Info;
    list<Info> data;
 
     int free_addresses_count;
     int pref_length;
public:
    subnet();
    subnet(unsigned char* ,unsigned char* ,const int&,const int&); // здесь нужо добавлять адресс сети и с ним же широковещательный
    // само собой ,при известном уже колличестве хостов .Добавим адресс сети по умолчанию ,это юудет 10.0.0.0/8
    subnet(const subnet& b);
    ~subnet();
    unsigned char * ret_broadcast();
 
    void Add();
    void Add_addr(/*привести в функции во вменяемый вид ,добавить новый адресс;коль нужно - пояснения к нему */);
    void Delete();
    void Show();
    string ToString();
    void ToStr();
};
class subn_calc
{
private:
    // контеинер с подсетями
    void convert(string&,unsigned char*);
    list<subnet> Subnets;// если контеинер не пуст,
    //предыдущий широковещательный адресс +1 должен быть равен текущему адрессу сети и всё такое ...
        void Calculate(unsigned char*,int&,unsigned char*,int&);
 
        void pls(unsigned char*,const int&,unsigned char*,const int&);
        void mns(unsigned char*,const int&,unsigned char*,const int&);
 
    //  friend subnet ret_by_ind(list<subnet> container,int index);
public:
    //subn_calc();
    //~subn_calc();
    void Add_new_subn(/* комбаин для перемалывания фарша*/string&,int&);
 
    
    void Find();
    void Open(/*pathway*/);
    void Load();
    void Save();
    void ToStringFull();
    
};
subnet::subnet()
{
net_addr = new unsigned char[4];
broadcast_addr = new unsigned char[4];
pref_length =0;
free_addresses_count =0;
}
subnet::subnet(const subnet& b)
{
    
    //if(this->net_addr==nullptr )
    //{
    //  delete[] net_addr;}
    net_addr = new unsigned char[4];
    for(int i=0;i<4;i++)this->net_addr[i] = b.net_addr[i];
    //if(this->broadcast_addr){delete[] broadcast_addr;}
    broadcast_addr = new unsigned char[4];
    for(int i=0;i<4;i++)this->broadcast_addr[i] = b.broadcast_addr[i];
    this->pref_length = b.pref_length;
    this->free_addresses_count = b.free_addresses_count;
}
 
void subn_calc::Add_new_subn(string& addr,int& hosts)
{
    // hosts 
    unsigned char* temp1 = new unsigned char[4];// net addr
    convert(addr,temp1);
    unsigned char* temp2 = new unsigned char[4];// broadcast addr
    int pref=0;
    Calculate(temp1,hosts,temp2,pref);
    /*for(int i=0;i<4;i++)cout<<(int)temp1[i]<<" ";
    cout<<endl;
    for(int i=0;i<4;i++)cout<<(int)temp2[i]<<" ";
    cout<<endl;*/
 
    if(Subnets.empty())
    {
        //subnet t1_;
        //Subnets.push_back(t1_);
        subnet t2_ = subnet(temp1,temp2,(hosts-2),pref);
        //Subnets.back() = t2_;
        Subnets.push_back(t2_);
    }
    else
    {
    //subnet temp3 ;
    //temp3 = ret_by_ind(Subnets,(Subnets.size()-1));
        //list<subnet>::iterator  iter = Subnets.begin();
        //for(int i =0;i<(Subnets.size()-1);i++) ++iter;
        
        unsigned char* temp3 = new unsigned char [4];
        pls(/*(*iter).ret_broadcast()*/(Subnets.back()).ret_broadcast(),1,temp3,3); // здесь шибка
        if(temp3!=temp1)
        {
        //error here !!!
        }
        else
        {
            subnet t1_ = subnet(temp1,temp2,(hosts-2),pref);
            Subnets.push_back(t1_);
        }
    }
    cout<<endl<<endl;
    for(int i=0;i<4;i++)cout<<(int)temp1[i]<<" ";
    cout<<endl;
    for(int i=0;i<4;i++)cout<<(int)temp2[i]<<" ";
    cout<<endl;
    cout<<endl;
}
код не весь .Если нужно - выложу весь .Комменты мои мне же .Не обращайте внимания .
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
22.06.2012, 07:10     Проверить массив на инициализированность #10
zek921, что ж, вроде понял. При вызове обычного конструктора, память выделяется, но ничего туда не пишется, как следствие, при вызове конструктора копирования, будет скопирован мусор из массива. В этом ошибка? Если да, то могу предложить выделять память только тогда, когда происходит запись в массив(как я понял, это должно быть в функции Add_addr). В противном случае будет лучше, если вы выложите полный код.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
22.06.2012, 07:58     Проверить массив на инициализированность #11
У тебя есть конструктор копирования, но нет оператора присваивания. Если реализуешь конструктор копирования, то нужно и оператор присваивания свой писать. В примере "a = b;" компилятор заменяет присваивание на копирование в целях оптимизации, поэтому ошибки и нету.
zek921
9 / 9 / 2
Регистрация: 30.04.2011
Сообщений: 130
Записей в блоге: 1
22.06.2012, 09:39  [ТС]     Проверить массив на инициализированность #12
опять же,память выделяю не я.STL .Я не контролирую stl .

a= b ; У меня нет с этим проблем .Я написал ,дабы было сравнение подконтрольного процесса с процессом,что не контролирую (в контексте выделение памяти).Всё ,что меня интересовало,это проверка на плохой указатель .Проверка адреса памяти на читаемость ,валидность.Забудем про классы ,про массивы .
IsBadPtr() ,вариации .Пользовательские варианты никто не знает ?
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
22.06.2012, 11:12     Проверить массив на инициализированность #13
Цитата Сообщение от zek921 Посмотреть сообщение
a= b ; У меня нет с этим проблем .
Именно с этим у тебя и проблема, потому что у тебя НЕТ реализованного оператора присваивания, поэтому оно выполняется побайтным копированием... И вообще, не спорь со мной, а то тапками кидаться начну.
zek921
9 / 9 / 2
Регистрация: 30.04.2011
Сообщений: 130
Записей в блоге: 1
22.06.2012, 11:21  [ТС]     Проверить массив на инициализированность #14
Ок . связь оператора присваивания с std:: list<T>:: push_back(T & val) и мне будет понятно.

Правда не знаю Знал бы ,не ломал себе и окружающим мозг.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
22.06.2012, 11:39     Проверить массив на инициализированность #15
Цитата Сообщение от zek921 Посмотреть сообщение
связь оператора присваивания с std:: list<T>:: push_back(T & val) и мне будет понятно
Строка 118, у тебя там присваивание. И в 119 уже push_back, но что находится в t1 зависит от параметров компиляции и выполненных оптимизаций. Реализуй operator=, а потом уже что-то думай. Если ты пишешь конструктор копирования ты обязан и оператор присваивания либо реализовать, либо запретить.
zek921
9 / 9 / 2
Регистрация: 30.04.2011
Сообщений: 130
Записей в блоге: 1
22.06.2012, 11:46  [ТС]     Проверить массив на инициализированность #16
предположим сделал ,в t1_ теперь находится то ,что мне нужно .Момент "а потом уже что-то думай" , то есть ?
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
22.06.2012, 11:54     Проверить массив на инициализированность #17
Цитата Сообщение от zek921 Посмотреть сообщение
Момент "а потом уже что-то думай" , то есть ?
оптимизирующий компилятор может заменять присваивание копированием, например. Тем более, реализация контейнеров тебя не должна тревожить, если ты обеспечиваешь требования к объекту. Реализовав нужные конструкторы и операторы, ты обеспечишь ээти требования и всё будет работать.
zek921
9 / 9 / 2
Регистрация: 30.04.2011
Сообщений: 130
Записей в блоге: 1
22.06.2012, 12:02  [ТС]     Проверить массив на инициализированность #18
"если ты обеспечиваешь требования к объекту" , то есть ?

***
да ,меня пугают слова типа "оптимизация компилятора" ,я просто студент .Всё ,конечно ,бывает в первый раз ,не знаю.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.06.2012, 12:20     Проверить массив на инициализированность
Еще ссылки по теме:

Проверить что массив упорядочен по невозрастанию C++
Проверить отсортирован ли одномерный массив по убыванию C++
Проверить является ли массив знакочередующимся C++

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

Или воспользуйтесь поиском по форуму:
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
22.06.2012, 12:20     Проверить массив на инициализированность #19
Цитата Сообщение от zek921 Посмотреть сообщение
типа "оптимизация компилятора"
Не "оптимизация компилятора", а "оптимизирующий компилятор". А таковыми являются почти 100% компиляторов в Relese режиме.

Цитата Сообщение от zek921 Посмотреть сообщение
то есть ?
Цитата Сообщение от Deviaphan Посмотреть сообщение
Реализовав нужные конструкторы и операторы, ты обеспечишь ээти требования и всё будет работать.
Yandex
Объявления
22.06.2012, 12:20     Проверить массив на инициализированность
Ответ Создать тему
Опции темы

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