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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
zek921
9 / 9 / 2
Регистрация: 30.04.2011
Сообщений: 130
Записей в блоге: 1
#1

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

21.06.2012, 22:28. Просмотров 764. Ответов 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++):

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

Проверить массив на возрастание - C++
Есть задание, проверить массив на возрастание.Если нет, то вывести сумму только положительных чисел массива.Я написал так #include...

Проверить упорядочен ли массив - C++
Здравствуйте! Нужна ваша помощь, помогите написать программу. Условие: Дано натуральное число N и одномерный массив A1, A2...A(N)...

Проверить массив на переполнение - C++
Есть массив unsignec char buff = {0}; Подскажите можно ли таким образом (приведённым ниже) проверить массив на заполнение: if(buff...

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

Проверить массив на наличие данных - C++
Подскажите пожалуйста, как проверить массив на наличие не нулевых элементов? К примеру есть массив unsigned char Buff = {0}; Как потом...

18
soon
2542 / 1307 / 81
Регистрация: 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
2542 / 1307 / 81
Регистрация: 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
2542 / 1307 / 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;
не отображает всей картины.
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
2542 / 1307 / 81
Регистрация: 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
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
22.06.2012, 07:10 #10
zek921, что ж, вроде понял. При вызове обычного конструктора, память выделяется, но ничего туда не пишется, как следствие, при вызове конструктора копирования, будет скопирован мусор из массива. В этом ошибка? Если да, то могу предложить выделять память только тогда, когда происходит запись в массив(как я понял, это должно быть в функции Add_addr). В противном случае будет лучше, если вы выложите полный код.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 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
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 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
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 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=, а потом уже что-то думай. Если ты пишешь конструктор копирования ты обязан и оператор присваивания либо реализовать, либо запретить.
0
22.06.2012, 11:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.06.2012, 11:39
Привет! Вот еще темы с ответами:

Проверить массив на правильность ввода - C++
Вроде бы были похожие темы, но так как я тупой, то не смог подобрать подходящего решения. Задача такова: хочу заполнить массив с...

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

Проверить является ли массив знакочередующимся - C++
Добрый день! у меня возникает серия вопросов,по условию данной задачи &quot;Проверить,состоит ли массив из знаков чередующихся элементов(к...

проверить массив двумерный выдает ошибки.. - C++
#include &lt;iostream.h&gt; #include &lt;iomanip.h&gt; #include &lt;math.h&gt; int main() { double **a,tmp; int i,j,max,min,n,m; ...


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

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

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