Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
zek921
9 / 9 / 2
Регистрация: 30.04.2011
Сообщений: 130
Записей в блоге: 1
#1

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

21.06.2012, 22:28. Просмотров 790. Ответов 18
Метки нет (Все метки)

std::list<my_type> c ;
при с.push_back(my_type что_угодно) ;
нужно скопировать значения одного массива А в массив В ,при этом не известно было ли в массиве В что-нибудь до этого ,закинутого туда пользователем .0xcdcdcdcd сейчас адрес ,но там будет что угодно в релизной версии,коли правильно я понял .
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.06.2012, 22:28
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Проверить массив на инициализированность (C++):

Массив: Проверить, отсортирован ли массив по возрастанию.
Дано одномерный массив. Проверить, отсортирован ли он по возрастанию.

Проверить упорядочен ли массив
Здравствуйте! Нужна ваша помощь, помогите написать программу. Условие: Дано...

Проверить массив на упорядоченность
В одномерном массиве, состоящем из и целых элементов, вычислить: 1) К...

Проверить массив на переполнение
Есть массив unsignec char buff = {0}; Подскажите можно ли таким образом...

Проверить массив на возрастание
Есть задание, проверить массив на возрастание.Если нет, то вывести сумму только...

Проверить массив на правильность ввода
Вроде бы были похожие темы, но так как я тупой, то не смог подобрать...

18
soon
2545 / 1310 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
21.06.2012, 22:36 #2
Прочел. Не увидел ни одного вопроса.
0
zek921
9 / 9 / 2
Регистрация: 30.04.2011
Сообщений: 130
Записей в блоге: 1
21.06.2012, 22:49  [ТС] #3
ок . При копировании данных один из массивов может быть BadPtr .Есть ли что-нибудь для проверки на сабж ,дабы не переделывать программу ?
0
soon
2545 / 1310 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
21.06.2012, 22:56 #4
Все равно не понял. Надо проверить, не пустой ли список? Есть функция empty.

Добавлено через 3 минуты
О каких массивах идет речь? Обычные, обертки над ними, или что?
0
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;
Во втором случае я контролирую все выделения памяти и вызовы функций.В первом - нет ,что для чего вызывается мне несколько непонятно .

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

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

Добавлено через 1 минуту
Имеется в виду конструктор копирования .Код конструктора копирования .Общий для разных случаев .
0
soon
2545 / 1310 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
21.06.2012, 23:47 #8
zek921, Сможете сделать компилябельный вариант, где a = b работает, а вариант с добавлением в лист нет? Я что-то не могу уловить, каким образом ваш класс связан с указателем на хвост std::list.
0
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;
}
код не весь .Если нужно - выложу весь .Комменты мои мне же .Не обращайте внимания .
0
soon
2545 / 1310 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
22.06.2012, 07:10 #10
zek921, что ж, вроде понял. При вызове обычного конструктора, память выделяется, но ничего туда не пишется, как следствие, при вызове конструктора копирования, будет скопирован мусор из массива. В этом ошибка? Если да, то могу предложить выделять память только тогда, когда происходит запись в массив(как я понял, это должно быть в функции Add_addr). В противном случае будет лучше, если вы выложите полный код.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
22.06.2012, 07:58 #11
У тебя есть конструктор копирования, но нет оператора присваивания. Если реализуешь конструктор копирования, то нужно и оператор присваивания свой писать. В примере "a = b;" компилятор заменяет присваивание на копирование в целях оптимизации, поэтому ошибки и нету.
0
zek921
9 / 9 / 2
Регистрация: 30.04.2011
Сообщений: 130
Записей в блоге: 1
22.06.2012, 09:39  [ТС] #12
опять же,память выделяю не я.STL .Я не контролирую stl .

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

Правда не знаю Знал бы ,не ломал себе и окружающим мозг.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 72
Регистрация: 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=, а потом уже что-то думай. Если ты пишешь конструктор копирования ты обязан и оператор присваивания либо реализовать, либо запретить.
0
zek921
9 / 9 / 2
Регистрация: 30.04.2011
Сообщений: 130
Записей в блоге: 1
22.06.2012, 11:46  [ТС] #16
предположим сделал ,в t1_ теперь находится то ,что мне нужно .Момент "а потом уже что-то думай" , то есть ?
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
22.06.2012, 11:54 #17
Цитата Сообщение от zek921 Посмотреть сообщение
Момент "а потом уже что-то думай" , то есть ?
оптимизирующий компилятор может заменять присваивание копированием, например. Тем более, реализация контейнеров тебя не должна тревожить, если ты обеспечиваешь требования к объекту. Реализовав нужные конструкторы и операторы, ты обеспечишь ээти требования и всё будет работать.
0
zek921
9 / 9 / 2
Регистрация: 30.04.2011
Сообщений: 130
Записей в блоге: 1
22.06.2012, 12:02  [ТС] #18
"если ты обеспечиваешь требования к объекту" , то есть ?

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

Цитата Сообщение от zek921 Посмотреть сообщение
то есть ?
Цитата Сообщение от Deviaphan Посмотреть сообщение
Реализовав нужные конструкторы и операторы, ты обеспечишь ээти требования и всё будет работать.
1
22.06.2012, 12:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.06.2012, 12:20
Привет! Вот еще темы с решениями:

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

Проверить является ли массив знакочередующимся
Дан массив X(N). Проверить, является ли он знакочередующимся. Если нет, то...

Проверить массив на наличие данных
Подскажите пожалуйста, как проверить массив на наличие не нулевых элементов? К...

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru