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

В чем ошибка? - C++

Восстановить пароль Регистрация
 
Asgar
0 / 0 / 0
Регистрация: 14.06.2012
Сообщений: 6
20.06.2012, 14:29     В чем ошибка? #1
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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#include "stdio.h"
#include "iostream"
#include "locale.h"
#include <conio.h>
 
using namespace std;
 
class node
 {
 public:
 int val;
 node *next;
 node(int v, node *n){val = v; next = n;}
 };
 
class queue
{  private: 
    node *first, *last;
    int count;
   public: 
      queue(){first=0; last=0; count=0;}
      queue(queue&);
      ~queue();
      void push(int);
      int pop();
      void print_queue();
      void deletion(int);
      void deletion2(int);
};
 
queue::~queue()
{
    while(first!=0)
        { node * p=first->next;
          delete first;
          first=p;
        }
}
 
queue::queue(queue &mp)
{
 queue rev1; rev1.first=mp.first; rev1.last=mp.last; rev1.count=mp.count;
 queue rev;
 for (int i=0; i<mp.count; i++) 
 {
 rev.push(rev1.pop());
 }
}
 
void queue::push(int val)
{    node *tmp=new node(val, 0);
        if(count == 0) 
    {
        first = tmp;
        last = tmp;
        count++;
    }
    else
    {
        last->next = tmp;
        last = last->next;
        count++;
    }
}
 
int queue::pop()
{
    int val = first->val;
    node *tmp = first;
    first = first->next;
    delete tmp;
    count--;
    return val;
}
 
 
void queue::deletion(int key)
{
    int i, val, size = count;
    cout << "\nВыполнено удаление " << key << endl;
    for(i = 0; i < size; i++)
    {
        val = pop();
        if(val != key) {push(val);}
    }
}
 
void queue::deletion2(int numb)
{
    if(numb < 0 || numb > count) 
    {
        cout << "\nОперация невозможна\n";
        return;
    }
    int i, size = count;
    cout << "\nВыполнено удаление элемента с номером" << numb << endl;
    for(i = 0; i < size; i++)
    {
        if(i != numb-1) {push(pop());}
        else {pop();}
    }
}
 
void queue::print_queue()
{
    int i, val;
    if(count != 0)
    {
        cout << "\nСодержимое очереди:\n";
        for(i = 0; i < count; i++)
        {
            val = pop();
            cout << val << "  ";
            push(val);
        }
        cout << endl;
    }
    else cout << "\nОчередь пуста\n";
}
 
int main(int argc, char argv[])
{
    setlocale(LC_ALL, "rus");
    queue MyQueue;
 
    MyQueue.push(2);
    MyQueue.push(0);
    MyQueue.push(1);
    MyQueue.push(3);
    MyQueue.push(4);
    MyQueue.push(2);
 
    MyQueue.print_queue();
    queue MyQueue2(MyQueue);
    MyQueue2.print_queue();
    MyQueue.deletion2(2);
    MyQueue.print_queue();
    MyQueue2.print_queue();
    getch ();
    return 0;
}

после компиляции не выводит никаких ошибок

1>------ Построение начато: проект: долод, Конфигурация: Debug Win32 ------
1>Построение начато 20.06.2012 14:26:27.
1>ClCompile:
1> Пропуск... (изменения не обнаружены)
1> апапа.cpp
1>
1>Построение успешно завершено.
1>
1>Затраченное время: 00:00:00.87
========== Построение: успешно: 1, с ошибками: 0, без изменений: 0, пропущено: 0 ==========

но сразу после этого выскакивает белое окошко со следующей записью

"Expression: BLOCK_TIME_IS_VALID (pHead -> тBlockUse)"
В чем дело?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.06.2012, 14:29     В чем ошибка?
Посмотрите здесь:

в чем ошибка? C++
C++ в чем ошибка?
В чем ошибка? C++
В чем ошибка C++
C++ В чем ошибка?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
darkknight2008
 Аватар для darkknight2008
