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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Supernatural
301 / 156 / 29
Регистрация: 22.11.2010
Сообщений: 1,554
#1

Создание стека - код не компилируется - C++

01.12.2013, 01:46. Просмотров 1162. Ответов 14
Метки нет (Все метки)

Пытаюсь разобраться с динамическими структурами данных. Списал код, но не компилируется
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#pragma hdrstop
#pragma argsused
 
#include <tchar.h>
#include <iostream.h>
 
void main()
{
struct Stek
    {
    int znachenie;
    Stek *p;
    };
Stek *first (int d);
void push (Stek **top, int d);
int pop(Stek **top);
 
Stek *top=first (1);
for (int i = 2; i < 6; i++) push (&top,i);
while (top) cout<<pop(&top)<<" ";
 
cin>>" ";
}
Текст ошибки описан в спойлере, не совсем понимаю
Кликните здесь для просмотра всего текста
Checking project dependencies...
Compiling Project1.cbproj (Debug, Win32)
brcc32 command line for "Project1.vrc"
c:\program files (x86)\embarcadero\rad studio\12.0\bin\cgrc.exe -c65001 "Project1.vrc" -foProject1.res
ilink32 command line
c:\program files (x86)\embarcadero\rad studio\12.0\bin\ilink32.exe -L.\Win32\Debug;"c:\program files (x86)\embarcadero\rad
studio\12.0\lib\Win32\debug";"D:\Мои документы\c\console\Стек";"c:\program files (x86)\embarcadero\rad studio\12.0\lib\win32\release";"c:\program
files (x86)\embarcadero\rad studio\12.0\lib\win32\release\psdk";"C:\Program Files (x86)\FastReports\LibD19";"C:\Program Files
(x86)\Raize\CS5\Lib\RS-XE5\Win32";"C:\Users\Public\Documents\RAD Studio\12.0\DCP" -j.\Win32\Debug;"c:\program files (x86)\embarcadero\rad
studio\12.0\lib\Win32\debug";"D:\Мои документы\c\console\Стек";"c:\program files (x86)\embarcadero\rad studio\12.0\lib\win32\release";"c:\program
files (x86)\embarcadero\rad studio\12.0\lib\win32\release\psdk";"C:\Program Files (x86)\FastReports\LibD19";"C:\Program Files
(x86)\Raize\CS5\Lib\RS-XE5\Win32";"C:\Users\Public\Documents\RAD Studio\12.0\DCP" -l.\Win32\Debug -v -G8 -Tpe c0x32 .\Win32\Debug\File1.obj ,
.\Win32\Debug\Project1.exe , .\Win32\Debug\Project1.map , import32.lib cw32mt.lib , , Project1.res
[ilink32 Error] Error: Unresolved external 'first(int)' referenced from D:\МОИ ДОКУМЕНТЫ\C\CONSOLE\СТЕК\WIN32\DEBUG\FILE1.OBJ
[ilink32 Error] Error: Unresolved external 'push(Stek * *, int)' referenced from D:\МОИ ДОКУМЕНТЫ\C\CONSOLE\СТЕК\WIN32\DEBUG\FILE1.OBJ
[ilink32 Error] Error: Unresolved external 'pop(Stek * *)' referenced from D:\МОИ ДОКУМЕНТЫ\C\CONSOLE\СТЕК\WIN32\DEBUG\FILE1.OBJ
[ilink32 Error] Error: Unable to perform link
Failed
Elapsed time: 00:00:01.6
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.12.2013, 01:46
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Создание стека - код не компилируется (C++):

В формате .cpp код компилируется, а в .c не компилируется - C++
1).Подскажите почему в формате .cpp код компилируется, а в .c не компилируется 2). Как сделать так, чтобы компилировалось в .c? ...

Не компилируется код - C++
#include &lt;QCoreApplication&gt; #include &lt;iostream&gt; using std::cout; using std::endl; int squareByValue(int); // прототип передача...

Не компилируется код - C++
main.cpp #include &lt;iostream&gt; #include &lt;fstream&gt; #include &quot;menu.h&quot; void foo1() { std::cout &lt;&lt; 1; } void foo2()...

Код не компилируется - C++
не пойму, почему не компилируется #include &lt;iostream&gt; //#include &lt;new&gt; //#include &lt;cstdlib&gt; using namespace std; class loc{ ...

Код не компилируется - C++
Код не компилируется, компилятор выдаёт очень много ошибок! Скажите пожалуйста что исправить? Заранее благодарен! #include...

Код не компилируется - C++
#include &lt;iostream&gt; #define _USE_MATH_DEFINES #include &lt;math.h&gt; double circle_area(int radius); using namespace std; int...

14
Alex566
240 / 152 / 18
Регистрация: 03.04.2013
Сообщений: 317
01.12.2013, 01:56 #2
Не компилирует потому что вы объявляете функцию внутри функции.
1
Supernatural
301 / 156 / 29
Регистрация: 22.11.2010
Сообщений: 1,554
02.12.2013, 08:55  [ТС] #3
косяк, это уже отсебячина. Писал код выброчно

Добавлено через 11 минут
другой вопрос:

C++
1
2
3
4
5
6
7
8
9
void push (Stek **top,int d)
{
Stek *pv=new Stek;
pv->d=d;
pv->p=*top;
*top=pv;
}
 ...
for (int i = 2; i < 6; i++) push (&top,i);
Процедура Push принимает в параметрах указатель на указатель **top. Но при вызове из главного тела программы push принимает параметр &top. Читал про "амперсанд", но то получается ссылка.

оригинал кода

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
#pragma hdrstop
#pragma argsused
 
#include <tchar.h>
#include <stdio.h>
#include <iostream.h>
struct Stek
    {
    int d;
    Stek *p;
    };
 
Stek *first (int d)
{
Stek *pv=new Stek;
pv->d=d;
pv->p=0;
return pv;
}
int pop (Stek **top)
{
int tmp=(*top)->d;
Stek *pv=*top;
*top=(*top)->p;
delete pv;
return tmp;
}
void push (Stek **top,int d)
{
Stek *pv=new Stek;
pv->d=d;
pv->p=*top;
*top=pv;
}
void main()
{
Stek *top=first (1);
for (int i = 2; i < 6; i++) push (&top,i);
while (top) cout<<pop(&top)<<" ";
cin>>" ";
}
Добавлено через 8 минут
1. Процедура Push принимает в параметрах указатель на указатель **top. Но при вызове из главного тела программы push принимает параметр &top. Читал про "амперсанд", но то получается ссылка.
2. Также функция pop должна принимать указатель на указатель **top, но при вызове в параметре &top.
3. В цикле while top указывается без каких-либо знаков * &, как это понять. Ведь **top является указателем на указатель.
4. *top=(*top)->p; зачем тут скобки и здесь всего лишь одна звездочка. Снова непонятка
5. Указатель на указатель - зачем оно? Нельзя ли просто указатель? В чем суть?

Добавлено через 5 часов 50 минут
ап.

Добавлено через 7 часов 28 минут
ап.

Добавлено через 8 часов 18 минут
ап.
0
Brain_Dead
9 / 8 / 2
Регистрация: 25.09.2013
Сообщений: 35
02.12.2013, 09:18 #4
Цитата Сообщение от Supernatural Посмотреть сообщение
1. Процедура Push принимает в параметрах указатель на указатель **top. Но при вызове из главного тела программы push принимает параметр &top. Читал про "амперсанд", но то получается ссылка.
C++
1
Stek *top
переменная top имеет тип Stek*. Соответственно, ссылка на неё имеет тип Stek**.

Цитата Сообщение от Supernatural Посмотреть сообщение
3. В цикле while top указывается без каких-либо знаков * &, как это понять. Ведь **top является указателем на указатель.
Да, является, но все указатели сами по себе - числа. Цикл выполняется, пока он не нуль. Нуль записан в самом первом элементе функцией first. Наткнувшись на него, цикл завершится.

Цитата Сообщение от Supernatural Посмотреть сообщение
*top=(*top)->p; зачем тут скобки и здесь всего лишь одна звездочка. Снова непонятка
В аргументах стоит Stek** top. - указатель на адрес последнего добавленного элемента. Нам нужен не указатель на адрес, имеющий тип Stek**, а сам адрес, имеющий тип Stek*. В него записывается адрес следующего элемента, который ниже.

Цитата Сообщение от Supernatural Посмотреть сообщение
Указатель на указатель - зачем оно? Нельзя ли просто указатель? В чем суть?
Нам нужно передать этот указатель по ссылке, чтобы действия выполнялись с оригинальными адресами, а не с их копиями, так же как в других функциях происходит передача параметров по ссылке.

P.S. Убери из main строчку cin >> " ", иначе у тебя код не заработает. Заголовки <stdio> и <tchar> тоже не нужны, их функции нигде не используются.
0
Supernatural
301 / 156 / 29
Регистрация: 22.11.2010
Сообщений: 1,554
02.12.2013, 11:02  [ТС] #5
В аргументах стоит Stek** top. - указатель на адрес последнего добавленного элемента. Нам нужен не указатель на адрес, имеющий тип Stek**, а сам адрес, имеющий тип Stek*. В него записывается адрес следующего элемента, который ниже.
почему тогда не записать*top=*top->p?
все никак не пойму - откуда здесь связь между ссылкой и указателем на указатель
0
Brain_Dead
9 / 8 / 2
Регистрация: 25.09.2013
Сообщений: 35
02.12.2013, 11:17 #6
Цитата Сообщение от Supernatural Посмотреть сообщение
почему тогда не записать*top=*top->p?
Стрелка не сработает.

Цитата Сообщение от Supernatural Посмотреть сообщение
все никак не пойму - откуда здесь связь между ссылкой и указателем на указатель
Ссылка на любую переменную (допустим, int& a) передаёт адрес на неё. Кроме того, она нужна, чтобы не копировать локальную переменную.

А у нас переменная имеет тип указатель - Stek* top. Так вот, нам нужна ссылка на этот указатель. Мы передаём адрес на этот указатель, а не сам указатель.
Тут то же самое, что и обыкновенная передача аргументов в функцию по ссылке.

Добавлено через 5 минут
Поскольку указатель на указатель - это переменная, хранящая адрес на переменную типа int*, то она также имеет тип int**, ну или double**, или Stek**, или ещё что-нибудь. У них тип просто один и тот же.
0
Kuzia domovenok
2043 / 1888 / 172
Регистрация: 25.03.2012
Сообщений: 6,502
Записей в блоге: 1
02.12.2013, 14:06 #7
Brain_Dead, не путай людей своими рассуждениями о ссылках. Оператор (&) в том значении, в каком тут использован, не имеет никакого отношения к ссылкам! Употреблять слово "ссылка", объясняя новичку этот оператор, просто преступно!
Этот оператор был введен уже в языке си, когда понятия "ссылка" не было! Это оператор взятия адреса!
0
Supernatural
301 / 156 / 29
Регистрация: 22.11.2010
Сообщений: 1,554
02.12.2013, 17:23  [ТС] #8
так что с кодом? я в непонятках
0
Brain_Dead
9 / 8 / 2
Регистрация: 25.09.2013
Сообщений: 35
02.12.2013, 18:58 #9
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Оператор (&) в том значении, в каком тут использован, не имеет никакого отношения к ссылкам!
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Это оператор взятия адреса!
Ты прав. Здесь нет никаких ссылок. Оператор & используется только push(&top) и pop(&top), где &top означает, что вместо переменной top передаётся её адрес.

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Употреблять слово "ссылка", объясняя новичку этот оператор, просто преступно!
допустим, он его употребляет сам.

Цитата Сообщение от Supernatural Посмотреть сообщение
так что с кодом?
Этот - рабочий

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
#include <conio.h>
#include <iostream>
 
using namespace std;
 
struct Stek
{
    int d;
    Stek *p;
};
 
Stek* first(int d)
{
    Stek *pv = new Stek;
    pv->d = d;
    pv->p = 0;
    return pv;
}
 
int pop (Stek **top)
{
    int tmp = (*top)->d;
    Stek *pv = *top;
    *top = (*top)->p;
    delete pv;
    return tmp;
}
 
void push (Stek **top, int d)
{
    Stek *pv = new Stek;
    pv->d = d;
    pv->p = *top;
    *top = pv;
}
 
void main()
{
    Stek *top = first(1);
    for(int i = 2; i < 6; i++)
    {
        push (&top, i);
    }
    while(top)
    {
        cout << pop(&top) << " ";
    }
    _getch();
}
Добавлено через 4 минуты
Рекомендуется также прочитать вот это.
http://ru.wikipedia.org/wiki/%D0%A1%...0%B0_(C%2B%2B)
0
Supernatural
301 / 156 / 29
Регистрация: 22.11.2010
Сообщений: 1,554
02.12.2013, 20:47  [ТС] #10
да я знаю, что код рабочий. Я пытался выждать подробных объяснений, но по ходу не дождусь. Что касается ссылок - я прочитал из книги, но все равно не понял - каким боком она имеет отношение к указателю на указатель
0
Brain_Dead
9 / 8 / 2
Регистрация: 25.09.2013
Сообщений: 35
02.12.2013, 21:35 #11
Цитата Сообщение от Supernatural Посмотреть сообщение
Я пытался выждать подробных объяснений, но по ходу не дождусь.
А что именно тебе непонятно? Что в функции

C++
1
2
3
int pop (Stek **top)
{
}
и

C++
1
2
3
void push (Stek **top, int d)
{
}
передаётся &top?
0
Supernatural
301 / 156 / 29
Регистрация: 22.11.2010
Сообщений: 1,554
03.12.2013, 08:11  [ТС] #12
не понятно с амперсандом. Ведь он прикрепляется к типу ссылкам
0
Brain_Dead
9 / 8 / 2
Регистрация: 25.09.2013
Сообщений: 35
03.12.2013, 08:43 #13
Цитата Сообщение от Supernatural Посмотреть сообщение
не понятно с амперсандом. Ведь он прикрепляется к типу ссылкам
Здесь & - оператор взятия адреса. Возвращает адрес переменной top. В зависимости от того, какой тип имеет переменная top, возвращенный адрес тоже имеет разный тип. Ссылок как таковых тут нет.
В блоке "main" переменная top задана Stek* top. Она имеет тип Stek*, поэтому её возвращённый адрес будет иметь тип Stek**.

Вот другой пример:
int k;
int* pk = &k;

Здесь мы возвращаем адрес переменной int k. Адрес имеет тип int*.
Почитай статью в википедии, о которой я упоминал, там всё объясняется довольно неплохо.
1
Kuzia domovenok
2043 / 1888 / 172
Регистрация: 25.03.2012
Сообщений: 6,502
Записей в блоге: 1
03.12.2013, 19:21 #14
Цитата Сообщение от Supernatural Посмотреть сообщение
Ведь он прикрепляется к типу ссылкам
не только
в данном примере ссылки вообще не при чём.
0
Supernatural
301 / 156 / 29
Регистрация: 22.11.2010
Сообщений: 1,554
03.12.2013, 20:39  [ТС] #15
понял тему стека крайне смутно, теоретически сообразил про все дин.струк. типы: списки, стеки, очереди и бин. деревья, но реализация в коде вызывает кучу вопросов.
0
03.12.2013, 20:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.12.2013, 20:39
Привет! Вот еще темы с ответами:

Не компилируется код - C++
Есть код на подобие такого: template&lt;int a&gt; class A { public: static const int x1 = B&lt;a,1&gt;::x2; }; template&lt;int a, int b&gt; ...

Не компилируется код - C++
я написал код проверял не компелирует почему-то пользуюсь dev c++ пишет проект или исходный файл не скомпелирован вот код #include...

Код не компилируется - C++
Объясните пож-та, почему код не компилируется: // File Output.cpp: определяет точку входа для консольного приложения. // ...

дан код, не компилируется - C++
Задано натуральное число k, символьный файл g и текстовый файл f. Файл g содержит 30 слов, каждое из которых будем называть ключевым....


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

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

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