Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
green_cocaine
0 / 0 / 0
Регистрация: 04.11.2015
Сообщений: 23
#1

Значение типа "void" нельзя использовать для инициализации сущности типа "int" - C++

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

Не понимаю, почему компилятор считает, что s.pop() это значение типа "void".. он же вернет этот удаляемый элемент? Как исправить?
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
void DFS(int x, int required) 
    {
        stack <int> s;
 
        bool *visited = new bool[size + 1];
        int i;
        for (i = 0; i <= size; i++)
            visited[i] = false;
        s.push(x);
        visited[x] = true;
        if (x == required) return;
        cout << "Depth first Search starting from vertex " << x << " : " << endl;
        while (!s.empty()) 
        {
            int k = s.pop(); //???
            if (k == required) break;
            cout << k << " ";
            for (i = size; i >= 0; --i)
                if (isConnected(k, i) && !visited[i]) 
                {
                    s.push(i);
                    visited[i] = true;
                }
        }
        cout << endl;
        delete[] visited;
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.03.2016, 18:22
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Значение типа "void" нельзя использовать для инициализации сущности типа "int" (C++):

Значение типа "int" нельзя использовать для сущности типа "conduction"
Добрый вечер. кто может проверить в своем компиляторе, работает данная...

Значение типа "const char *" нельзя использовать для инициализации сущности "char*"
Книга Пратта, Лекции и Упражнения. 750 страница, листинг 14.8. В объявлении...

"Значение типа float* нельзя использовать для инициализации сущности типа float"
#include &lt;math.h&gt; #include&lt;iostream&gt; #include &lt;iomanip&gt; #include&lt;conio.h&gt;...

Динамические массивы: значение типа "int *" нельзя присвоить сущности типа "int"
МАССИВЫ: динамические массива ОШИБКА:значение типа &quot;int *&quot; нельзя присвоить...

Ошибка: "Значение типа float нельзя присвоить сущности типа int"
При компиляции в Visual C++ получается такая ошибка: &quot;Значение типа float...

Error: значение типа "const char" нельзя присвоить сущности типа "double"
#include &lt;iostream&gt; #include &lt;iomanip&gt;// using namespace std; void...

22
nd2
2828 / 2398 / 1052
Регистрация: 29.01.2016
Сообщений: 8,022
15.03.2016, 18:28 #2
Лучший ответ Сообщение было отмечено green_cocaine как решение

Решение

Цитата Сообщение от green_cocaine Посмотреть сообщение
он же вернет этот удаляемый элемент?
http://www.cplusplus.com/reference/stack/stack/pop/
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4372 / 2347 / 654
Регистрация: 18.10.2014
Сообщений: 3,996
15.03.2016, 18:43 #3
Цитата Сообщение от green_cocaine Посмотреть сообщение
Не понимаю, почему компилятор считает, что s.pop() это значение типа "void"..
Потому что это так и есть.

Цитата Сообщение от green_cocaine Посмотреть сообщение
он же вернет этот удаляемый элемент?
Нет, не вернет.
0
eagl69
5 / 10 / 7
Регистрация: 12.10.2011
Сообщений: 505
15.03.2016, 18:57 #4
Цитата Сообщение от green_cocaine Посмотреть сообщение
void DFS(int x, int required)
void значит что функция ничего не возвращает.

Добавлено через 1 минуту
хотите вернуть объявляйте int или глобальную переменную...
0
castaway
Эксперт С++
4926 / 3033 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
15.03.2016, 19:24 #5
eagl69, при чём тут функция DFS, если речь о члене-функции pop классового типа stack!?
0
zss
Модератор
Эксперт С++
6953 / 6515 / 4136
Регистрация: 18.12.2011
Сообщений: 17,201
Завершенные тесты: 1
15.03.2016, 19:40 #6
Для понимания того, как работать со стеком, привожу пример из MS Help
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
// stack_pop.cpp
// compile with: /EHsc
#include <stack>
#include <iostream>
 
int main( )
{
   using namespace std;
   stack <int> s1, s2;
 
   s1.push( 10 );
   s1.push( 20 );
   s1.push( 30 );
 
   stack <int>::size_type i;
   i = s1.size( );
   cout << "The stack length is " << i << "." << endl;
 
   i = s1.top( );    
   cout << "The element at the top of the stack is "
        << i << "." << endl;
 
   s1.pop( );
 
   i = s1.size( );
   cout << "After a pop, the stack length is " 
        << i << "." << endl;
 
   i = s1.top( );
   cout << "After a pop, the element at the top of the stack is "
        << i << "." << endl;
}
0
green_cocaine
0 / 0 / 0
Регистрация: 04.11.2015
Сообщений: 23
15.03.2016, 21:12  [ТС] #7
спасибо, я исправила как вы показали в примере..
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
void DFS(int x, int required) 
    {
        stack <int> s;
        bool *visited = new bool[size + 1];
        int i;
        stack<int>::size_type k;
        for (i = 0; i <= size; i++)
            visited[i] = false;
        s.push(x);
        visited[x] = true;
        if (x == required) return;
        cout << "Depth first Search starting from vertex " << x << " : " << endl;
        while (!s.empty()) 
        {
            k = s.top();
            s.pop();
            if (k == required) 
                break;
            cout << k << " ";
            for (i = size; i >= 0; --i)
                if (isConnected(k, i) && !visited[i]) 
                {
                    s.push(i);
                    visited[i] = true;
                }
        }
        cout << endl;
        delete[] visited;
    }
но теперь вылетает при запуске почему-то..
что теперь не так?
0
castaway
Эксперт С++
4926 / 3033 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
15.03.2016, 21:21 #8
Цитата Сообщение от green_cocaine Посмотреть сообщение
что теперь не так?
Скажите, чему равен size в этой функции, и чему равен x в 10-й строке?
0
green_cocaine
0 / 0 / 0
Регистрация: 04.11.2015
Сообщений: 23
15.03.2016, 21:31  [ТС] #9
Цитата Сообщение от castaway Посмотреть сообщение
Скажите, чему равен size в этой функции, и чему равен x в 10-й строке?
size = 6, а x=0

Вообще, само задание состоит в том, что из текстового файла подается матрица смежности, и по этой матрице нужно построить остовное дерево поиском в глубину
0
castaway
Эксперт С++
4926 / 3033 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
15.03.2016, 21:54 #10
Цитата Сообщение от green_cocaine Посмотреть сообщение
size = 6, а x=0
Вообще, само задание состоит в том, что из текстового файла подается матрица смежности, и по этой матрице нужно построить остовное дерево поиском в глубину
Если всё происходит так как вы говорите, то я не вижу причин для "вылетания" программы.
isConnected - это что такое?
0
zss
Модератор
Эксперт С++
6953 / 6515 / 4136
Регистрация: 18.12.2011
Сообщений: 17,201
Завершенные тесты: 1
15.03.2016, 21:59 #11
Лучший ответ Сообщение было отмечено green_cocaine как решение

Решение

green_cocaine, попробуйте воспользоваться отладчиком
http://www.cyberforum.ru/visual-studio/thread1262479.html
0
green_cocaine
0 / 0 / 0
Регистрация: 04.11.2015
Сообщений: 23
15.03.2016, 22:05  [ТС] #12
Цитата Сообщение от castaway Посмотреть сообщение
isConnected - это что такое?
Проверка, связаны ли вершины ребром или нет
C++
1
2
3
4
    bool isConnected(int x, int y)
    {
        return (VecGraph[x - 1][y - 1] == 1);
    }
0
castaway
Эксперт С++
4926 / 3033 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
15.03.2016, 22:12 #13
Цитата Сообщение от green_cocaine Посмотреть сообщение
Проверка, связаны ли вершины ребром или нет
Хорошо, копнём глубже, что такое VecGraph?
0
green_cocaine
0 / 0 / 0
Регистрация: 04.11.2015
Сообщений: 23
15.03.2016, 22:27  [ТС] #14
castaway, а VecGraph это двумерный вектор
Вот. Это всё, что есть. И всё, кроме DFS работает..
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
#pragma once
 
typedef vector<vector<int>>::iterator graph_iterator;
class Graph
{
private:
    vector<vector<int> >VecGraph;
    int size;
public:
    Graph() {};
    ~Graph() {};
    void Resize();
    vector<vector<int> > LoadGraph();
    void SaveGraph();
    void Display();
    int p(Graph *G);
 
    bool isConnected(int x, int y)
    {
        return (VecGraph[x - 1][y - 1] == 1);
    }
    void DFS(int x, int required) 
    {
        stack <int> s;
        bool *visited = new bool[size + 1];
        int i;
        stack<int>::size_type k;
        for (i = 0; i <= size; i++)
            visited[i] = false;
        s.push(x);
        visited[x] = true;
        if (x == required) return;
        cout << "Depth first Search starting from vertex " << x << " : " << endl;
        while (!s.empty()) 
        {
            k = s.top();
            s.pop();
            if (k == required) 
                break;
            cout << k << " ";
            for (i = size; i >= 0; --i)
                if (isConnected(k, i) && !visited[i]) 
                {
                    s.push(i);
                    visited[i] = true;
                }
        }
        cout << endl;
        delete[] visited;
    }
};
 
vector<vector<int> > Graph::LoadGraph()
{
    std::ifstream f("test.txt");
    char *str = new char[1024];
    int i = 0;
    ifstream base("test.txt");
    while (!base.eof())
    {
        base.getline(str, 1024, '\n');
        i++;
    }
    base.close();
    delete str;
    size = i;
    while (!f.eof())
    {
        VecGraph.push_back(vector<int>(size));
        copy_n(istream_iterator<int>(f), size, VecGraph.back().begin());
    }
    f.close();
    return VecGraph;
}
 
void Graph::SaveGraph()
{
    ofstream ofst("output.txt");
    for (graph_iterator it = VecGraph.begin(); it != VecGraph.end(); ++it)
    {
        copy(it->begin(), it->end(), ostream_iterator <int>(ofst, " "));
        ofst << endl;
    }
    cout << "Граф сохранен в файл" << endl;
}
 
void Graph::Resize()
{
    VecGraph.resize(size);
    for (int i = 0; i<size; ++i)
        VecGraph[i].resize(size);
}
 
void Graph::Display()
{
    for (int i = 0; i<size; ++i)
    {
        copy(VecGraph[i].begin(), VecGraph[i].end(), ostream_iterator<int>(cout, " "));
        cout << endl;
    }
    for (int i = 0; i<size; ++i)
    {
        for (int j = 0; j<size; ++j)
        {
            if (VecGraph[i][j] == 1)
                cout << i + 1 << " node is connected with " << j + 1 << " node.\n";
        }
    }
}
 
int Graph::p(Graph *G)
{
    return G->size;
}
И то, что в файле test.txt:
0 1 1 0 0 0
1 0 1 1 0 0
1 1 0 1 1 1
0 1 1 0 0 1
0 0 1 0 0 1
0 0 1 1 1 0
0
nd2
2828 / 2398 / 1052
Регистрация: 29.01.2016
Сообщений: 8,022
15.03.2016, 23:44 #15
Цитата Сообщение от green_cocaine Посмотреть сообщение
но теперь вылетает при запуске почему-то..
Пишет что-нибудь, когда вылетает?
0
green_cocaine
0 / 0 / 0
Регистрация: 04.11.2015
Сообщений: 23
16.03.2016, 18:12  [ТС] #16
nd2, Вот это пишет:
Debug Assertion Failed!
Program: C:\Windows\system32\MSVCP140D.dll
File: d:\program files\visual studio\vc\include\vector
Line: 1232
Expression: vector subscript out of range
For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.
(Press Retry to debug the application)
0
castaway
Эксперт С++
4926 / 3033 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
16.03.2016, 18:23 #17
У вас выход за пределы диапазона std::vector. 11-е сообщение в помощь.
0
nd2
2828 / 2398 / 1052
Регистрация: 29.01.2016
Сообщений: 8,022
16.03.2016, 19:29 #18
Цитата Сообщение от green_cocaine Посмотреть сообщение
а x=0
C++
1
2
3
4
5
6
7
8
9
10
s.push(x);
//...
k = s.top(); // k = 0
//...
if (isConnected(k, i) && !visited[i])
//...
bool isConnected(int x, int y)
{
    return (VecGraph[x - 1][y - 1] == 1); // первый индекс 0 - 1
}
0
castaway
Эксперт С++
4926 / 3033 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
16.03.2016, 20:09 #19
nd2 правильно заметил. green_cocaine, зачем вы отнимаете единицу в 20-й строке?
0
green_cocaine
0 / 0 / 0
Регистрация: 04.11.2015
Сообщений: 23
17.03.2016, 13:14  [ТС] #20
castaway, потому что преподаватель при проверке будет считать вершины начиная с 1, а не с 0.. ну даже если убрать эту -1 проблема осталась
0
17.03.2016, 13:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.03.2016, 13:14
Привет! Вот еще темы с решениями:

Ошибка: "const char[78]" нельзя использовать для инициализации сущности типа char[12]
class Goroskop { private: char name_Zodiak; public: char name_Zodiak =...

Значение типа "char *" нельзя присвоить сущности типа "LPWSTR"
значение типа &quot;char *&quot; нельзя присвоить сущности типа &quot;LPWSTR&quot; void...

Значение типа "char *" нельзя присвоить сущности типа "LPWSTR"
как исправить эту ошибку значение типа &quot;char *&quot; нельзя присвоить сущности типа...

Значение типа "int*" нельзя присвоить сущности типа int
#include &lt;iostream&gt; using namespace std; int sort(int k, int p, int b, int...


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

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

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