Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2 3  Все   Вниз
  Печать  
Автор Тема: Заголовочные файлы  (Прочитано 84451 раз)
0 Пользователей и 5 Гостей смотрят эту тему.
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");
}
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #1 : 13-03-2005 21:52 » 

Извини дорогой - но тебя понять трудно.
Для включения твоей пары файлов в любой из cpp файлов проргаммы надо всего-лишь добавить
#include "time.h" и все.
Просто time.h это стандартный фалй для API операций с временем.
Вот он и требует lib файл того.
Смени название.
Записан

А птичку нашу прошу не обижать!!!
kasper
Гость
« Ответ #2 : 13-03-2005 22:04 » 

Гром, что именно надо делать? какое название новое нужно дать?
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #3 : 13-03-2005 22:36 » 

Которое не будет соответствовать системному time.h
Записан

А птичку нашу прошу не обижать!!!
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 14-03-2005 06:14 » 

Наверное, компилятор ругает тебя за то, что не может найти тела методов класса Time.
Покажи вывод компилятора.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
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 » 

В книге (Как программировать на С++. Дейтел.), сказано, что нужно посмотреть документацию на комп, там объяснение, как создавать заголовочные файлы и подключать в исходник
Записан
Михалыч
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 15-03-2005 05:22 » new

Цитата
... нужно посмотреть документацию на комп, там объяснение, как создавать заголовочные файлы и подключать в исходник
Ну, это явный перебор... Отлично
Вам же пытались уже сказать - давайте по порядку
1. Если ваш инклудник имеет имя time.h  - переименовать его
2. допустим назвать его mytime.h
3. включить в файл, где планируется использовать Ваш класс #include "mytime.h"
4. включить в проект *.срр файл с реализацией класса

Желательно привести версию того, на чем это собирается, и что конкретно...
А так можно только точно сказать что это Борланд, но какой, и что за приложение (проект) - консольное, или графическое, увы не ясно.
По поводу " Undefined symbol_main..." - сообщение наводит на мысль: а у Вас вообще main() функция описана где нибудь?
Записан

Поживем - увидим... Доживем - узнаем... Выживу - учту  Улыбаюсь
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 15-03-2005 09:16 » 

#include <time.h>
#include "time.h"
Два совершенно разных файла и между собой не конфликтуют.
Первый ищется по настройкам компилятора, второй - относительно директории, в которой находится компилируемый c или cpp файл.
« Последнее редактирование: 15-03-2005 09:23 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Михалыч
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #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
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #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, ежели под винду приложение пишешь).
Если не найдешь такую функцию, то создай. И проблема будет решена.
Записан
Михалыч
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #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
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #14 : 16-03-2005 05:20 » 

Вообще обычно используют символ нижнего подчеркивания, а не точку, для защитных дефайнов в заголовочных файлах. Но это кому как удобно Ага
Думаю, что такой способ (с точкой) не будет конфликтовать ни с одной библиотекой... если компилятор позволяет.
Вот, например, в микрософтовском заголовоном файле такая запись:
#ifndef _INC_TIME
#define _INC_TIME
В GNU проектах обычно пишут что-то типа
#ifndef _TIME_H.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #15 : 16-03-2005 12:17 » 

Hooter, тоочка не может быть частью имени, т.к. является оператором.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Hooter
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #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 Offline
Пол: Мужской

WWW
« Ответ #19 : 16-03-2005 22:37 » 

kasper, присоедини исходники к посту.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Михалыч
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #20 : 17-03-2005 03:37 » 

Цитата
Посмотрите, пожалуйста, в самом начале страницы.
Две проги.
Одна - заголовочный файл.
Вторая - программа, в которую нужно этот заголовочный файл включить.
Что нужно сделать, что бы все заработало?
Обе проги небольшие.
Прога-то наверное все-таки одна??? Быть такого не может Файлов видимо два... Ну и еще один (как минимум) должен быть с main() функцией.
Цитата
kasper, присоедини исходники к посту.
Похоже без этого не обойтись, такое впечатление что мы просто не понимаем о чем вопрос...
И кроме текстов, не плохо бы файл проекта, вдруг там что-то не так включено?
« Последнее редактирование: 17-03-2005 03:42 от Михалыч » Записан

Поживем - увидим... Доживем - узнаем... Выживу - учту  Улыбаюсь
kasper
Гость
« Ответ #21 : 17-03-2005 19:23 » 

Михалыч, смотри на самом верху страницы.
Там по-моему чего-то нехватает, чего?
Я не знаю. Посмотрите, пожалуйста.
Возможно функции main( ).
Как включить? И куда, чтобы не нарушала структуру, если ошибка, конечно, в этом.
Потому как видел проги, рабочие, без main( ).
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #22 : 17-03-2005 19:38 » 

Каспер - что из советуемого выше ты уже сделал???
Записан

А птичку нашу прошу не обижать!!!
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #23 : 17-03-2005 23:19 » 

Цитата
Потому как видел проги, рабочие, без main( ).
Где??? (Я не знаю как поставить смайлик большого при большого удивления).
Поправьте меня если я не прав, но ты пишешь на Си, а в данном случае все начинается с функции main. Функция main в языке Си является началом всех начал, она уже в дальнейшем запустит твои функции проделает все что ты написал в ее теле и вернет какое-нибудь значение по окончанию работы.
Если я ошибаюсь, то очень прошу научить меня писать такие программы Улыбаюсь.
Записан

ещё один вопрос ...
Михалыч
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #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
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #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 » 

Я делаю все по-порядку. скорее у меня пути не прописанны. Как прописать?
Записан
Михалыч
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #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 помощью создания проекта, наверное)
Пробовал. Улыбаюсь
Если это действительно реально, то как создать проект из этого?ъ

Записан
Страниц: [1] 2 3  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines