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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Supernatural
285 / 141 / 28
Регистрация: 22.11.2010
Сообщений: 1,439
01.12.2013, 01:46     Создание стека - код не компилируется #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
#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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.12.2013, 01:46     Создание стека - код не компилируется
Посмотрите здесь:

C++ Код не компилируется
Не компилируется код C++
C++ Не компилируется код
C++ Код не компилируется
C++ Код не компилируется
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Alex566
 Аватар для Alex566
240 / 152 / 18
Регистрация: 03.04.2013
Сообщений: 317
01.12.2013, 01:56     Создание стека - код не компилируется #2
Не компилирует потому что вы объявляете функцию внутри функции.
Supernatural
285 / 141 / 28
Регистрация: 22.11.2010
Сообщений: 1,439
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 минут
ап.
Brain_Dead
 Аватар для Brain_Dead
9 / 8 / 2
Регистрация: 25.09.2013
Сообщений: 34
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> тоже не нужны, их функции нигде не используются.
Supernatural
285 / 141 / 28
Регистрация: 22.11.2010
Сообщений: 1,439
02.12.2013, 11:02  [ТС]     Создание стека - код не компилируется #5
В аргументах стоит Stek** top. - указатель на адрес последнего добавленного элемента. Нам нужен не указатель на адрес, имеющий тип Stek**, а сам адрес, имеющий тип Stek*. В него записывается адрес следующего элемента, который ниже.
почему тогда не записать*top=*top->p?
все никак не пойму - откуда здесь связь между ссылкой и указателем на указатель
Brain_Dead
 Аватар для Brain_Dead
9 / 8 / 2
Регистрация: 25.09.2013
Сообщений: 34
02.12.2013, 11:17     Создание стека - код не компилируется #6
Цитата Сообщение от Supernatural Посмотреть сообщение
почему тогда не записать*top=*top->p?
Стрелка не сработает.

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

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

Добавлено через 5 минут
Поскольку указатель на указатель - это переменная, хранящая адрес на переменную типа int*, то она также имеет тип int**, ну или double**, или Stek**, или ещё что-нибудь. У них тип просто один и тот же.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
02.12.2013, 14:06     Создание стека - код не компилируется #7
Brain_Dead, не путай людей своими рассуждениями о ссылках. Оператор (&) в том значении, в каком тут использован, не имеет никакого отношения к ссылкам! Употреблять слово "ссылка", объясняя новичку этот оператор, просто преступно!
Этот оператор был введен уже в языке си, когда понятия "ссылка" не было! Это оператор взятия адреса!
Supernatural
285 / 141 / 28
Регистрация: 22.11.2010
Сообщений: 1,439
02.12.2013, 17:23  [ТС]     Создание стека - код не компилируется #8
так что с кодом? я в непонятках
Brain_Dead
 Аватар для Brain_Dead
9 / 8 / 2
Регистрация: 25.09.2013
Сообщений: 34
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)
Supernatural
285 / 141 / 28
Регистрация: 22.11.2010
Сообщений: 1,439
02.12.2013, 20:47  [ТС]     Создание стека - код не компилируется #10
да я знаю, что код рабочий. Я пытался выждать подробных объяснений, но по ходу не дождусь. Что касается ссылок - я прочитал из книги, но все равно не понял - каким боком она имеет отношение к указателю на указатель
Brain_Dead
 Аватар для Brain_Dead
9 / 8 / 2
Регистрация: 25.09.2013
Сообщений: 34
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?
Supernatural
285 / 141 / 28
Регистрация: 22.11.2010
Сообщений: 1,439
03.12.2013, 08:11  [ТС]     Создание стека - код не компилируется #12
не понятно с амперсандом. Ведь он прикрепляется к типу ссылкам
Brain_Dead
 Аватар для Brain_Dead
9 / 8 / 2
Регистрация: 25.09.2013
Сообщений: 34
03.12.2013, 08:43     Создание стека - код не компилируется #13
Цитата Сообщение от Supernatural Посмотреть сообщение
не понятно с амперсандом. Ведь он прикрепляется к типу ссылкам
Здесь & - оператор взятия адреса. Возвращает адрес переменной top. В зависимости от того, какой тип имеет переменная top, возвращенный адрес тоже имеет разный тип. Ссылок как таковых тут нет.
В блоке "main" переменная top задана Stek* top. Она имеет тип Stek*, поэтому её возвращённый адрес будет иметь тип Stek**.

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

Здесь мы возвращаем адрес переменной int k. Адрес имеет тип int*.
Почитай статью в википедии, о которой я упоминал, там всё объясняется довольно неплохо.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
03.12.2013, 19:21     Создание стека - код не компилируется #14
Цитата Сообщение от Supernatural Посмотреть сообщение
Ведь он прикрепляется к типу ссылкам
не только
в данном примере ссылки вообще не при чём.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.12.2013, 20:39     Создание стека - код не компилируется
Еще ссылки по теме:

Код не компилируется C++
Не компилируется код C++
Не компилируется код C++

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

Или воспользуйтесь поиском по форуму:
Supernatural
285 / 141 / 28
Регистрация: 22.11.2010
Сообщений: 1,439
03.12.2013, 20:39  [ТС]     Создание стека - код не компилируется #15
понял тему стека крайне смутно, теоретически сообразил про все дин.струк. типы: списки, стеки, очереди и бин. деревья, но реализация в коде вызывает кучу вопросов.
Yandex
Объявления
03.12.2013, 20:39     Создание стека - код не компилируется
Ответ Создать тему
Опции темы

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