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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.87
G-Cat
16 / 16 / 1
Регистрация: 15.03.2009
Сообщений: 94
#1

linked error - C++

28.09.2009, 00:19. Просмотров 1866. Ответов 28
Метки нет (Все метки)

только начал программу писать и сразу траблы. Но по порядку.

main.cpp:
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
#include <iostream>
#include "newfunc.h"
 
using namespace std;
 
int main()
{
    system ("CLS");
    
    int quit;
    do
    {
        rusout("Введите координаты области, которую хотите удалить:\n");
        rusout("X: ");  int x;  cin >> x;
        rusout("Y: ");  int y;  cin >> y;
 
        rusout("\nЗакончить изменения? (1-да/0-нет): ");
        cin >> quit;                   
    }
    while(quit != 1 );
    
    system ("pause");
    return 0;
}
newfunc.h:
C++
1
int rusout(char *Str);
rusout.cpp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include "newfunc.h"
 
using namespace std;
 
int rusout(char *Str)
{
    unsigned char c;
    for(int i = 0; Str[i] != '\0'; i++)
    {
        c = Str[i];
        
        if(c > 127)
            {
                if(c < 240)
                c -= 64;
                else
                c -= 16;
            }
        cout << c;
    }
}
Собственно DEV Cpp ругается так:
[Linker error] undefined reference to `rusout(char*)'

DMC компилирует, но при запуске говорит что это приложение не является win32.

Прошу сразу заметить прога ещё далека от завершение и потому пусть вас не смущает её несколько неказистая конструкция.

Собственно вопрос: Кто виноват и что делать?

ЗЫ: заранее спасибо за игнор\ответ\мат в ответ...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.09.2009, 00:19     linked error
Посмотрите здесь:

Ошибка Linked Error в wxDev C++ - C++
Всем доброго времени суток, не уверен , что написал тему в нужный раздел , но все таки, мне очень нужна помощь. Раньше пользовался...

[Linked Error] Unresolved External - C++
День добрый, камрады! Только недавно начал изучать С++ и, ожидаемо, столкнулся с проблемой. Сам разобраться пока не могу. Есть...

Linked List: error C2360: initialization of 'vp' is skipped by 'case' label - C++
Программа выдает ошибку . но я не понял в чем проблема . можете помочь исправить ? class Us { public: Us* prev; int k; ...

Linked List класс - C++
Ребят! Помогите пожалуйста найти ошибку! Я все написал, но чтобы я не делал выбрасывает с ошибкой:( //List.h #pragma once ...

Linked List описание - C++
/*!Begin Snippet:filebegin*/ #ifndef _LINKEDLIST_H_ #define _LINKEDLIST_H_ using namespace std; /*!Begin Snippet:fullnode*/ ...

C-style Linked List - C++
Итак, изучал я, значит, C-style Linked List (не знаю, как будет по-русски) и столкнулся с такой проблемой: надо его заполнить. Вроде все...

Template double linked list C++ - C++
Пытался реализовать шаблон класса двусвязный список, элементарами которого является класс структура. 1. Как теперь инициализировать класс...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Monte-Cristo
2787 / 1373 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
28.09.2009, 00:24     linked error #2
G-Cat, ну наверное потому, что файл rusout.cpp не подключается никак. В файле newfunc.h используется объявление, но никакого описания функции rusout()

Замени
Цитата Сообщение от G-Cat Посмотреть сообщение
#include "newfunc.h"
на
C++
1
#include "rusout.cpp"
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,424
28.09.2009, 00:52     linked error #3
И это... В качестве факультативного дополнения.
Файл newfunc.h вообще убрать может? А строчку #include "newfunc.h" закомменитить... Ибо к чему плодить лишние сущности?
Простите мне моё невежество.
G-Cat
16 / 16 / 1
Регистрация: 15.03.2009
Сообщений: 94
28.09.2009, 01:43  [ТС]     linked error #4
подождите, ну не с бухты барахты же я всё ето написал...а по анологии, вот часть задания на следующую пару:

Создать многофайловый проект. Он должен включать в себя головной модуль, в котором должна будет вызвана функция, сама эта функция определена в другом файле, и должен быть создан *.h файл в котором будет объявлена эта функция.

Не отрицаю, я мог что то и напутать в сделаном мною выше коде, но я даже в Дейтеле видел пример подобного написания. Правда там в головном модуле инициализировался класс и там не одна строчка, как у мня была, а поболее, но так же не было никакой привязки ко второму *.cpp файлу, ни в головном модуле, ни в основном файле....покрайне мере я не заметил
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
28.09.2009, 02:44     linked error #5
А когда создаёшь проект,там должна быть опция "подключить файлы к проекту",может,всё дело в том,что линкер получает неправильную команду от среды разработки? Поищи там эту опцию добавить файлы.
G-Cat
16 / 16 / 1
Регистрация: 15.03.2009
Сообщений: 94
28.09.2009, 03:12  [ТС]     linked error #6
теперь постоянный Error 1 (компилятор Dev Cpp)
но мне вот больше нравится работать в DMC, но он не графический...не подскажете как в нём можно добавлять файлы...ну хотя бы на примере GCC...
Monte-Cristo
2787 / 1373 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
28.09.2009, 10:55     linked error #7
Цитата Сообщение от G-Cat Посмотреть сообщение
я даже в Дейтеле видел пример подобного написания
Подобного, это если б у тебя скомпилировалось.

Цитата Сообщение от G-Cat Посмотреть сообщение
Не отрицаю, я мог что то и напутать
Так оно и есть.

вообще должно быть как-то вот так:
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include "newfunc.h"
 
int main()
{
        system ("CLS");
    
        int quit;
        do
        {
                rusout("Введите координаты области, которую хотите удалить:\n");
                rusout("X: ");  int x;  cin >> x;
                rusout("Y: ");  int y;  cin >> y;
 
                rusout("\nЗакончить изменения? (1-да/0-нет): ");
                cin >> quit;                   
        }
        while(quit != 1 );
        
        system ("pause");
        return 0;
}

newfunc.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using namespace std;
 
int rusout(char *Str)
{
        unsigned char c;
        for(int i = 0; Str[i] != '\0'; i++)
        {
                c = Str[i];
                
                if(c > 127)
                {
                        if(c < 240)
                                c -= 64;
                        else
                                c -= 16;
                }
                cout << c;
        }
}
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,424
28.09.2009, 15:29     linked error #8
Прошу предыдущего написавшего внести ясность в этот вопрос.
...Я так понимаю, подключать можно чуть-ли не какой угодно файл, хоть без расширения, лишь бы содержание правильно было написано по крайней мере DEV C++ работает так.
Но остановимся на .cpp и .h

То есть если в этом примере оформить подключаемый файл как .cpp, то тут один плюс- его можно отлаживать отдельно от исполняемой программы.

То есть работай с ним и компилируй себе, ищи ошибки. Если всё будет правильно, тогда линкёр выдаст одну ошибку- что не может найти функцию main. После этого подключай файл к проекту и работай.

А если оформить его с расширением .h, то у меня файлы с таким расширением по отдельности не компилируются, а только вкупе со всем проектом. То есть при каждой его отладке приходится подключать его ко всему проекту. Это нехорошо.

Кто как для себя решил вопрос- файлы с каким расширением подключать?
Может, стандарт какой есть на этот случай?
Monte-Cristo
2787 / 1373 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
29.09.2009, 10:39     linked error #9
kravam, подключаются как правило .h файлы. А вообще ты понимаешь смысл препроцессорной директивы #include ? Это эквивалентно ВСТАВИТЬ. То есть, перед обработкой, идет непосредственное вставление кода из подключаемого файла, в исходный листинг.
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,424
29.09.2009, 11:39     linked error #10
Конечно, понимаю. Это, кстати, много где описано. И это понять просто. Вставить это значит вставить и ничего более.
Я всего лишь выразил недоумение по поводу того, что везде наблюдаю подключаемые файлы *h, и нигде не наблюдаю *сpp (речь идёт об авторских файлах, а не поставляемых вместе со средой программирования). Ибо последние проще отлаживать потому, что их можно отлаживать отдельно от всего проекта.

Добавлено через 14 минут
В общем, думал я и пришёл к выводу, что нам ничего не запрещает подключать файлы *сpp. Или подключение *h стандарт? Тогда другое дело.
G-Cat
16 / 16 / 1
Регистрация: 15.03.2009
Сообщений: 94
29.09.2009, 12:08  [ТС]     linked error #11
http://ru.wikipedia.org/wiki/Заголовочный_файл
http://www.citforum.ru/programming/cpp/gl4.shtml

Следующее эмпирическое правило относительно того, что следует, а что не следует помещать в заголовочные файлы, является не требованием языка, а просто предложением по разумному использованию аппарата #include.

В заголовочном файле могут содержаться:
Определения типов struct point { int x, y; }
Описания функций extern int strlen(const char*);
Определения inline-функций inline char get() { return *p++; }
Описания данных extern int a;
Определения констант const float pi = 3.141593
Перечисления enum bool { false, true };
Директивы include #include
Определения макросов #define Case break;case
Комментарии /* проверка на конец файла */

но никогда:
Определения обычных функций char get() { return *p++; }
Определения данных int a;
Определения сложных константных объектов const tbl[] = { /* ... */ }

ну а теперь кто нибудь мне всё таки объяснит как связать файлы main.cpp, func.h и func.cpp вместе, что бы небыло ошибок линковки?)))
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,424
29.09.2009, 12:33     linked error #12
Это из википедии "В заголовочном файле модуля объявляется каждая функция, объект и тип данных, являющиеся частью интерфейса вызова модуля"

По второй ссылке я не нашёл ответа на свой вопрос. То есть там всё хорошо расписано, но не написано что нельзя подключать файлы *c (в моём случае *cpp) в программу.
При чём: на протяжении всего примера автор активно использует как те, и другие, осознавая пользу от обоих.

Но представляя главный файл, подключенных файлов *с мы там не наблюдаем. Без объяснений. *h подключаются, а *c нет.

В общем, пишем сложные функции, нуждающиеся в отдельной компиляции в файлах *cpp и подключаем их.
Тем более, что так и сказано: В заголовочных файлах не могут содержаться определения обычных функций. Всё.
easybudda
Эксперт С++
9456 / 5469 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
29.09.2009, 13:50     linked error #13
Цитата Сообщение от G-Cat Посмотреть сообщение
ну а теперь кто нибудь мне всё таки объяснит как связать файлы main.cpp, func.h и func.cpp вместе, что бы небыло ошибок линковки?)))
Вот так всё работает:
main.cpp
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
#include <iostream>
#include "rusout.h"
 
using namespace std;
 
int main()
{
        system ("CLS");
    
        int quit;
        do
        {
                rusout("Введите координаты области, которую хотите удалить:\n");
                rusout("X: ");  int x;  cin >> x;
                rusout("Y: ");  int y;  cin >> y;
 
                rusout("\nЗакончить изменения? (1-да/0-нет): ");
                cin >> quit;                   
        }
        while(quit != 1 );
        
        system ("pause");
        return 0;
}

rusout.h
C++
1
void rusout(char *Str);

rusout.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include "rusout.h"
 
using namespace std;
 
void rusout(char *Str)
{
        unsigned char c;
        for(int i = 0; Str[i] != '\0'; i++)
        {
                c = Str[i];
                
                if(c > 127)
                {
                        if(c < 240)
                                c -= 64;
                        else
                                c -= 16;
                }
                cout << c;
        }
}

я из консоли (той, которая к VS прилагается - в ней переменные окружения и прочая байда задаётся) скомпилил
Код
cl main.cpp rusout.cpp
но это особого значения не имеет.
Проблема у Вас с функцией была. Она как int объявлена, а ничего не возвращала.
Evg
Эксперт CАвтор FAQ
17470 / 5708 / 363
Регистрация: 30.03.2009
Сообщений: 15,672
Записей в блоге: 26
29.09.2009, 14:34     linked error #14
Monte-Cristo, ну зачем ты людям неправильные советы даёшь. Исходники у него были написаны правильно. Только на компиляцию нужно подавать оба исходника *.cpp, а у него подаётся только один. Для подтверждения догадки можно внести в файл rusout.cpp синтаксическую ошибку. При компиляции на это место не будет ругаться (потому что файл не попадает в компиляцию). #pragma, в 5-м посте написал, что нужно делать

Добавлено через 49 секунд
Цитата Сообщение от easybudda Посмотреть сообщение
Проблема у Вас с функцией была. Она как int объявлена, а ничего не возвращала.
От этого ошибок линковки нет. Разве что предупреждение на компиляции

Добавлено через 1 минуту
Цитата Сообщение от G-Cat Посмотреть сообщение
ну а теперь кто нибудь мне всё таки объяснит как связать файлы main.cpp, func.h и func.cpp вместе, что бы небыло ошибок линковки?)))
Тебе нужно подать в компиляцию файлы main.cpp и rusout.cpp. А это уже вопрос из разряда "куда в Dev-Cpp нажать чтобы было". Т.е. вопрос к конкретной среде разработки, а не к языку Си++. Это так, чтобы понятно было
easybudda
Эксперт С++
9456 / 5469 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
29.09.2009, 14:55     linked error #15
Цитата Сообщение от Evg Посмотреть сообщение
От этого ошибок линковки нет. Разве что предупреждение на компиляции
Хуже того, даже не скомпилировалось (поменял обратно void на int)
Код
c:\c_cpp\g-cat\rusout.cpp(22) : error C4716: 'rusout' : must return a value
Evg
Эксперт CАвтор FAQ
17470 / 5708 / 363
Регистрация: 30.03.2009
Сообщений: 15,672
Записей в блоге: 26
29.09.2009, 15:03     linked error #16
Цитата Сообщение от easybudda Посмотреть сообщение
Хуже того, даже не скомпилировалось (поменял обратно void на int)
В Dev-Cpp используется компилятор gcc/g++, который за ошибку это не считает. Если бы он посчитал это ошибкой, то до линковки дело бы не дошло. А потому у автора проблема не в этом
easybudda
Эксперт С++
9456 / 5469 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
29.09.2009, 15:20     linked error #17
Цитата Сообщение от Evg Посмотреть сообщение
В Dev-Cpp используется компилятор gcc/g++, который за ошибку это не считает. Если бы он посчитал это ошибкой, то до линковки дело бы не дошло. А потому у автора проблема не в этом
Ага, g++ не ругнулся. Но всё равно не комильфо. Зачем в "правильно" написанной программе объявлять ничего не возвращающую функцию, как int? Получается, что на сарае #$% написано, а там брёвна лежат А по сути - да, видимо, просто компилирует ТС свою програмку неправильно...
Evg
Эксперт CАвтор FAQ
17470 / 5708 / 363
Регистрация: 30.03.2009
Сообщений: 15,672
Записей в блоге: 26
29.09.2009, 16:05     linked error #18
Цитата Сообщение от easybudda Посмотреть сообщение
Зачем в "правильно" написанной программе объявлять ничего не возвращающую функцию, как int?
А зачем вообще люди временами ошибаются?

Цитата Сообщение от easybudda Посмотреть сообщение
просто компилирует ТС свою програмку неправильно...
"ТС" - это что?
easybudda
Эксперт С++
9456 / 5469 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
29.09.2009, 16:20     linked error #19
Цитата Сообщение от Evg Посмотреть сообщение
"ТС" - это что?
"Топик Стартер" я думал... Где-то тут такая форма употреблялась, вроде... Увидел, повторил. Извиняюсь, если что-то перепутал.
А ошибаются люди, чтоб другие их поправляли, а не говорили, что и так сойдёт...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.09.2009, 16:26     linked error
Еще ссылки по теме:

Связанный список (Linked list). - C++
Добрый день. Вот пишу функцию (в коде название - smash), которая бы из текущего списка создавала 2 других: парные числа и непарные, но...

Проверить программу с linked list - C++
Есть программа, но уверен много недочётов - сам не вижу. Например, правильно ли описаны private member? Так же не понятно с VALUE...

Нужен совет - как сделать circular linked list? - C++
Доброго всем времени суток!!! У меня программа которая считает queue, мне необходимо сделать circular linked list. Прошу помоши!!!!!...

Указатели, связной список (Linked List) и динамическое выделение памяти - C++
Я вообще не понимаю как сделать. Ребят! Помогите, как сможете! /* Написать связной список используя структуры и функции Позволить...

[ILINK32 Error] Error: Unresolved external - C++
помогите вылетает ошибка и программа из-за этого не работает! Error: Unresolved external '__fastcall...


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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт CАвтор FAQ
17470 / 5708 / 363
Регистрация: 30.03.2009
Сообщений: 15,672
Записей в блоге: 26
29.09.2009, 16:26     linked error #20
Цитата Сообщение от easybudda Посмотреть сообщение
"Топик Стартер" я думал... Где-то тут такая форма употреблялась, вроде... Увидел, повторил. Извиняюсь, если что-то перепутал.
Будем знать

Цитата Сообщение от easybudda Посмотреть сообщение
А ошибаются люди, чтоб другие их поправляли, а не говорили, что и так сойдёт...
Я всё к тому, что человек написал код, который формально ошибочный, но реально ошибка не проявляется, т.к. в месте вызова функции возвращаемое значение не используется. Да и в любом случае, если бы и использовалось, то проявилось бы это только на исполнении, а он пока слинковать бинарник не может. Т.е. ему надо сначала более актуальную проблему (ошибку) разрулить, а потом, если понадобится, до косяка с отсуствием return'а он скорее всего сам докопается
Yandex
Объявления
29.09.2009, 16:26     linked error
Ответ Создать тему
Опции темы

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