kasper
Гость
|
|
« : 13-03-2005 21:26 » |
|
Привет!
1. Имею собственно написанный заголовочный файл: #ifndef TIME.H #define TIME.H
class Time { public: Time(); void setTime(int, int, int);
void printMilitary(); void printStandart();
private: int hour; int minute; int second; }; #endif
Пожалуйста, как включить его в прогу: (думается мне, его нужно разместить где-нето, а где? Компилятор постоянно ссылается на LIB но, после помещения его туда ничего не происходит).
#include<iostream.h> #include "time.h"
Time::Time() {hour = minute = second = 0;}
void Time::setTime(int h, int m, int s) { hour = (h >= 0 && h < 24) ? h : 0; minute = (m >= 0 && m < 60) ? m : 0; second = (s >= 0 && s < 60) ? s : 0; }
void Time::printMilitary() { cout<<(hour < 10 ? "0" : "")<<hour<<":" <<(minute < 10 ? "0" : "")<<minute<<":" <<(second < 10 ? "0" : "")<<second; }
void Time::printStandart() { cout<<((hour == 0 || hour == 12) ? 12 : hour % 12) <<":"<<(minute < 10 ? "0" : "")<<minute <<":"<<(second < 10 ? "0" : "")<<second <<(hour < 12 ? " AM" : " PM"); }
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #1 : 13-03-2005 21:52 » |
|
Извини дорогой - но тебя понять трудно. Для включения твоей пары файлов в любой из cpp файлов проргаммы надо всего-лишь добавить #include "time.h" и все. Просто time.h это стандартный фалй для API операций с временем. Вот он и требует lib файл того. Смени название.
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
kasper
Гость
|
|
« Ответ #2 : 13-03-2005 22:04 » |
|
Гром, что именно надо делать? какое название новое нужно дать?
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #3 : 13-03-2005 22:36 » |
|
Которое не будет соответствовать системному time.h
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
npak
|
|
« Ответ #4 : 14-03-2005 06:14 » |
|
Наверное, компилятор ругает тебя за то, что не может найти тела методов класса Time. Покажи вывод компилятора.
|
|
|
Записан
|
|
|
|
kasper
Гость
|
|
« Ответ #5 : 14-03-2005 21:02 » |
|
Имею заголовочный файл с программой (см. выше) На выходе он дает:
Linker Warning: No module definition file specified: using defauls Linker Error: Undefined symbol_main in library file C:\BC\LIB\cwl.lib in module winmain
Понятно, что ошибка в моих действиях. Как устранить?
|
|
|
Записан
|
|
|
|
kasper
Гость
|
|
« Ответ #6 : 14-03-2005 21:05 » |
|
В книге (Как программировать на С++. Дейтел.), сказано, что нужно посмотреть документацию на комп, там объяснение, как создавать заголовочные файлы и подключать в исходник
|
|
|
Записан
|
|
|
|
Михалыч
|
|
« Ответ #7 : 15-03-2005 05:22 » |
|
... нужно посмотреть документацию на комп, там объяснение, как создавать заголовочные файлы и подключать в исходник Ну, это явный перебор... Вам же пытались уже сказать - давайте по порядку 1. Если ваш инклудник имеет имя time.h - переименовать его 2. допустим назвать его mytime.h 3. включить в файл, где планируется использовать Ваш класс #include "mytime.h" 4. включить в проект *.срр файл с реализацией класса Желательно привести версию того, на чем это собирается, и что конкретно... А так можно только точно сказать что это Борланд, но какой, и что за приложение (проект) - консольное, или графическое, увы не ясно. По поводу " Undefined symbol_main..." - сообщение наводит на мысль: а у Вас вообще main() функция описана где нибудь?
|
|
|
Записан
|
Поживем - увидим... Доживем - узнаем... Выживу - учту
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #8 : 15-03-2005 09:16 » |
|
#include <time.h> #include "time.h" Два совершенно разных файла и между собой не конфликтуют. Первый ищется по настройкам компилятора, второй - относительно директории, в которой находится компилируемый c или cpp файл.
|
|
« Последнее редактирование: 15-03-2005 09:23 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Михалыч
|
|
« Ответ #9 : 15-03-2005 16:10 » |
|
Ну да, правильно... Просто я просмотрел (мимо) как он его инклудит, тем более в самом начале была фраза о попытке засунуть все это в LIB директорию
|
|
|
Записан
|
Поживем - увидим... Доживем - узнаем... Выживу - учту
|
|
|
kasper
Гость
|
|
« Ответ #10 : 15-03-2005 20:11 » |
|
Честно сказать, я так и не понял, перемеиновывать файл или нет. RXL говорит, что это не мешает. Да я и сам пробовал переименовывать, но что то неполучается. Так как же довести первый файл до состояния включения, и как подготовить второй файл к тому, что бы в него можно было ввести заголовочный файл, еще: нужно ли его размещать кде-нибудь, или компилятор его сам размещает?
|
|
|
Записан
|
|
|
|
kasper
Гость
|
|
« Ответ #11 : 15-03-2005 20:11 » |
|
Да, забыл сказать, я пишу в среде Borland C++ 4.5
|
|
|
Записан
|
|
|
|
Hooter
|
|
« Ответ #12 : 15-03-2005 21:46 » |
|
Linker Warning: No module definition file specified: using defauls Linker Error: Undefined symbol_main in library file C:\BC\LIB\cwl.lib in module winmain
Судя по этим строкам компилятор вообще не ругается. Ругается линкер. Внимательно просмотри свои исходные файлы и найди тело функции main (или WinMain, ежели под винду приложение пишешь). Если не найдешь такую функцию, то создай. И проблема будет решена.
|
|
|
Записан
|
|
|
|
Михалыч
|
|
« Ответ #13 : 16-03-2005 03:38 » |
|
А кто-нибудь гляньте как в <time.h> отдефайнено его дальнейшее невключение, а то я дома вообще сейчас ниодного компилятора не имею. Есть мелкое подозрение, поскольку у товарища в тексте его хедер-файла есть такое вот: #ifndef TIME.H #define TIME.H Если это уже отдефайнено в системном time.h, этот хедер не попадет под компиляцию, ну и дальше ругань будет... Правда Вы так и не привели полный вывод сообщений, и можно только гадать, что там на самом деле происходит. как подготовить второй файл к тому, что бы в него можно было ввести заголовочный файл, еще: нужно ли его размещать кде-нибудь, или компилятор его сам размещает? В каком смысле подготовить? Никак, кроме встроенного редактора ВС или любого другого редактора. А вообще, если это просто консольное, например, приложение, то достаточно в описании проекта включить файл содержащий функцию main() и файл с реализацией этого класса time. Все это добро (ну например 3 файла time.h time.cpp и main.cpp) свалить в одну директорию, и посмотреть, правильно ли прописаны пути до include-файлов и библиотек в настройках рабочей среды ВС. Все должно проходить "на ура"
|
|
« Последнее редактирование: 16-03-2005 03:48 от Михалыч »
|
Записан
|
Поживем - увидим... Доживем - узнаем... Выживу - учту
|
|
|
Hooter
|
|
« Ответ #14 : 16-03-2005 05:20 » |
|
Вообще обычно используют символ нижнего подчеркивания, а не точку, для защитных дефайнов в заголовочных файлах. Но это кому как удобно Думаю, что такой способ (с точкой) не будет конфликтовать ни с одной библиотекой... если компилятор позволяет. Вот, например, в микрософтовском заголовоном файле такая запись: #ifndef _INC_TIME #define _INC_TIME В GNU проектах обычно пишут что-то типа #ifndef _TIME_H.
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #15 : 16-03-2005 12:17 » |
|
Hooter, тоочка не может быть частью имени, т.к. является оператором.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Hooter
|
|
« Ответ #16 : 16-03-2005 17:10 » |
|
Hooter, тоочка не может быть частью имени, т.к. является оператором.
RXL, я ж написал - "если позволит компилятор" Поэтому я и сказал про символ нижнего подчеркивания MSVC 6.0, например, ругается на точку в строке "#ifndef TIME.H". Другие компиляторы я не проверял, но так как это отклонение от стандарта, то тоже не должны пропустить... Но утверждать не берусь. kasper, может в этом дело?
|
|
|
Записан
|
|
|
|
kasper
Гость
|
|
« Ответ #17 : 16-03-2005 20:38 » |
|
Посмотрите, пожалуйста, в самом начале страницы. Две проги. Одна - заголовочный файл. Вторая - программа, в которую нужно этот заголовочный файл включить. Что нужно сделать, что бы все заработало? Обе проги небольшие. Посмотрите, пожалуйста. А я, буду в дальнейшем делать по образу и подобию, как говорится. Очень надо, однако, потому что освоение С++ встало из-за этого. Plizzz...
|
|
|
Записан
|
|
|
|
kasper
Гость
|
|
« Ответ #18 : 16-03-2005 20:41 » |
|
Компилято
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #19 : 16-03-2005 22:37 » |
|
kasper, присоедини исходники к посту.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Михалыч
|
|
« Ответ #20 : 17-03-2005 03:37 » |
|
Посмотрите, пожалуйста, в самом начале страницы. Две проги. Одна - заголовочный файл. Вторая - программа, в которую нужно этот заголовочный файл включить. Что нужно сделать, что бы все заработало? Обе проги небольшие. Прога-то наверное все-таки одна??? Файлов видимо два... Ну и еще один (как минимум) должен быть с main() функцией. kasper, присоедини исходники к посту. Похоже без этого не обойтись, такое впечатление что мы просто не понимаем о чем вопрос... И кроме текстов, не плохо бы файл проекта, вдруг там что-то не так включено?
|
|
« Последнее редактирование: 17-03-2005 03:42 от Михалыч »
|
Записан
|
Поживем - увидим... Доживем - узнаем... Выживу - учту
|
|
|
kasper
Гость
|
|
« Ответ #21 : 17-03-2005 19:23 » |
|
Михалыч, смотри на самом верху страницы. Там по-моему чего-то нехватает, чего? Я не знаю. Посмотрите, пожалуйста. Возможно функции main( ). Как включить? И куда, чтобы не нарушала структуру, если ошибка, конечно, в этом. Потому как видел проги, рабочие, без main( ).
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #22 : 17-03-2005 19:38 » |
|
Каспер - что из советуемого выше ты уже сделал???
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
nikedeforest
|
|
« Ответ #23 : 17-03-2005 23:19 » |
|
Потому как видел проги, рабочие, без main( ).
Где??? (Я не знаю как поставить смайлик большого при большого удивления). Поправьте меня если я не прав, но ты пишешь на Си, а в данном случае все начинается с функции main. Функция main в языке Си является началом всех начал, она уже в дальнейшем запустит твои функции проделает все что ты написал в ее теле и вернет какое-нибудь значение по окончанию работы. Если я ошибаюсь, то очень прошу научить меня писать такие программы .
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
Михалыч
|
|
« Ответ #24 : 18-03-2005 04:21 » |
|
Та-а-а-а-а-к.... Начинаем сначала. kasper - только спокойно. Это не наезды, у начинающих бывало и покруче. Итак. Смотрим на то, что у тебя на самом верху. Создаем директорию для нашего проекта, назовем (условно) mytime. Там создаем 2 файла mytime.h и mytime.cpp и в них запихиваем то, что видим "выше". Это - в mytime.h #ifndef TIME.H #define TIME.H class Time { public: Time(); void setTime(int, int, int); .... тут твое продолжение .... Это - в mytime.cpp #include<iostream.h> #include "time.h" Time::Time() {hour = minute = second = 0;} void Time::setTime(int h, int m, int s) { hour = (h >= 0 && h < 24) ? h : 0; .... тут твое продолжение .... На первый взгляд, того, что в этих файлах уже написано вполне достаточно для написания рабочей программы. Теперь будем писать функцию main(). Это можно сделать в том же файле mytime.cpp, но я лично привык реализации классов (в данном случае класса Time) писать в отдельных файлах. Итак, создаем еще один файл mytime_main.cpp и пишем в него, ну например такое: #include "time.h" void main(void) { Time T; T.setTime(23, 30, 35); T.printMilitary(); T.printStandart(); } Все. Получили рабочую программу. Осталось скомпилировать и запустить. Но! Ты работаешь с Борландом 4.5 - видимо надо создать проект, это проще для начинающего - работать в интегрированной среде, чем make-файлы писать. Хотя вопрос спорный, и не факт Итак, берем самый простой вариант - не графическое, обычное консольное приложение, которое будет работать в виндовой консоли. В борланде выбираем - создать новый проект. Тип проекта - консольное приложение. Даем проекту имя - mytime. Указываем директорию где все это лежит (mytime), там появится еще и файл проекта mytime.bpr. Давно на Борланде не работал, поэтому точно не помню, что еще и где задается, но по крупному - кажется это все... Поправьте меня кто-нибудь, у кого под рукой Борланд 4.5 есть - толи в этом месте, когда проект создается, толи уже потом файлы в него добавляются... Короче, пока будем считать, что файлы потом добавляем. Итак, создали проект, залазим в меню view - project (вроде так) и добавляем файлы mytime.cpp и mytime_main.cpp в проект. Все. Да, еще в конце программы, после T.printStandart(); можно (и наверное нужно) воткнуть какую-нибудь функцию которая ждет нажатия клавиши (на свой вкус), а то консоль закроется сразу, и результата не увидишь... Больше и делать нечего. Выбираем project - build ..... И пишем очередной пост в форум, что не получилось
|
|
|
Записан
|
Поживем - увидим... Доживем - узнаем... Выживу - учту
|
|
|
kasper
Гость
|
|
« Ответ #25 : 18-03-2005 21:08 » |
|
Михалыч: все сделал, как сказано. Одно только (или два): mytime[.cpp] в проекте уже есть. mytime_main.cpp - в проекте нет (стыдно сказать) но я не знаю как добавить. Кроме этого, в проекте есть еще: mytime[.def] mytime[.rc]
На попытку компиляции, результат: Linking mytime.exe: Linker Warning: No module definition file specified: using defauls Linker Fatal: Unable to open file 'mytime.obj'
P.S. "What maik?!" Чернышевский
Гром: я как и советовали, переименовывал файлы
nikedeforest: есть компиляторы, которые позваляют создавать проги с большим колличеством ошибок (синтаксических, конечно) Смысл в том, что компилятор автоматом в страивает и исправляет, то что написано неправильно
|
|
« Последнее редактирование: 20-12-2007 16:12 от Алексей1153++ »
|
Записан
|
|
|
|
Hooter
|
|
« Ответ #26 : 18-03-2005 22:00 » |
|
На попытку компиляции, результат: Linking mytime.exe: Linker Warning: No module definition file specified: using defauls Linker Fatal: Unable to open file 'mytime.obj'
Скажи, ты какой пункт меню для компиляции выбираешь? Похоже, что у тебя либо пути не прописаны, либо ты сразу линкуешь, а этап компиляции пропускаешь...
|
|
« Последнее редактирование: 20-12-2007 16:13 от Алексей1153++ »
|
Записан
|
|
|
|
kasper
Гость
|
|
« Ответ #27 : 18-03-2005 22:05 » |
|
Я делаю все по-порядку. скорее у меня пути не прописанны. Как прописать?
|
|
|
Записан
|
|
|
|
Михалыч
|
|
« Ответ #28 : 19-03-2005 04:17 » |
|
to kasper Вопрос по ходу дела - ты все-таки консольное сейчас приложение пытаешся собрать или графическое? Это судя по тому, что с твоих слов, в проекте есть еще файлы *.def и *.rc, я уже давно с борландом не работаю, могу и ошибаться, но помоему это определения и ресурсы для графического приложения. Если это так - не пожалей времени, начни все по-новой, убив все файлы в директории, кроме файлов программы, конечно (т.е. *.cpp и *.h) и создай проект снова, но гарантированно консольный, это проще, чем с графикой сразу копаться... Теперь - как добавить файл в проект - открываешь view-project а потом в окне проекта на правую кнопку мыши, а там уже в контекстном меню выбираешьь add, вроде так. (это было давно, и честно говоря не на 4.5 на борланде 5.02 а у них интегрированные среды вроде разные слегка) О прописывании путей. Пути к твоему проекту вообще не нужны. Проверь только системные пути до либ и инклудов. Это в меню options-environment (кажется) а там найдешь. Хотя, если борланд устанавливался по умолчанию, (т.е. в C:\BC) то все д.б. правильно. О правильной сборке проекта - или project-build или project-makeall - не помню точно, ну или отдельно откомпилить все сначала, а потом линковать... есть компиляторы, которые позваляют создавать проги с большим колличеством ошибок (синтаксических, конечно) Смысл в том, что компилятор автоматом в страивает и исправляет, то что написано неправильно Первое позволяет любой компилятор, второе - это из области фантастики, иначе чего это у тебя не выходит никак??? И еще... Тут в форуме, в другой ветке, с месяц назад (ну, примерно) какой-то kasper говорил, что он "прошел" книгу по С++ для начинающих, и просил чего-нибудь "покруче". Видимо "ПРОШЕЛ МИМО"... Это часом не ты? (Без обид)
|
|
« Последнее редактирование: 19-03-2005 04:20 от Михалыч »
|
Записан
|
Поживем - увидим... Доживем - узнаем... Выживу - учту
|
|
|
kasper
Гость
|
|
« Ответ #29 : 19-03-2005 20:23 » |
|
Михалыч: это был я Книжка маленькая была Что я пытаюсь сделать, а именно: я хочу научится создавать заголовочные файлы и включать их в прогу Конкретнее: Привожу выдержку из книги, касательно моей проблемы. (Как программировать на С++, Дейтел Х., Дейтел П) (над чем я бьюсь) “ При построении программы на С++ каждое определение класса обычно помещается в заголовочный файл, а определение функций-элементов этого класса помещаются в файлы исходных кодов с теми же базовыми именами. Заголовочные файлы включаются (посредством #include) в каждый файл, в котором используется класс, а файлы с исходными кодами компилируются и компонуются с файлом, содержащим главную программу. Посмотрите документацию на ваш компилятор, чтобы определить, как компилировать и компоновать программы, содержащие множество исходных файлов. Программа на рис.6.3. состоит из заголовочного файла time1.h, в котором объявляется класс Time, файла time1.cpp, в котором описываются функции-элементы класса Time, и файла fig6_5.cpp, в котором описывается функция main. Выходные данные этой программы идентичны выходным данным программы на рис. 6.3.” //TIME1.H //Объявление класса Time. //Функции-элементы определены в Time.CPP //Предотвращение многократного включения заголовочного файла #ifndef TIME1_H #define TIME1_H // определение абстрактного типа данных Time class Time { public: Time(); //Конструктор void setTime(int, int, int); void printMilitary(); void printStandart(); private: int hour; int minute; int second; }; #endif Рис.6.5. Заголовочный файл класса Time (часть 1 из 3) //TIME1.CPP // Определения функций-элементов для класса Time. #include<iostream.h> #include "time1.h" Time::Time() {hour = minute = second = 0;} void Time::setTime(int h, int m, int s) { hour = (h >= 0 && h < 24) ? h : 0; minute = (m >= 0 && m < 60) ? m : 0; second = (s >= 0 && s < 60) ? s : 0; } void Time::printMilitary() { cout<<(hour < 10 ? "0" : "")<<hour<<":" <<(minute < 10 ? "0" : "")<<minute<<":" <<(second < 10 ? "0" : "")<<second; } Рис.6.5. Исходный файл определений функций-элементов класса Time (часть 2 из 3) //FIG6_5.CPP //Драйвер класса Time1 //Замечание: Компилируется вместе с TIME1.CPP #include<iostream.h> #include "time1.h" //Драйвер для проверки простого класса Time int main() { Time t; cout<<"Начальное значение военного времени равно "; t.printMilitary(); cout<<endl <<"Начальное значение стандартного времени равно "; t.printStandart(); t.setTime(13, 27, 6); cout<<endl<<endl<<"Военное время после setTime равно "; t.printMilitary(); cout<<endl<<"Стандаотное время после setTime равно "; t.printStandart(); t.setTime(99, 99, 99); cout<<endl<<endl <<"После попытки неправильной установки: " <<endl<<"Военное время: "; t.printMilitary(); cout<<endl<<"Стандартное время: "; t.printStandart(); cout<<endl; return 0; } Вот такие дела. Пожалуйста * 1000, скажите, как запустить ‘ЭТО’ на орбиту. (C помощью создания проекта, наверное) Пробовал. Если это действительно реально, то как создать проект из этого?ъ
|
|
|
Записан
|
|
|
|
|