Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Заголовочный файл .h, чего в нём не хватает ?

2.0K
03 октября 2014 года
oleg_159
77 / / 13.04.2008
При создании проекта (форма с 5-ю кнопками, каждая из которых "рисует" свой график) среда разработки создаёт файлы:
Unit1.cpp, Unit1.h, и другие.
В Unit1.cpp я добавляю:
#include "0.h" // здесь прототипы/описания функций и глобальные переменные
#include "1.h" // здесь определения расчётных функций (графические компоненты не используются)

В Unit1.cpp в обработчиках кнопок я использую графические компоненты Image1 , но в этом файле очень много строк и я хочу функции, используемые в обработчиках кнопок, разнести по заголовочным файлам 2.h, ... 6.h, но программа не работает. Вопрос: что нужно добавить в заголовочные файлы, что бы всё заработало?
260
03 октября 2014 года
Ramon
1.1K / / 16.08.2003
Смысл
1.8K
03 октября 2014 года
Kuzya
184 / / 19.03.2008
Какую ошибку выдаёт компилятор
446
03 октября 2014 года
Meander
487 / / 04.09.2011
Если я правильно понял проблему, то необходимо добавить заголовочные файлы к самому проекту. Через меню: Project->Add to Project->(расширение .h). То-же надо делать и для создаваемых "вручную" файлов реализации. Применительно к Builder удобнее создавать пару *.h *.cpp средствами самой среды, эта пара называется модуль. Тогда эти файлы автоматически добавятся к проекту. В любом случае, директива #include обязательна.
2.0K
03 октября 2014 года
oleg_159
77 / / 13.04.2008
Цитата: Kuzya
Какую ошибку выдаёт компилятор


Сначала была ошибка E2451 Undefined symbol 'Image1'
я записал Image1->... в виде Form1->Image1->...
Потом появилась форма с кнопками, но при нажатии на кнопку опять ошибка в диалоговом окошке
"Debugger Exception Notification"
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address
0040207E in module 'Project1.exe'. Write of address 0000004C'. Process stopped. Use Step or Run to
continue.
и ссылка на самую первую строку с графическим компонентом (в подключённом заголовочном файле):
Form1->Image1->Canvas->FillRect(Rect(0, 0, Form1->Image1->Width, Form1->Image1->Height));

2.0K
03 октября 2014 года
oleg_159
77 / / 13.04.2008
Цитата: Meander
Если я правильно понял проблему, то необходимо добавить заголовочные файлы к самому проекту. Через меню: Project->Add to Project->(расширение .h). То-же надо делать и для создаваемых "вручную" файлов реализации. Применительно к Builder удобнее создавать пару *.h *.cpp средствами самой среды, эта пара называется модуль. Тогда эти файлы автоматически добавятся к проекту. В любом случае, директива #include обязательна.


Так при создании проекта и были автоматически созданы Unit1.h и Unit1.cpp. Потом, при разрастании Unit1.cpp я решил функции обработчиков кнопок разбросать по отдельным *.h, и подключил их в Unit1.cpp с помощью директивы #include:
#include "2.h"
...
#include "6.h"

2.0K
03 октября 2014 года
oleg_159
77 / / 13.04.2008
Цитата: Ramon
Смысл


Смысл в том, что проще эти функции для обработчиков писать, что-то путём копирования. И проще переходить по закладкам между файлами 2.h ... 6.h, чем пользоваться прокруткой в Unit1.cpp.

392
03 октября 2014 года
cronya
421 / / 03.01.2009
либо у вас проблема с обращением к памяти, либо вы не верно используете классовые объекты, без кода судить трудно
446
04 октября 2014 года
Meander
487 / / 04.09.2011
Цитата: oleg_159
Цитата: Meander
Если я правильно понял проблему, то необходимо добавить заголовочные файлы к самому проекту. Через меню: Project->Add to Project->(расширение .h). То-же надо делать и для создаваемых "вручную" файлов реализации. Применительно к Builder удобнее создавать пару *.h *.cpp средствами самой среды, эта пара называется модуль. Тогда эти файлы автоматически добавятся к проекту. В любом случае, директива #include обязательна.


Так при создании проекта и были автоматически созданы Unit1.h и Unit1.cpp. Потом, при разрастании Unit1.cpp я решил функции обработчиков кнопок разбросать по отдельным *.h, и подключил их в Unit1.cpp с помощью директивы #include:
#include "2.h"
...
#include "6.h"


Посмотрите этот пример, может, он прояснит проблему

Прикрепленные файлы:
185 Кб
Загрузок: 599
2.0K
04 октября 2014 года
oleg_159
77 / / 13.04.2008
Цитата: Meander
Цитата: oleg_159
Цитата: Meander
Если я правильно понял проблему, то необходимо добавить заголовочные файлы к самому проекту. Через меню: Project->Add to Project->(расширение .h). То-же надо делать и для создаваемых "вручную" файлов реализации. Применительно к Builder удобнее создавать пару *.h *.cpp средствами самой среды, эта пара называется модуль. Тогда эти файлы автоматически добавятся к проекту. В любом случае, директива #include обязательна.


Так при создании проекта и были автоматически созданы Unit1.h и Unit1.cpp. Потом, при разрастании Unit1.cpp я решил функции обработчиков кнопок разбросать по отдельным *.h, и подключил их в Unit1.cpp с помощью директивы #include:
#include "2.h"
...
#include "6.h"


Посмотрите этот пример, может, он прояснит проблему


Спасибо за пример. Сделал всё как в нём, но выскакивает ошибка:
Undefined symbol 'Form1' и ссылка на строку :
Form1->Image1->Canvas->FillRect(Rect(0, 0, Form1->Image1->Width, Form1->Image1->Height));

446
05 октября 2014 года
Meander
487 / / 04.09.2011
Цитата: oleg_159

Спасибо за пример. Сделал всё как в нём, но выскакивает ошибка:
Undefined symbol 'Form1' и ссылка на строку :
Form1->Image1->Canvas->FillRect(Rect(0, 0, Form1->Image1->Width, Form1->Image1->Height));


Там, где вызывается этот метод, компилятору не известно, что такое Form1. Значит, это явно, не в файле Unit1.cpp, а в каком то, созданном Вами файле.
Вы, даже, не сказали в каком файле эта строка. Хоть схематично привели бы структуру проекта, какие файлы, какие инклуды, какие и где объявления.
Заочно, трудно помогать.
Вот пример с Image:

Прикрепленные файлы:
190 Кб
Загрузок: 589
2.0K
05 октября 2014 года
oleg_159
77 / / 13.04.2008
Цитата: Meander
Цитата: oleg_159

Спасибо за пример. Сделал всё как в нём, но выскакивает ошибка:
Undefined symbol 'Form1' и ссылка на строку :
Form1->Image1->Canvas->FillRect(Rect(0, 0, Form1->Image1->Width, Form1->Image1->Height));


Там, где вызывается этот метод, компилятору не известно, что такое Form1. Значит, это явно, не в файле Unit1.cpp, а в каком то, созданном Вами файле.
Вы, даже, не сказали в каком файле эта строка. Хоть схематично привели бы структуру проекта, какие файлы, какие инклуды, какие и где объявления.
Заочно, трудно помогать.
Вот пример с Image:



Код:
//——— Файл Unit1.cpp ———————————————————————————

#include <vcl.h>
#include <math.h>//математические функции
#include <fstream.h>//ofstream,ifstream

#pragma hdrstop
#include "Unit1.h"
#include "0.h"
#include "1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}

void __fastcall TForm1::FormCreate(TObject *Sender)
  {
  he=Screen->Height; // Высота экрана
  ih=he-Y0-40;       // Высота объекта Image1
  Image1->Height=ih; // Высота объекта Image1
  //...
  }
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
  {
  F1(Form1->Image1);// Здесь ранее не было Form1->Image1
  }

//————————————————————————————————————————




——— Файл 1.cpp ———————————————————————————

#include "0.h" // Здесь объявлены переменные, которые используются в во всех *.cpp
#include "1.h"
void F1(TImage *Image1) // Здесь ранее не было Form1->Image1
  {
  //...
  Image1->Canvas->FillRect(Rect(0,0,Image1->Width,Image1->Height));// Здесь удалил Form1->
  //...
  double dKsi=0.0006/ih; // Здесь почему-то "деление на ноль", но при наведении курсора - "ih=688"
  //...
  }

//————————————————————————————————————————




——— Файл 0.h ———————————————————————————

#include <math.h> // Математические функции

int iw, ih;       // Ширина и высота объекта Image1 (Свои значения получают в обработчике формировании формы)
const double mu0=4*M_PI*1.0e-7;
//...

//————————————————————————————————————————




——— Файл 1.h ———————————————————————————
#include <vcl.h>
#include <fstream.h>    // Доступ к sprintf
#include <math.h>       // Математические функции
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp> // Для доступа к TMemo
#include <Forms.hpp>    // Для доступа к TForm
#include <ExtCtrls.hpp> // Для доступа к TImage - этого не было, добавил
//--------------------------
void F1(TImage *Image1);// Здесь void заменил на TImage *Image1

//————————————————————————————————————————
Но здесь выскочила новая проблема - видимость переменных.
Они у меня объявлены в файле 0.h, и этот файл подключаю в 1.cpp, но после запуска
программы и нажатии на кнопку Button1 выскакивает ошибка деления на ноль:
Debugger Exception Notification
Project Project1.exe raised exception class EZeroDivide with message 'Floating point division by zero'.
Process stopped. Use Step or Run continue.
и даёт ссылка на строку: double dKsi=0.0006/ih;
но при наведении курсора на ih всплывает его значение ih=688
446
05 октября 2014 года
Meander
487 / / 04.09.2011
Что будет, если временно заменить строку double dKsi=0.0006/ih; на double dKsi=0.0006/688;?
2.0K
05 октября 2014 года
oleg_159
77 / / 13.04.2008
Цитата: Meander
Что будет, если временно заменить строку double dKsi=0.0006/ih; на double dKsi=0.0006/688;?


Выдаёт:
[Linker Fatal Error] Fatal: Object file C:PROGRWM FILESBORLANDCBUILDER6PROJECTSПГ_41.OBJ is missing a section of class 2

446
06 октября 2014 года
Meander
487 / / 04.09.2011
Могу порекомендовать, лишь, одно: переписать весь проект заново.
Сначала, все глобальные переменные пусть будут в файле Unit1.cpp, а алгоритмы реализованы непосредственно в обработчиках. Затем, если все будет работать, оформить глобальные переменные и методы в виде класса, таким образом, чтобы в обработчиках вызывались, лишь, методы класса. Добиться работы такой программы и попытаться сделать так, чтобы класс не работал непосредственно с элементами библиотеки VCL, такими как: TForm, TImage и т.п. Т.е. класс должен предоставлять только алгоритмы. Это не обязательное требование, но библиотек, которые предоставляют пользовательский интерфейс много, а Ваши алгоритмы - в единственном экземпляре, поэтому имеет смысл их развязать. Наконец, можно вынести объявление Вашего класса и его реализацию в отдельный модуль.
Эти рекомендации вытекают из того, что Ваш проект, судя по всему не такой уж и большой, а ошибки ломятся в дверь. Надо пересмотреть архитектуру программы, хотя бы, ради упрощения отладки.
2.0K
06 октября 2014 года
oleg_159
77 / / 13.04.2008
Цитата: Meander
Могу порекомендовать, лишь, одно: переписать весь проект заново.
Сначала, все глобальные переменные пусть будут в файле Unit1.cpp, а алгоритмы реализованы непосредственно в обработчиках. Затем, если все будет работать, оформить глобальные переменные и методы в виде класса, таким образом, чтобы в обработчиках вызывались, лишь, методы класса. Добиться работы такой программы и попытаться сделать так, чтобы класс не работал непосредственно с элементами библиотеки VCL, такими как: TForm, TImage и т.п. Т.е. класс должен предоставлять только алгоритмы. Это не обязательное требование, но библиотек, которые предоставляют пользовательский интерфейс много, а Ваши алгоритмы - в единственном экземпляре, поэтому имеет смысл их развязать. Наконец, можно вынести объявление Вашего класса и его реализацию в отдельный модуль.
Эти рекомендации вытекают из того, что Ваш проект, судя по всему не такой уж и большой, а ошибки ломятся в дверь. Надо пересмотреть архитектуру программы, хотя бы, ради упрощения отладки.


Огромное вам спасибо за помощь. Сейчас начну перелопачивать проект. О результатах сообщу дополнительно.

2.0K
07 октября 2014 года
oleg_159
77 / / 13.04.2008
Начал переделывать код и вот что получается: выдаёт ошибку "E2303 Type name expected" и
ссылка на строку "Form1->Height=he;" в файле "1.cpp"

Если в аргументы функции NF1() ввести TForm1 *Form1, то выдаёт ту же ошибку.
Как объяснить кампилятору, что такое Form1 в файле "1.cpp"

Unit.1
Код:
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
  {
  NF1(Form1->Image1);
  }
0.h
 
Код:
//--------------------------
int X0=10, Y0=40;
//--------------------------
1.cpp
Код:
//--------------------------
#include "0.h"
#include "3.h"
//--------------------------

void NF1(TImage *Image1)
  {
  int he=Screen->Height;//высота экрана
  int we=Screen->Width; //ширина экрана
  //Объект Form1
  Form1->Height=he;//высота формы
  Form1->Width=we; //ширина формы
  Form1->Left=0;   //левая привязка
  Form1->Top=0;    //верхняя привязка
  //Объект Image1
  Image1->Height=he-Y0-40;//высота графического поля Image1
  Image1->Width=we-X0-15; //ширина графического поля Image1
  Image1->Left=X0;        //левая привязка графического поля
  Image1->Top=Y0;         //верхняя привязка графического поля
  }
1.h
 
Код:
//--------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
//--------------------------
void NF1(TImage *Image1);
//--------------------------
446
07 октября 2014 года
Meander
487 / / 04.09.2011
Вместо void NF1(TImage *Image1); лучше написать void NF1(TForm *form); и уже через этот указатель получать доступ к форме и ее членам.
Но Вы снова пытаетесь оперировать элементами библиотеки VCL из своих функций, и к тому же выносите их в самодельный .cpp файл. Зачем Вы это делаете?
2.0K
07 октября 2014 года
oleg_159
77 / / 13.04.2008
Цитата: Meander
Вместо void NF1(TImage *Image1); лучше написать void NF1(TForm *form); и уже через этот указатель получать доступ к форме и ее членам.
Но Вы снова пытаетесь оперировать элементами библиотеки VCL из своих функций, и к тому же выносите их в самодельный .cpp файл. Зачем Вы это делаете?


Что-то у меня ничего не получилось, выдало сначало:
F1004 Internal compiler error at 0xc64f00 with base 0xc10000
а потом тот же Fatal - это капец.

Сделал всё, как было инзначально:

Unit1.cpp - здесь добавил стандартные заголовочные файлы и свои:
#include <*.h>
#include "0.h", ..., "6.h"
Обработчики кнопок, в которых использую все переменные и функции из "0.h", ..., "6.h"

0.h - здесь объявил все глоб.переменные, описал (написал прототипы) функции

1.h, ..., 6.h - здесь определил/реализовал (написал программный код функций)

И получилось всё Ok, но как в сказке "О рыбаке и золотой рыбке".

П.С. Хотелось бы затронуть тему лексики С++, но это отдельная тема.

392
07 октября 2014 года
cronya
421 / / 03.01.2009
причем тут лексика, вы элементарное не понимаете.
Откуда у вас Form1 берется, вы на него через заголовочный файл ссылаетесь, где его вы определяете?
Вам Meander правильно написал, у вас область видимости переменных храмает.
Взялись уж за визуальное программирование, извольте основы си++ выучит для начала.
Хватит насиловать людям мозг:)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог