powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / не копируется структура
29 сообщений из 29, показаны все 2 страниц
не копируется структура
    #38635818
woojin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
всем здравствуйте!
задача в принципе не сложная, но т.к. я с "СИ" ни когда не сталкивался упёрся лбом в стенку
есть структура
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
const int len = 31, tlen = 16;

struct TelList {
	char fam[len];
	char name[len];
	char tel[16];
	int start;
	int end;
	TelList* next;
};
//TelList* tl = new TelList;
TelList* tl;


переменная tl (как я понял) задаётся глобально, т.к. структура описана в заголовочном файле который подключен ко всем CPP файлам
и в одной из функций надо локально сделать копию данной переменной чтобы потом перегнать её в StringGrid
вот так
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
	   TelList* pv = tl;
	   while(pv) {
		  StringGrid1->Cells[0][0] = StringGrid1->RowCount+1;
		  StringGrid1->Cells[1][0] = pv->fam;
		  StringGrid1->Cells[2][0] = pv->name;
		  StringGrid1->Cells[3][0] = pv->tel;
		  StringGrid1->Cells[4][0] = DateTimeToStr(pv->end - pv->start);
		  pv=pv->next;
	   }


но почему то при TelList* pv = tl; переменная pv просто становится нулевой!!!
подскажите что сделать, чтобы tl скопировалась в pv ?
...
Рейтинг: 0 / 0
не копируется структура
    #38635841
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
woojinчто сделать, чтобы tl скопировалась в pv?
Убрать звёздочку при объявлении pv. Почувствуй разницу между значением и указателем на него.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
не копируется структура
    #38635846
woojin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovУбрать звёздочку при объявлении pv.

ошибка: не возможно конвертировать 'TelList *' в 'TelList'
Dimitry SibiryakovПочувствуй разницу между значением и указателем на него.

я в СИ не шарю так что почувствовать не получается (((
...
Рейтинг: 0 / 0
не копируется структура
    #38635851
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверял чему равно tl ?
...
Рейтинг: 0 / 0
не копируется структура
    #38635853
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovwoojinчто сделать, чтобы tl скопировалась в pv?
Убрать звёздочку при объявлении pv. Почувствуй разницу между значением и указателем на него.

как понимаю это связный список, надо указатель на начало скопировать, не надо звездочки убирать.
...
Рейтинг: 0 / 0
не копируется структура
    #38635860
woojin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TПроверял чему равно tl ?
при каждом пуске программы постоянно изменяющемуся адресу
...
Рейтинг: 0 / 0
не копируется структура
    #38635862
woojin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima Tкак понимаю это связный список, надо указатель на начало скопировать, не надо звездочки убирать.
в том то и дело он не копируется, после TelList* pv = tl; , pv становится NULL
...
Рейтинг: 0 / 0
не копируется структура
    #38635864
woojin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
если сделать так
Код: c#
1.
2.
	   TelList*pv;
	   pv = tl;


то pv так же становится равно NULL
при этом в tl данные есть
...
Рейтинг: 0 / 0
не копируется структура
    #38635867
pirovindos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
woojin,

Как ты выяснил, что при TelList* pv = tl; переменная pv просто становится нулевой!

Отладчик?
...
Рейтинг: 0 / 0
не копируется структура
    #38635876
woojin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pirovindoswoojin,
Отладчик?
ага
это до:

это после
...
Рейтинг: 0 / 0
не копируется структура
    #38635891
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
woojinDima Tкак понимаю это связный список, надо указатель на начало скопировать, не надо звездочки убирать.
в том то и дело он не копируется, после TelList* pv = tl; , pv становится NULL
Проверь
Код: plaintext
1.
2.
3.
TelList* pv = tl;
MessageBox(NULL, tl->fam, "tl", 0);
MessageBox(NULL, pv->fam, "pv", 0);
...
Рейтинг: 0 / 0
не копируется структура
    #38635902
pirovindos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
woojin,

Ход отладчик не всегда идеально соответствует строкам кода (он не по исходнику работает).
На whilе(pv) еще может ничего не присвоено, посмотри, попадает ли исполнение внутрь цикла while.
...
Рейтинг: 0 / 0
не копируется структура
    #38635906
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pirovindosХод отладчик не всегда идеально соответствует строкам кода (он не по
исходнику работает).
А жёлтая полоска на скриншотах как бы намекает, что этот код ещё и не был сохранён...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
не копируется структура
    #38635908
woojin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TПроверь
Код: plaintext
1.
2.
3.
TelList* pv = tl;
MessageBox(NULL, tl->fam, "tl", 0);
MessageBox(NULL, pv->fam, "pv", 0);


пусто

pirovindoswoojin,

Ход отладчик не всегда идеально соответствует строкам кода (он не по исходнику работает).
На whilе(pv) еще может ничего не присвоено, посмотри, попадает ли исполнение внутрь цикла while.
не попадает, со строки whilе(pv) сразу проходит дальше (т.е. во внутрь не попадает)
...
Рейтинг: 0 / 0
не копируется структура
    #38635911
Фотография Macks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
woojinDima TПроверь
Код: plaintext
1.
2.
3.
TelList* pv = tl;
MessageBox(NULL, tl->fam, "tl", 0);
MessageBox(NULL, pv->fam, "pv", 0);


пусто



В обоих боксах?
...
Рейтинг: 0 / 0
не копируется структура
    #38635920
woojin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а сейчас вообще стало ошибку выдавать на обоих MessageBox
[bcc32 Error] main.cpp(39): E2034 Cannot convert 'char *' to 'const wchar_t *'
[bcc32 Error] main.cpp(39): E2342 Type mismatch in parameter 'lpText' (wanted 'const wchar_t *', got 'char *')
...
Рейтинг: 0 / 0
не копируется структура
    #38635975
clihlt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
woojin,

A "TelList* tl;" тоже в заголовочном файле который подключен ко всем CPP файлам ?
...
Рейтинг: 0 / 0
не копируется структура
    #38635997
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
woojinа сейчас вообще стало ошибку выдавать на обоих MessageBox
[bcc32 Error] main.cpp(39): E2034 Cannot convert 'char *' to 'const wchar_t *'
[bcc32 Error] main.cpp(39): E2342 Type mismatch in parameter 'lpText' (wanted 'const wchar_t *', got 'char *')
Это компилятор изначально настроен на юникод. Отключи. Тут с картинками
...
Рейтинг: 0 / 0
не копируется структура
    #38636015
woojin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
clihltwoojin,
A "TelList* tl;" тоже в заголовочном файле который подключен ко всем CPP файлам ?
да
Dima TЭто компилятор изначально настроен на юникод. Отключи. Тут с картинками
у меня RAD Studio XE5 - используется для Delphi, не нашёл где это отключается, единственная похожая опция


P.S. было бы задание на дельфе, я бы уже накатал, а вот на СИ как то не получается (((((
...
Рейтинг: 0 / 0
не копируется структура
    #38636017
clihlt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
woojin,


woojinclihltwoojin,
A "TelList* tl;" тоже в заголовочном файле который подключен ко всем CPP файлам ?
да

Ну дык... нибось значение в переменную tl записывается в одном CPP файле, а читать пытаешься во втором?

Надо в одном из CPP написать TelList* tl; а в заголовочном файле "export TelList* tl"
...
Рейтинг: 0 / 0
не копируется структура
    #38636030
woojin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
clihltwoojin,


woojinпропущено...

да

Ну дык... нибось значение в переменную tl записывается в одном CPP файле, а читать пытаешься во втором?

Надо в одном из CPP написать TelList* tl; а в заголовочном файле "export TelList* tl"

заголовочный со структурой
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
//---------------------------------------------------------------------------

#ifndef structH
#define structH
const int len = 31, tlen = 17;

struct TelList {
	char fam[len];
	char name[len];
	char tel[tlen];
	int start;
	int end;
	TelList* next;
};
//TelList* tl = new TelList;
TelList* tl;
//---------------------------------------------------------------------------
#endif


CPP структурного заголовка
Код: c#
1.
2.
3.
4.
5.
6.
//---------------------------------------------------------------------------

#pragma hdrstop

#include "struct.h"
//---------------------------------------------------------------------------


в каком месте я должен расположить export ?
...
Рейтинг: 0 / 0
не копируется структура
    #38636047
clihlt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
woojin,

CPP структурного заголовка
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
//---------------------------------------------------------------------------

#pragma hdrstop

#include "struct.h"
//---------------------------------------------------------------------------
TelList* tl;



заголовочный со структурой
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
//---------------------------------------------------------------------------

#ifndef structH
#define structH
const int len = 31, tlen = 17;

struct TelList {
	char fam[len];
	char name[len];
	char tel[tlen];
	int start;
	int end;
	TelList* next;
};
//TelList* tl = new TelList;
export TelList* tl;
//---------------------------------------------------------------------------
#endif
...
Рейтинг: 0 / 0
не копируется структура
    #38636068
smald
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
woojin
Есть ли где в заголовках или в потоке исполнения строки типа
Код: plaintext
1.
struct TelList glob_val;


И в потоках исполнения
Код: plaintext
1.
 tl = &glob_val;


?

Если этого нет, то в tl что угодно, тоько не адрес экземпляра struct TelList.

ЗЫ над Вами тут стебутся, призывая звёздочки убрать, не слушайте.
Запись TelList* pv = tl; правильна.

ЗЫ если не секрет, где это Вам сразу так доверили на С-ях писать, не зная их.
Узнать бы контору, которая такое практикует, софт у них лёгкая мишень по любому.
...
Рейтинг: 0 / 0
не копируется структура
    #38636152
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
В неинициализированной глобальной переменной не что угодно, а совершенно точно NULL.
...
Рейтинг: 0 / 0
не копируется структура
    #38637235
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
?В неинициализированной глобальной переменной не что угодно, а совершенно точно NULL.Заблуждаешься.
...
Рейтинг: 0 / 0
не копируется структура
    #38637603
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl?В неинициализированной глобальной переменной не что угодно, а совершенно точно NULL.Заблуждаешься.

В чистом С?
...
Рейтинг: 0 / 0
не копируется структура
    #38637677
woojin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
кому интересно, смотрите
было задание на курсач:
Вариант 17
На междугородной телефонной станции картотека абонентов. содержащая сведе-
ния о телефонах и их владельцах. организована в виде линейного списка.
Написать программу. которая:

* обеспечивает начальное формирование картотеки в виде линейного списка;

* производит вывод всей картотеки:

* вводит номер телефона и время разговора;

* выводит извещение на оплату телефонного разговора

Программа должна обеспечивать диалог с помощью меню и контроль ошибок при
вводе.


сделал вот так:
файл "main.h"
Код: 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.
//---------------------------------------------------------------------------

#ifndef mainH
#define mainH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Grids.hpp>
#include <Mask.hpp>
#include <DateUtils.hpp>
#include <ComCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE-managed Components
	TStringGrid *StringGrid1;
	TButton *add;
	TButton *edit;
	TButton *del;
	TGroupBox *GroupBox1;
	TGroupBox *GroupBox2;
	TButton *apply;
	TEdit *Edit3;
	TEdit *Edit2;
	TEdit *Edit1;
	TLabel *Label5;
	TLabel *Label4;
	TLabel *Label3;
	TLabel *Label2;
	TLabel *Label1;
	TEdit *Edit4;
	TLabel *Label6;
	TButton *find;
	TGroupBox *GroupBox3;
	TLabel *Label7;
	TMaskEdit *MaskEdit3;
	TButton *izv;
	TMemo *Memo1;
	TButton *cler;
	TButton *rest;
        TDateTimePicker *DateTimePicker1;
        TDateTimePicker *DateTimePicker2;
	void __fastcall FormCreate(TObject *Sender);
	void __fastcall Edit3KeyPress(TObject *Sender, char &Key);
	void __fastcall Edit1KeyPress(TObject *Sender, char &Key);
	void __fastcall MaskEdit3KeyPress(TObject *Sender, char &Key);
	void __fastcall Edit2KeyPress(TObject *Sender, char &Key);
	void __fastcall addClick(TObject *Sender);
	void __fastcall applyClick(TObject *Sender);
	void __fastcall editClick(TObject *Sender);
		void __fastcall FormDestroy(TObject *Sender);
	void __fastcall delClick(TObject *Sender);
	void __fastcall findClick(TObject *Sender);
	void __fastcall clerClick(TObject *Sender);
	void __fastcall izvClick(TObject *Sender);
	void __fastcall restClick(TObject *Sender);
		void __fastcall DateTimePicker1KeyPress(TObject *Sender,
		  char &Key);
		void __fastcall DateTimePicker2KeyPress(TObject *Sender,
		  char &Key);
		void __fastcall Edit4KeyPress(TObject *Sender, char &Key);
private:	// User declarations
public:		// User declarations
	__fastcall TForm1(TComponent* Owner);
};
struct Abonent {
	AnsiString fam;
	AnsiString nam;
	AnsiString tel;
	AnsiString start;
	AnsiString end;
	Abonent *next;
};
Abonent *TelList = 0, *find_list = 0;

//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
void add_abn(Abonent& abn);
void edit_abn(Abonent &beg);
void del_abn(AnsiString fam, AnsiString nam, AnsiString tel);
void add_finded(Abonent &abn);
void find_abn(Abonent *pv, AnsiString tel);
Abonent* find_abn(Abonent *pv, AnsiString fam, AnsiString nam, AnsiString tel, Abonent** prev);
AnsiString notice(int pay, Abonent *pv);
int read_dbase(char* filename);
int write_dbase(char *filename);


файл "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.
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.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
401.
402.
403.
404.
405.
406.
407.
408.
409.
410.
411.
412.
413.
414.
415.
416.
417.
418.
419.
420.
421.
422.
423.
424.
425.
426.
427.
428.
429.
430.
431.
432.
433.
434.
435.
436.
437.
438.
439.
440.
441.
442.
443.
444.
445.
446.
447.
448.
449.
450.
451.
452.
453.
454.
455.
456.
457.
458.
459.
460.
461.
462.
463.
464.
465.
466.
467.
468.
469.
470.
471.
472.
473.
474.
475.
476.
477.
478.
479.
480.
481.
482.
483.
484.
485.
486.
487.
488.
489.
490.
491.
492.
493.
494.
495.
496.
497.
498.
499.
500.
501.
502.
503.
504.
505.
506.
507.
508.
509.
510.
511.
512.
513.
514.
515.
516.
517.
518.
519.
520.
521.
522.
523.
524.
525.
526.
527.
528.
529.
530.
531.
532.
533.
534.
535.
536.
537.
538.
539.
540.
541.
542.
543.
544.
545.
546.
547.
548.
549.
550.
551.
552.
553.
554.
555.
556.
557.
558.
559.
560.
561.
562.
563.
564.
565.
566.
567.
568.
569.
570.
571.
572.
573.
574.
575.
576.
577.
//---------------------------------------------------------------------------

#include <vcl.h>
#include <stdio.h>
#pragma hdrstop

#include "main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
bool add_edit=false;
AnsiString familia, name, telephone;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
// ---ResizeGrid--------------------------------------------------------------
void ResizeGrid(TStringGrid* SG) {
	int cols, widths, w, c;

	cols = SG->ColCount;
	c = cols-1;
	w = SG->ColWidths[0];
	w = SG->Width - w;
	widths = (w / c) - 6;
	for (int i = 1; i <= cols - 1; i++) {
		SG->ColWidths[i] = widths;
	}
}

// ---обновлени StringGrid и очистка Edits--------------------------------------------------------------
void ReadActiv(TStringGrid* SG) {
		Form1->GroupBox1->Enabled = false;
		Form1->Label1->Enabled = false;
		Form1->Label2->Enabled = false;
		Form1->Label3->Enabled = false;
		Form1->Label4->Enabled = false;
		Form1->Label5->Enabled = false;
	Form1->Edit1->Enabled = false;
	Form1->Edit2->Enabled = false;
	Form1->Edit3->Enabled = false;
	Form1->DateTimePicker1->Enabled = false;
	Form1->DateTimePicker2->Enabled = false;
	Form1->DateTimePicker1->Time = Form1->DateTimePicker1->Time.CurrentTime();
	Form1->DateTimePicker2->Time = Form1->DateTimePicker2->Time.CurrentTime();
		Form1->apply->Enabled = false;
		Form1->rest->Enabled = false;

	Form1->Edit1->Text = "";
	Form1->Edit2->Text = "";
	Form1->Edit3->Text = "";

		for (int r = 1; r < SG->RowCount; r++) {
				for (int c = 0; c < SG->ColCount; c++) {
						SG->Cells[c][r] = "";
				}
		}
	SG->RowCount = 2;

	Abonent *pv;

	if (find_list) {
		pv = find_list;
	} else {
		pv = TelList;
	}

		while(pv) {
			SG->RowCount++;
			SG->Cells[0][SG->RowCount-2] = SG->RowCount - 2;
			SG->Cells[1][SG->RowCount-2] = pv->fam;
			SG->Cells[2][SG->RowCount-2] = pv->nam;
			SG->Cells[3][SG->RowCount-2] = pv->tel;
			SG->Cells[4][SG->RowCount-2] = TimeToStr(StrToTime(pv->end) - StrToTime(pv->start));
			pv=pv->next;
		}
	if (SG->RowCount>2) {
		Form1->edit->Enabled = true;
		Form1->del->Enabled = true;
		Form1->GroupBox3->Enabled = true;
	} else {
		Form1->edit->Enabled = false;
		Form1->del->Enabled = false;
		Form1->GroupBox3->Enabled = false;
	}
		Form1->add->Enabled = true;
}

// ---главная--------------------------------------------------------------
void start() {
	read_dbase("dbase.abn");
}
// ---добавление абонента--------------------------------------------------------------
void add_abn(Abonent& abn)
{
	Abonent *pv = new Abonent;
	*pv = abn;
	pv->next=0;

	if(TelList)
	{
		Abonent *temp = TelList;
		while(temp->next)
			temp = temp->next;
		temp->next = pv;
	}
	else
		TelList = pv;
}

// ---корректировка--------------------------------------------------------------
void edit_abn(Abonent &beg)
{
	Abonent *prev;
	AnsiString fam = beg.fam;
	AnsiString nam = beg.nam;
	Abonent *abn = find_abn(TelList, familia, name, telephone, &prev);
	abn->fam = beg.fam;
	abn->nam = beg.nam;
	abn->tel = beg.tel;
	abn->start = beg.start;
	abn->end = beg.end;
}

// ---удаление--------------------------------------------------------------
void del_abn(AnsiString fam, AnsiString nam, AnsiString tel)
{
	Abonent *prev;
	Abonent *pv=find_abn(TelList, fam, nam, tel, &prev);
	if (pv)
	{
		if(pv == TelList)
			TelList = TelList->next;
		else
			TelList->next = pv->next;
		delete pv;
	}
}

// ---добавление найденых записей в список поиска по телефону--------------------------------------------------------------
void add_finded(Abonent &abn) {
	Abonent *pv = new Abonent;
	*pv = abn;
	pv->next=0;

	if(find_list)
	{
		Abonent *temp = find_list;
		while(temp->next)
			temp = temp->next;
		temp->next = pv;
	}
	else
				find_list=pv;
}
// ---поиск по телефону--------------------------------------------------------------
void find_abn(Abonent *pv, AnsiString tel)
{
	Abonent *prev = 0, *first = 0;
	Abonent *ret = pv;
	Abonent *tmp = new Abonent;
	tmp->next = 0;
	while(ret)
	{
		if(ret->tel == tel) {
		   add_finded(*ret);
		}
		ret=ret->next;
	}
		if (!find_list) {
				ShowMessage("Ничего не найдено");
		}
}

// ---поиск по фамилии, имени и телефону--------------------------------------------------------------
Abonent* find_abn(Abonent* pv, AnsiString fam, AnsiString nam, AnsiString tel, Abonent** prev)
{
	*prev=0;
	while(pv != NULL)
	{
		if(pv->fam == fam && pv->nam == nam && pv->tel == tel) {
			return pv;
		}
		*prev=pv;
		pv=pv->next;
	}
	return 0;
}

// ---формирование извещения--------------------------------------------------------------
AnsiString notice(int pay, Abonent *pv) {
	AnsiString not;
	not = "Абонент: " + pv->fam + " " + pv->nam + "\r\n";
	not+= "Номер телефона: " + pv->tel + "\r\n";
	not+= "Начало разговора: " + pv->start + "\r\n";
	not+= "Окончание разговора: " + pv->end + "\r\n";
	not+= "Длительность разговора: " + TimeToStr(StrToTime(pv->end) - StrToTime(pv->start)) + "\r\n";

	TTime call_duration = StrToTime(pv->end) - StrToTime(pv->start);
	int h = HourOf(call_duration);
	int m = MinuteOf(call_duration);
	int s = SecondOf(call_duration);
	float mins = h * 60 + m + (float)s / 60;
	AnsiString tmp = FormatFloat("0.00", (mins * pay));
	int rub = tmp.SubString(0, tmp.Pos(",")-1).ToInt();
	int kop = tmp.SubString(tmp.Pos(",")+1, tmp.Length()).ToInt();

	not+= "Сумма к оплате: " + IntToStr(rub) + " руб. " + IntToStr(kop) + " коп.";

	return not;
}

// ---чтение из файла--------------------------------------------------------------
int read_dbase(char* filename)
{
	FILE* fin;
	Abonent abn;
	const int MaxLen = 255;
	char fam[MaxLen], nam[MaxLen], tel[MaxLen], start[MaxLen], end[MaxLen];

	if((fin=fopen(filename,"r"))==0)
	{
		return 0;
	}
	while(!feof(fin))
	{
				fscanf(fin, "%s\n%s\n%s\n%s\n%s\n", fam, nam, tel, start, end);

		abn.fam=AnsiString(fam);
		abn.nam=AnsiString(nam);
		abn.tel=AnsiString(tel);
		abn.start=AnsiString(start);
		abn.end=AnsiString(end);
		add_abn(abn);
	}
	fclose(fin);
	return 0;
}

// ---запись в файл--------------------------------------------------------------
int write_dbase(char *filename)
{
	FILE *fout;
		Abonent *pv = TelList;
	if ((fout=fopen(filename,"w")))
	{
		while(pv != NULL)
		{
				fprintf(fout, "%s\n%s\n%s\n%s\n%s\n", pv->fam, pv->nam, pv->tel, pv->start, pv->end);
				pv=pv->next;
		}
		}
	fclose(fout);
	return 0;
}

//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
	StringGrid1->Cells[0][0] = "№";
	StringGrid1->Cells[1][0] = "Фамилия";
	StringGrid1->Cells[2][0] = "Имя";
	StringGrid1->Cells[3][0] = "Номер";
	StringGrid1->Cells[4][0] = "Длительность";
	ResizeGrid(StringGrid1);
	start();
	ReadActiv(StringGrid1);
}

//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
	write_dbase("dbase.abn");
}

//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
{
	if(((Key>='А')&&(Key<='я')) || ((Key>='a')&&(Key<='z'))
			|| ((Key>='A')&&(Key<='Z'))||(Key==VK_BACK)) return;
	if (Key=13) {
		Edit2->SetFocus();
	}
	Key=0;
}

//---------------------------------------------------------------------------
void __fastcall TForm1::Edit2KeyPress(TObject *Sender, char &Key)
{
	if(((Key>='А')&&(Key<='я')) || ((Key>='a')&&(Key<='z'))
			|| ((Key>='A')&&(Key<='Z'))||(Key==VK_BACK)) return;
	if (Key=13) {
		Edit3->SetFocus();
	}
	Key=0;
}

//---------------------------------------------------------------------------
void __fastcall TForm1::Edit3KeyPress(TObject *Sender, char &Key)
{
	switch (Key) {
	case '0':
	case '1':
	case '2':
	case '3':
	case '4':
	case '5':
	case '6':
	case '7':
	case '8':
	case '9':
	case '-':
	case '+':
	case 8:
		break;
	case 13: {
			DateTimePicker1->SetFocus();
			break;
		}
	default:
		Key = 0;
	}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit4KeyPress(TObject *Sender, char &Key)
{
	switch (Key) {
	case '0':
	case '1':
	case '2':
	case '3':
	case '4':
	case '5':
	case '6':
	case '7':
	case '8':
	case '9':
	case '-':
	case '+':
	case 8:
		break;
	case 13: {
			find->Click();
			break;
		}
	default:
		Key = 0;
	}
}

//---------------------------------------------------------------------------
void __fastcall TForm1::DateTimePicker1KeyPress(TObject *Sender, char &Key)
{
	switch (Key) {
	case '0':
	case '1':
	case '2':
	case '3':
	case '4':
	case '5':
	case '6':
	case '7':
	case '8':
	case '9':
	case 8:
		break;
	case 13: {
			DateTimePicker2->SetFocus();
			break;
		}
	default:
		Key = 0;
	}
}

//---------------------------------------------------------------------------
void __fastcall TForm1::DateTimePicker2KeyPress(TObject *Sender, char &Key)
{
	switch (Key) {
	case '0':
	case '1':
	case '2':
	case '3':
	case '4':
	case '5':
	case '6':
	case '7':
	case '8':
	case '9':
	case 8:
		break;
	case 13: {
			apply->Click();
			break;
		}
	default:
		Key = 0;
	}
}

//---------------------------------------------------------------------------
void __fastcall TForm1::MaskEdit3KeyPress(TObject *Sender, char &Key)
{
	switch (Key) {
	case '0':
	case '1':
	case '2':
	case '3':
	case '4':
	case '5':
	case '6':
	case '7':
	case '8':
	case '9':
	case 8:
		break;
	case 13: {
			izv->Click();
			break;
		}
	default:
		Key = 0;
	}
}

//---------------------------------------------------------------------------
void __fastcall TForm1::addClick(TObject *Sender)
{
	add_edit = false;
		GroupBox1->Enabled = true;
		Label1->Enabled = true;
		Label2->Enabled = true;
		Label3->Enabled = true;
		Label4->Enabled = true;
		Label5->Enabled = true;
	Edit1->Enabled = true;
	Edit2->Enabled = true;
	Edit3->Enabled = true;
	DateTimePicker1->Enabled = true;
	DateTimePicker2->Enabled = true;
		apply->Enabled = true;
		rest->Enabled = true;
	Edit1->SetFocus();

		add->Enabled = false;
		edit->Enabled = false;
		del->Enabled = false;
}

//---------------------------------------------------------------------------
void __fastcall TForm1::editClick(TObject *Sender)
{
	add_edit = true;
		GroupBox1->Enabled = true;
		Label1->Enabled = true;
		Label2->Enabled = true;
		Label3->Enabled = true;
		Label4->Enabled = true;
		Label5->Enabled = true;
	Edit1->Enabled = true;
	Edit2->Enabled = true;
	Edit3->Enabled = true;
	DateTimePicker1->Enabled = true;
	DateTimePicker2->Enabled = true;
		apply->Enabled = true;
		rest->Enabled = true;
	Edit1->SetFocus();

		add->Enabled = false;
		edit->Enabled = false;
		del->Enabled = false;

	Abonent* prev;
	AnsiString fam = StringGrid1->Cells[1][StringGrid1->Row];
	AnsiString nam = StringGrid1->Cells[2][StringGrid1->Row];
	AnsiString tel = StringGrid1->Cells[3][StringGrid1->Row];
	Abonent* pv = find_abn(TelList, fam, nam, tel, &prev);

	Edit1->Text = pv->fam;
	Edit2->Text = pv->nam;
	Edit3->Text = pv->tel;
	DateTimePicker1->Time = StrToTime(pv->start);
	DateTimePicker2->Time = StrToTime(pv->end);

	familia = pv->fam;
	name = pv->nam;
	telephone = pv->tel;
}

//---------------------------------------------------------------------------
void __fastcall TForm1::applyClick(TObject *Sender)
{
		Edit1->Text = Edit1->Text.Trim();
		Edit2->Text = Edit2->Text.Trim();
		Edit3->Text = Edit3->Text.Trim();

		Abonent abn;
		if (Edit1->Text.Length() && Edit2->Text.Length() && Edit3->Text.Length()) {
			abn.fam = Edit1->Text;
			abn.nam = Edit2->Text;
			abn.tel = Edit3->Text;
			abn.start = DateTimePicker1->Time.TimeString();
			abn.end = DateTimePicker2->Time.TimeString();
		} else {
		   ShowMessage("Все поля должны быть заполнены");
		   return;
		}

	if (!add_edit) {
		add_abn(abn);
	} else {
		edit_abn(abn);
	}

	ReadActiv(StringGrid1);
}

//---------------------------------------------------------------------------
void __fastcall TForm1::restClick(TObject *Sender)
{
	ReadActiv(StringGrid1);
}

//---------------------------------------------------------------------------
void __fastcall TForm1::delClick(TObject *Sender)
{
	AnsiString fam = StringGrid1->Cells[1][StringGrid1->Row];
	AnsiString nam = StringGrid1->Cells[2][StringGrid1->Row];
	AnsiString tel = StringGrid1->Cells[3][StringGrid1->Row];
	del_abn(fam, nam, tel);
		ReadActiv(StringGrid1);
}

//---------------------------------------------------------------------------
void __fastcall TForm1::findClick(TObject *Sender)
{
	AnsiString tel = Edit4->Text;
	find_list = 0;
	find_abn(TelList, tel);
	ReadActiv(StringGrid1);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::clerClick(TObject *Sender)
{
	Edit4->Text = "";
	find_list = 0;
	ReadActiv(StringGrid1);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::izvClick(TObject *Sender)
{
	Memo1->Clear();
	AnsiString tmp_pay = MaskEdit3->Text.Trim();
	if (tmp_pay.Length()) {
		int pay = StrToInt(tmp_pay);
		Abonent* prev;
		int row = StringGrid1->Row;
		if (row == 0) {
			row++;
		}
		AnsiString fam = StringGrid1->Cells[1][row];
		AnsiString nam = StringGrid1->Cells[2][row];
		AnsiString tel = StringGrid1->Cells[3][row];
		Abonent* pv = find_abn(TelList, fam, nam, tel, &prev);

		AnsiString not = notice(pay, pv);
		Memo1->Lines->Add(not);
	} else {
		ShowMessage("Введите цену минуты");
	}
}

//---------------------------------------------------------------------------


во вложении проект целиком
...
Рейтинг: 0 / 0
не копируется структура
    #38638011
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
White Owl?В неинициализированной глобальной переменной не что угодно, а совершенно точно NULL.Заблуждаешься.Идем вот сюда http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3797.pdf и читаем до просветления...
...
Рейтинг: 0 / 0
не копируется структура
    #38638014
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
Сначала хотел отправить читать http://www.c-cpp.ru/books/inicializaciya-peremennyh но подумал лучше отправить на более авторитетный источник
...
Рейтинг: 0 / 0
29 сообщений из 29, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / не копируется структура
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]