61 / 61 / 6
Регистрация: 16.10.2011
Сообщений: 200
20.06.2012, 14:46     В чем ошибка? #2
У тебя совершенно неверный конструктор копирования.
Asgar
0 / 0 / 0
Регистрация: 14.06.2012
Сообщений: 6
22.06.2012, 19:32  [ТС]     В чем ошибка? #3
А как будет правильно? Не могли бы написать, пожалуйста
cppGhost
32 / 30 / 1
Регистрация: 21.06.2012
Сообщений: 91
22.06.2012, 20:01     В чем ошибка? #4
C++
1
2
3
4
5
6
7
8
9
10
11
queue::queue(queue &mp)
{
    count = 0;
    node *curr = mp.first;
 
    while(curr != 0)
    {
        push(curr->val);
        curr = curr->next;
    }       
}
и вроде заработало
darkknight2008
 Аватар для darkknight2008
61 / 61 / 6
Регистрация: 16.10.2011
Сообщений: 200
22.06.2012, 20:02     В чем ошибка? #5
C++
1
2
3
4
5
6
7
8
9
10
11
queue::queue(queue &mp) : count(mp.count)
{
  node **inc1 = &first, *inc2 = mp.first;
  while (inc2->next != NULL)
  {
     *inc1 = new node(inc2->val, NULL);
     *inc1 = &(*inc1)->next; 
  }
  *inc1 = new node(inc2->val, NULL);
  last = *inc1;
}
Если я не ошибаюсь, то у меня это выглядело бы как-то так... Если знать, как обращаться с указателями, то ничего сложного.
cppGhost
32 / 30 / 1
Регистрация: 21.06.2012
Сообщений: 91
22.06.2012, 20:10     В чем ошибка? #6
указатель на указателе =)) черт ногу сломит
darkknight2008
22.06.2012, 20:19
  #7

Не по теме:


xD значит я стою выше черта))

alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.06.2012, 02:36     В чем ошибка? #8
darkknight2008, у меня компилятор 8 строку не принимает.

Добавлено через 38 минут
И вообще, этот код не рабочий. В цикле while, указатель inc2 не изменяется, поэтому цикл будет бесконечным.
darkknight2008
 Аватар для darkknight2008
61 / 61 / 6
Регистрация: 16.10.2011
Сообщений: 200
23.06.2012, 08:32     В чем ошибка? #9
Ты прав. Тогда будет так.
C++
1
2
3
4
5
6
7
8
9
10
11
12
queue::queue(queue &mp) : count(mp.count)
{
  node **inc1 = &first, *inc2 = mp.first;
  while (inc2->next != NULL)
  {
     *inc1 = new node(inc2->val, NULL);
     inc1 = &(*inc1)->next; 
     inc2 = inc2->next;
  }
  *inc1 = new node(inc2->val, NULL);
  last = *inc1;
}
У меня никогда с хоу на глаз не получалось определить рабочий ли код или нет((

Добавлено через 24 минуты
ИМХО, и вообще проверка по шагам в компиляторе - лучший способ для поиска ошибок!
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.06.2012, 23:18     В чем ошибка? #10
Так другое дело. Всё работает.

Добавлено через 7 часов 57 минут
Есть один недостаток у этих конструкторов копирования. Происходит сбой, если в программе копируется пустая очередь. В варианте darkknight2008, сбой происходит при копировании, а в варианте cppGhost - при работе деструктора в конце программы. Если в деструкторе вместо: while(first!=0) написаать: while (count != 0), то вариант cppGhost работает нормально.
Invader_Zim
Twilight Parasite
 Аватар для Invader_Zim
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 907
23.06.2012, 23:23     В чем ошибка? #11
перегружай оператор = и не парься)
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.06.2012, 00:38     В чем ошибка? #12
В его коде он не используется.
Invader_Zim
Twilight Parasite
 Аватар для Invader_Zim
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 907
24.06.2012, 01:10     В чем ошибка? #13
alsav22, а можно взять и перегрузить. И конструктор копирования пилить не надо)
Asgar
0 / 0 / 0
Регистрация: 14.06.2012
Сообщений: 6
24.06.2012, 01:10  [ТС]     В чем ошибка? #14
а как в конце показать работу конструкторов? у меня преподаватель спросил, я попробовал сделать, и не получилось
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
24.06.2012, 01:26     В чем ошибка? #15
кривой вопрос какой-то.
можно в коде найти вызов конструктора и сказать что вот он тут вызывается.
или же в тело конструктора вставить код, который будет на экран печатать сообщение о том, что вот мол я конструктор, меня вызвали.
Короче, что значит "показать работу конструкторов", и в каком "конце"?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.06.2012, 07:06     В чем ошибка? #16
Цитата Сообщение от Invader_Zim Посмотреть сообщение
alsav22, а можно взять и перегрузить. И конструктор копирования пилить не надо)
C++
1
queue MyQueue2(MyQueue);
Здесь работает конструктор копирования. Если его не пилить, то сработает неявный конструктор копирования (скопирует ссылки, а не узлы). При удалении объектов будет сбой. Или не так?
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
24.06.2012, 07:13     В чем ошибка? #17
Здесь работает конструктор копирования. Если его не пилить, то сработает неявный конструктор копирования (скопирует ссылки, а не узлы). При удалении объектов будет сбой. Или не так?
Все так. Более того, в первом посте конструктор копирования реализован неверно. От этого и ошибка.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.06.2012, 08:36     В чем ошибка? #18
Лучше всего и конструктор копирования определить, и оператор присваивания перегрузить.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.06.2012, 12:51     В чем ошибка?
Еще ссылки по теме:

C++ В чем ошибка?
в чем ошибка? C++
C++ В чем ошибка?

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

Или воспользуйтесь поиском по форуму:
Borkot
 Аватар для Borkot
4 / 4 / 0
Регистрация: 05.05.2012
Сообщений: 182
Записей в блоге: 1
24.06.2012, 12:51     В чем ошибка? #19
Если кто знает,подсакжите пожайлуста в чем ошибка у меня.
Задание такое:
Даны два массива, упорядоченных по возрастанию: А[n] и B[m]. Сформируйте массив C[n+m], состоящий из элементов массивов А и В, упорядоченный по возрастанию.
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
#include<stdlib.h>
#include<time.h>
#include<iostream>
int gener_sl();
int gener_sl2();
int Sloj(int Ap[],int Bp[],const int);
const int size=10;
int arra[size];
int array1[size];
template <typename T>
void selectSort(T a, long size) {
    long i, j, k; 
    T x;
 
    for(i=0;i<size;i++) {       //i - номер текущего шага
        k=i;
        x=a[i];
 
        for(j=i+1;j<size;j++)   //цикл выбора наименьшего элемента
            if(a[j]<x){
                k=j;
                x=a[j];   // k - индекс наименьшего элемента
            }
        a[k]=a[i];
        a[i]=x;     // меняем местами наименьший с a[i]
    }
}
void main()
{
  gener_sl();
  selectSort(arra,size);
  gener_sl2();
  selectSort(array1,size);
  Sloj(arra,array1,size);
}
int Sloj(int Ap[],int Bp[],const int)
{
  int Rez[10];
  for(int i=0;i<size;i++)
  {
    Rez[i]=Ap[i]+Bp[i];
  }
cout<<Rez<<'\n';
  return 0;
}
int gener_sl()
{
    srand(time(NULL));
    for (int i=0;i<10;i++) 
    {
        // генерация случайного числа и запись его в текущий элемент массива
        arra[i]=rand()%100;
 
        // показ значения элемента на экран
    }
return 0;
}
int gener_sl2()
{
    srand(time(NULL));
    for (int i=0;i<10;i++) 
    {
        // генерация случайного числа и запись его в текущий элемент массива
        array1[i]=rand()%100;
    }
    return 0;
}
Пишет что ошибка,IntelliSense: identifier "cout" is undefined -немогу понять вроде и библиотеку подуключил иостреам аа cout подчеркивает.(Visual studio 2010)

Добавлено через 2 часа 15 минут
Разобрался надо было дописать строчку
Код
using name std;
а всему виной моя невнимательность
Yandex
Объявления
24.06.2012, 12:51     В чем ошибка?
Ответ Создать тему
Опции темы

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