Форум программистов, компьютерный форум, киберфорум
C++/CLI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 07.10.2015
Сообщений: 18
1

Перенос переменных и массивов из *.cpp в *.h

21.01.2016, 20:34. Показов 1197. Ответов 7

Нужно построить график по полученному массиву (строю с помощью zedgraph). Как перенести эти данные из файла исходного кода *.cpp в файл кода формы *.h? В интернете нашел информацию по этой теме, но ничего непонятно... Прошу подробно объяснить.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.01.2016, 20:34
Ответы с готовыми решениями:

Вызов переменных из функции в файле .cpp
Здрасти. Никак не могу понять как это сделать.. Есть файл show.h, в котором объявлены некие...

Перенос из головного файла h в CPP файл
#include <iostream> #include <string> #include "OverOper.h" using namespace std; int main ()...

Перенос данных из одного cpp в другой
Здравствуйте. Допустим, есть два cpp файла, в первом прописано событие "щелчок по кнопке" void...

Передать значения переменных из одного cpp в другой
Здравствуйте. У меня возникла необходимость в чужом проекте передать значения переменных из одного...

7
150 / 138 / 61
Регистрация: 08.09.2014
Сообщений: 1,214
22.01.2016, 11:18 2
Эти данные, это какие, можно с кодом поконкретнее
0
0 / 0 / 0
Регистрация: 07.10.2015
Сообщений: 18
22.01.2016, 12:09  [ТС] 3
Не принципиально. Код большой. Я читаю изображение с помощью opencv, раскладываю его на пиксели значений освещенности. Затем сортирую и преобразую двумерный массив значений освещенности в одномерный. В итоге получается два динамических одномерных массива для построения графика (массивы для осей x и y). Эти массивы и несколько обычных переменных мне нужно перенести в заголовочный файл, так как там строится график. Искал в интернете информацию, в том числе на этом форуме. То что видел - с помощью операций extern, fastcall... Все это не понятно и не работает (я новичок в c++, многие термины не знаю, поэтому не понятно...). Это должно быть распространенной и простой операцией, как мне кажется...

Добавлено через 6 минут
Вот здесь пример построения графика с помощью zedgraph в с++ http://sourceforge.net/project... B%204.6.2/
На его основе я и пытаюсь построить график и перенести в него два динамических одномерных массива числовых данных и переменную int из .cpp.
0
150 / 138 / 61
Регистрация: 08.09.2014
Сообщений: 1,214
22.01.2016, 12:30 4
Обьявление двух одномерных массивов переноси в хедер как и переменные не понимаю в чем загвоздка, а в коде уже выделяй под них память
0
Don't worry, be happy
17204 / 10081 / 1945
Регистрация: 27.09.2012
Сообщений: 25,158
Записей в блоге: 1
22.01.2016, 12:31 5
Это имеется ввиду?
C++
1
2
3
4
5
6
7
8
#ifndef OBJECT_H_INCLUDED
#define OBJECT_H_INCLUDED
//this is objects.h
const size_t width = 5;
const size_t height = 3;
extern int arr[width][height];//array with external linkage
 
#endif // OBJECT_H_INCLUDED
C++
1
2
3
//this is objects.cpp
#include "object.h"
int arr[width][height] = {0};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//this is some cpp file
#include <iostream>
#include "object.h"
 
 
int main()
{
    for(size_t i = 0 ; i<height ; ++i){//height and
        for(size_t j = 0 ; j<width ; ++j){//width 
            std::cout << arr[j][i] << ' ' ;//and arr is visible to this context
        }
        std::cout << std::endl ;
    }
}
0
0 / 0 / 0
Регистрация: 07.10.2015
Сообщений: 18
22.01.2016, 13:05  [ТС] 6
Возможно, но все равно не понятно. extern позволяет использовать данные между заголовочными файлами и файлами исходного кода? Непонятно даже как действует extern. Если я хочу перенести массив из .cpp в .h, то достаточно прописать его в последнем перед массивом (так я понял из вашего кода)? Но это не работает.
Вот информация также:
Перенос значений переменной из одной формы в другую
Перенос переменных.
Как перенести переменную типа TStringList в другой модуль
Но все это тоже непонятно!

Добавлено через 2 минуты
Перенести все вычисления в заголовочный файл? Не работает.
0
Don't worry, be happy
17204 / 10081 / 1945
Регистрация: 27.09.2012
Сообщений: 25,158
Записей в блоге: 1
22.01.2016, 13:09 7
Цитата Сообщение от Sanchsk Посмотреть сообщение
extern позволяет использовать данные между заголовочными файлами и файлами исходного кода?
Учебники есть для этого.
Цитата Сообщение от Sanchsk Посмотреть сообщение
Непонятно даже как действует extern.
Объявление некой сущности (в данном случае массива) с внешней линковкой.
По сути, говорим компилятору, что мол, друг,
вот такой массив у нас есть,
он определен где-то в другом месте,
но для нормальной работы тебе достаточно и этого объявления,
остальное оставь на совести линковщика.
Цитата Сообщение от Sanchsk Посмотреть сообщение
Если я хочу перенести массив из .cpp в .h, то достаточно прописать его в последнем перед массивом (так я понял из вашего кода)?
Не ясно что значит "перенести массив".
Цитата Сообщение от Sanchsk Посмотреть сообщение
Вот информация также
Вам нужна информация на темы:
"Раздельная компиляция"
"Линковка"
"Внутренняя и внешняя линковка"

Добавлено через 2 минуты
Цитата Сообщение от Sanchsk Посмотреть сообщение
Перенести все вычисления в заголовочный файл? Не работает.
минимальный пример того, что не работает, и как оно должно работать. А пока обсуждаем коня в вакууме.
0
0 / 0 / 0
Регистрация: 07.10.2015
Сообщений: 18
22.01.2016, 19:31  [ТС] 8
Перенести массив, то есть перенести данные массива, полученного в файле исходного кода, в заголовочный файл, где идет построение графика.
Пока что у меня extern работает, если в файле исходного кода написан вне main. То есть можно перенести значения только констант.

Добавлено через 2 часа 22 минуты
Ответ на вопрос еще не найден

Добавлено через 1 час 6 минут
Вот заголовочный файл программы построения графика с помощью zedgraph, ссылку на которую я указал выше. Здесь показан пример графика синусоиды. На основе этой формы я хочу построить график по вычисленным мной данным в файле исходного кода .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
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
#pragma once
 
 
namespace ZedGraphSampleVC
{
 
    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;
    using namespace ZedGraph;
 
    /// <summary>
    /// Summary for Form1
    ///
    /// WARNING: If you change the name of this class, you will need to change the
    ///          'Resource File Name' property for the managed resource compiler tool
    ///          associated with all .resx files this class depends on.  Otherwise,
    ///          the designers will not be able to interact properly with localized
    ///          resources associated with this form.
    /// </summary>
    public ref class Form1 : public System::Windows::Forms::Form
    {
    public:
        Form1(void)
        {
            InitializeComponent();
        }
 
    private: 
        void SetSize()
        {
            zg1->Location = Point( 10, 10 );
            // Leave a small margin around the outside of the control
            zg1->Size = System::Drawing::Size( ClientRectangle.Width - 20,
                    ClientRectangle.Height - 20 );
        }
 
        System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e)
        {
            CreateGraph( zg1 );
            SetSize();
        }
 
        System::Void Form1_Resize(System::Object^  sender, System::EventArgs^  e)
        {
            SetSize();
        }
 
        void CreateGraph( ZedGraphControl ^z1 )
        {
            // Get a reference to the GraphPane instance in the ZedGraphControl
            GraphPane ^myPane = z1->GraphPane;
 
            // Set the titles and axis labels
            myPane->Title->Text = L"Demonstration of Dual Y Graph";
            myPane->XAxis->Title->Text = L"Time, Days";
            myPane->YAxis->Title->Text = L"Parameter A";
            myPane->Y2Axis->Title->Text = L"Parameter B";
 
            // Make up some data points based on the Sine function
            PointPairList ^list = gcnew PointPairList();
            PointPairList ^list2 = gcnew PointPairList();
            for ( int i = 0; i < 36; i++ )                  !!!!ПОСТРОЕНИЕ ГРАФИКА!!!
            {
                double x = (double)i * 5.0;
                double y = Math::Sin( (double)i * Math::PI / 15.0 ) * 16.0;
                double y2 = y * 13.5;
                list->Add( x, y );
                list2->Add( x, y2 );
            }
 
            // Generate a red curve with diamond symbols, and "Alpha" in the legend
            LineItem ^myCurve = myPane->AddCurve( L"Alpha",
                list, Color::Red, SymbolType::Diamond );
            // Fill the symbols with white
            myCurve->Symbol->Fill = gcnew Fill( Color::White );
 
            // Generate a blue curve with circle symbols, and "Beta" in the legend
            myCurve = myPane->AddCurve( L"Beta",
                list2, Color::Blue, SymbolType::Circle );
            // Fill the symbols with white
            myCurve->Symbol->Fill = gcnew Fill( Color::White );
            // Associate this curve with the Y2 axis
            myCurve->IsY2Axis = true;
 
            // Show the x axis grid
            myPane->XAxis->MajorGrid->IsVisible = true;
 
            // Make the Y axis scale red
            myPane->YAxis->Scale->FontSpec->FontColor = Color::Red;
            myPane->YAxis->Title->FontSpec->FontColor = Color::Red;
            // turn off the opposite tics so the Y tics don't show up on the Y2 axis
            myPane->YAxis->MajorTic->IsOpposite = false;
            myPane->YAxis->MinorTic->IsOpposite = false;
            // Don't display the Y zero line
            myPane->YAxis->MajorGrid->IsZeroLine = false;
            // Align the Y axis labels so they are flush to the axis
            myPane->YAxis->Scale->Align = AlignP::Inside;
            // Manually set the axis range
            myPane->YAxis->Scale->Min = -30;
            myPane->YAxis->Scale->Max = 30;
 
            // Enable the Y2 axis display
            myPane->Y2Axis->IsVisible = true;
            // Make the Y2 axis scale blue
            myPane->Y2Axis->Scale->FontSpec->FontColor = Color::Blue;
            myPane->Y2Axis->Title->FontSpec->FontColor = Color::Blue;
            // turn off the opposite tics so the Y2 tics don't show up on the Y axis
            myPane->Y2Axis->MajorTic->IsOpposite = false;
            myPane->Y2Axis->MinorTic->IsOpposite = false;
            // Display the Y2 axis grid lines
            myPane->Y2Axis->MajorGrid->IsVisible = true;
            // Align the Y2 axis labels so they are flush to the axis
            myPane->Y2Axis->Scale->Align = AlignP::Inside;
 
            // Fill the axis background with a gradient
            myPane->Chart->Fill = gcnew Fill( Color::White, Color::LightGray, 45.0f );
 
            // Add a text box with instructions
            TextObj ^text = gcnew TextObj(
                L"Zoom: left mouse & drag\nPan: middle mouse & drag\nContext Menu: right mouse",
                0.05f, 0.95f, CoordType::ChartFraction, AlignH::Left, AlignV::Bottom );
            text->FontSpec->StringAlignment = StringAlignment::Near;
            myPane->GraphObjList->Add( text );
 
            // Enable scrollbars if needed
            z1->IsShowHScrollBar = true;
            z1->IsShowVScrollBar = true;
            z1->IsAutoScrollRange = true;
            z1->IsScrollY2 = true;
 
            // OPTIONAL: Show tooltips when the mouse hovers over a point
            z1->IsShowPointValues = true;
            z1->PointValueEvent += gcnew ZedGraphControl::PointValueHandler( this,
                    &Form1::MyPointValueHandler );
 
            // OPTIONAL: Add a custom context menu item
            z1->ContextMenuBuilder += gcnew
                    ZedGraphControl::ContextMenuBuilderEventHandler(
                    this, &Form1::MyContextMenuBuilder );
 
            // OPTIONAL: Handle the Zoom Event
            z1->ZoomEvent += gcnew ZedGraphControl::ZoomEventHandler( this,
                        &Form1::MyZoomEvent );
 
            // Size the control to fit the window
            SetSize();
 
            // Tell ZedGraph to calculate the axis ranges
            // Note that you MUST call this after enabling IsAutoScrollRange, since AxisChange() sets
            // up the proper scrolling parameters
            z1->AxisChange();
            // Make sure the Graph gets redrawn
            z1->Invalidate();
        }
 
        /// <summary>
        /// Display customized tooltips when the mouse hovers over a point
        /// </summary>
        System::String ^MyPointValueHandler( ZedGraphControl ^control, GraphPane ^pane,
                        CurveItem ^curve, int iPt )
        {
            // Get the PointPair that is under the mouse
            PointPair pt = curve[iPt];
 
            return curve->Label->Text + " is " + pt.Y.ToString( "f2" ) + " units at " + pt.X.ToString( "f1" ) + " days";
        }
 
        /// <summary>
        /// Customize the context menu by adding a new item to the end of the menu
        /// </summary>
        void MyContextMenuBuilder( ZedGraphControl ^control,
                    System::Windows::Forms::ContextMenuStrip ^menuStrip,
                    Point mousePt,
                    ZedGraphControl::ContextMenuObjectState objState )
        {
            ToolStripMenuItem ^item = gcnew ToolStripMenuItem();
            item->Name = L"add-beta";
            item->Tag = L"add-beta";
            item->Text = L"Add a new Beta Point";
            item->Click += gcnew System::EventHandler( this, &Form1::AddBetaPoint );
 
            menuStrip->Items->Add( item );
        }
 
        /// <summary>
        /// Handle the "Add New Beta Point" context menu item.  This finds the curve with
        /// the CurveItem.Label = "Beta", and adds a new point to it.
        /// </summary>
        void AddBetaPoint( System::Object ^sender, EventArgs ^args )
        {
            // Get a reference to the "Beta" curve IPointListEdit
            IPointListEdit ^ip = (IPointListEdit^) zg1->GraphPane->CurveList[L"Beta"]->Points;
            if ( ip != nullptr )
            {
                double x = ip->Count * 5.0;
                double y = Math::Sin( ip->Count * Math::PI / 15.0 ) * 16.0 * 13.5;
                ip->Add( x, y );
                zg1->AxisChange();
                zg1->Refresh();
            }
        }
 
        // Respond to a Zoom Event
        void MyZoomEvent( ZedGraphControl ^control, ZoomState ^oldState,
                    ZoomState ^newState )
        {
            // Here we get notification everytime the user zooms
        }
 
    protected:
        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        ~Form1()
        {
            if (components)
            {
                delete components;
            }
        }
    private: ZedGraph::ZedGraphControl^  zg1;
    protected: 
 
    protected: 
 
    protected: 
 
    protected: 
    private: System::ComponentModel::IContainer^  components;
 
    private:
        /// <summary>
        /// Required designer variable.
        /// </summary>
 
 
#pragma region Windows Form Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        void InitializeComponent(void)
        {
            this->SuspendLayout();
            // 
            // Form1
            // 
            this->ClientSize = System::Drawing::Size(284, 261);
            this->Name = L"Form1";
            this->Load += gcnew System::EventHandler(this, &Form1::Form1_Load_1);
            this->ResumeLayout(false);
 
        }
#pragma endregion
    private: System::Void Form1_Load_1(System::Object^  sender, System::EventArgs^  e) {
    }
};
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.01.2016, 19:31

Програмки на cpp для вещественных массивов
Пожалуйста помогите написать пару программ на языке cpp: 1. Даны вещественные массивы D, A. Для...

Вычислить сумму отрицательных элементов массивов в функции. [CPP]
Вычислить суммы отрицательных элементов массивов X(N), Y(M), Z(K). Сумму вычислять в функции....

Как избавиться от замусоривания cpp файлов дубликатами деклараций функций и переменных?
Как избавиться от замусоривания cpp файлов дубликатами деклараций функций и переменных? У меня...

Перенос переменных.
Вопрос вообщем-то простой, но ответа на него я не нашёл: Как воспользоваться переменной во второй...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

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