Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
Prog2
/
labor_peldak
/
lab_07.5
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
becdcbee
authored
Apr 05, 2021
by
Szeberényi Imre
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Extra szűrések:
- explicit destruktorhívás - poligon megvalósítás check - clone check
parent
224aa662
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
109 additions
and
20 deletions
+109
-20
Alakzatlab3/alakzat.cbp
+1
-0
Alakzatlab3/alakzat.cpp
+2
-0
Alakzatlab3/alakzat.h
+43
-3
Alakzatlab3/alakzat3_main.cpp
+33
-4
Alakzatlab3/gtest_lite.h
+12
-1
Alakzatlab3/memtrace.cpp
+16
-10
Alakzatlab3/memtrace.h
+2
-2
No files found.
Alakzatlab3/alakzat.cbp
View file @
becdcbee
...
@@ -38,6 +38,7 @@
...
@@ -38,6 +38,7 @@
<Unit
filename=
"alakzat.h"
/>
<Unit
filename=
"alakzat.h"
/>
<Unit
filename=
"alakzat3_main.cpp"
/>
<Unit
filename=
"alakzat3_main.cpp"
/>
<Unit
filename=
"gen_array2.hpp"
/>
<Unit
filename=
"gen_array2.hpp"
/>
<Unit
filename=
"gtest_lite.h"
/>
<Unit
filename=
"kor.cpp"
/>
<Unit
filename=
"kor.cpp"
/>
<Unit
filename=
"kor.h"
/>
<Unit
filename=
"kor.h"
/>
<Unit
filename=
"memtrace.cpp"
/>
<Unit
filename=
"memtrace.cpp"
/>
...
...
Alakzatlab3/alakzat.cpp
View file @
becdcbee
...
@@ -19,3 +19,5 @@ void Alakzat::mozgat(const Pont& d) {
...
@@ -19,3 +19,5 @@ void Alakzat::mozgat(const Pont& d) {
std
::
ostream
&
operator
<<
(
std
::
ostream
&
os
,
const
Alakzat
&
a
)
{
std
::
ostream
&
operator
<<
(
std
::
ostream
&
os
,
const
Alakzat
&
a
)
{
return
os
<<
"p0="
<<
a
.
getp0
()
<<
",szin="
<<
a
.
getsz
();
return
os
<<
"p0="
<<
a
.
getp0
()
<<
",szin="
<<
a
.
getsz
();
}
}
const
char
*
Alakzat
::
juj
=
"
\n\n
*** Juj, ez hogy tortenhetett? Explicit destruktor hivas? ***
\n\n
"
;
Alakzatlab3/alakzat.h
View file @
becdcbee
/**
/**
* \file alakzat.h
* \file alakzat.h
* Alakzat alaposztály deklarációja
* Alakzat alaposztály deklarációja
*
* *** Extra teszt az explicit destruktorhívás megcsípéséhez. ***
* *** Tilos a destruktort explicit meghívni, főleg saját tagfüggvényből! ***
*
*/
*/
#ifndef ALAKZAT_H
#ifndef ALAKZAT_H
#define ALAKZAT_H
#define ALAKZAT_H
#include <iostream> // ostream miatt kell
#include <iostream> // ostream miatt kell
#include "memtrace.h"
#include "memtrace.h"
// nagy valószínűséggel minden használt headert behúz
#include "pont.h"
#include "pont.h"
#include "szin.h"
#include "szin.h"
...
@@ -15,11 +19,39 @@ class Alakzat {
...
@@ -15,11 +19,39 @@ class Alakzat {
Pont
p0
;
/// Alakzat origója, vagy bázis pontja.
Pont
p0
;
/// Alakzat origója, vagy bázis pontja.
/// Minden további adatot ehhez relatívan tárolunk. Geometriai értelemben nem feltétlenül origó.
/// Minden további adatot ehhez relatívan tárolunk. Geometriai értelemben nem feltétlenül origó.
Szin
sz
;
/// alakzat színe
Szin
sz
;
/// alakzat színe
char
*
dummy
;
/// Explicit destrutorhívás teszteléséhez
static
const
char
*
juj
;
/// Nagyon fájdalmas üzenet
public:
public:
/// Konstruktor
/// Konstruktor
/// @param p0 - kezdőpont
/// @param p0 - kezdőpont
/// @param sz - szín és átlátszóság
/// @param sz - szín és átlátszóság
Alakzat
(
const
Pont
&
p0
,
const
Szin
&
sz
)
:
p0
(
p0
),
sz
(
sz
)
{}
Alakzat
(
const
Pont
&
p0
,
const
Szin
&
sz
)
:
p0
(
p0
),
sz
(
sz
),
dummy
(
new
char
[
100
])
{}
/// Másoló konstruktor,
/// mert van dinamikus adattag, amit kezel
Alakzat
(
const
Alakzat
&
rhs
)
{
dummy
=
NULL
;
*
this
=
rhs
;
}
/// Értékadó operator,
/// mert van dinamikus adattag, amit kezel
Alakzat
&
operator
=
(
const
Alakzat
&
rhs
)
{
if
(
this
!=
&
rhs
)
{
#ifdef MEMTRACE
/// Explicit destrutorhívást próbálja felderíteni.
/// Elhangzott előadáson, hogy tilos, de mégis van aki megpróbálja.
if
(
!
memtrace
::
poi_check
(
dummy
))
std
::
cerr
<<
juj
;
#endif
delete
[]
dummy
;
dummy
=
new
char
[
100
];
p0
=
rhs
.
p0
;
sz
=
rhs
.
sz
;
}
return
*
this
;
}
/// Pozíció lekérdezése
/// Pozíció lekérdezése
/// @return alakzat origója
/// @return alakzat origója
...
@@ -38,7 +70,15 @@ public:
...
@@ -38,7 +70,15 @@ public:
/// Destruktor virtuális, hogy lehessen dinamikus adattagja
/// Destruktor virtuális, hogy lehessen dinamikus adattagja
/// a származtatottnak
/// a származtatottnak
virtual
~
Alakzat
()
{}
virtual
~
Alakzat
()
{
#ifdef MEMTRACE
/// Explicit destrutorhívást próbálja felderíteni.
/// Elhangzott előadáson, hogy tilos, de mégis van aki megpróbálja.
if
(
!
memtrace
::
poi_check
(
dummy
))
std
::
cerr
<<
juj
;
#endif
delete
[]
dummy
;
}
};
};
/// Globális << operátor az Alakzat adatainak kiírásához
/// Globális << operátor az Alakzat adatainak kiírásához
...
...
Alakzatlab3/alakzat3_main.cpp
View file @
becdcbee
...
@@ -4,7 +4,7 @@
...
@@ -4,7 +4,7 @@
* Bővítjük poligonnal, majd sablont is használunk.
* Bővítjük poligonnal, majd sablont is használunk.
*
*
* ELKESZULT makró értékei:
* ELKESZULT makró értékei:
*
=
= 1 - Van Poligon osztály, amit önmagában kipróbálunk, copy és assign még nincs használva.
*
>
= 1 - Van Poligon osztály, amit önmagában kipróbálunk, copy és assign még nincs használva.
* >= 2 - Poligon assign is tesztelve van.
* >= 2 - Poligon assign is tesztelve van.
* >= 3 - Poligon assing és copy is tesztelve van
* >= 3 - Poligon assing és copy is tesztelve van
* == 4 - Átemelésre került az előző heti Rajztabla osztály a projektbe, poligon nélküli teszt
* == 4 - Átemelésre került az előző heti Rajztabla osztály a projektbe, poligon nélküli teszt
...
@@ -33,11 +33,13 @@
...
@@ -33,11 +33,13 @@
using
std
::
cout
;
using
std
::
cout
;
using
std
::
endl
;
using
std
::
endl
;
CREATE_Has_fn_
(
clone
,
const
)
/// clone teszteléséhez kell
int
main
(
int
argc
,
char
**
argv
)
{
int
main
(
int
argc
,
char
**
argv
)
{
GTINIT
(
std
::
cin
);
// Csak C(J)PORTA működéséhez kell
GTINIT
(
std
::
cin
);
// Csak C(J)PORTA működéséhez kell
#if ELKESZULT
=
= 1
#if ELKESZULT
>
= 1
TEST
(
Poligon
,
siz
e
)
{
TEST
(
Poligon
,
bas
e
)
{
Poligon
poli1
(
Pont
(
120
,
140
),
GREEN
);
Poligon
poli1
(
Pont
(
120
,
140
),
GREEN
);
EXPECT_EQ
(
1u
,
poli1
.
size
())
<<
"*** Nem jo a kezdo merete ***"
<<
endl
;
EXPECT_EQ
(
1u
,
poli1
.
size
())
<<
"*** Nem jo a kezdo merete ***"
<<
endl
;
poli1
.
add
(
Pont
(
120
,
200
));
poli1
.
add
(
Pont
(
120
,
200
));
...
@@ -49,6 +51,9 @@ int main(int argc, char** argv) {
...
@@ -49,6 +51,9 @@ int main(int argc, char** argv) {
EXPECT_EQ
(
Pont
(
120
,
140
),
poli1
[
0
]);
EXPECT_EQ
(
Pont
(
120
,
140
),
poli1
[
0
]);
EXPECT_EQ
(
Pont
(
120
,
200
),
poli1
[
1
]);
EXPECT_EQ
(
Pont
(
120
,
200
),
poli1
[
1
]);
EXPECT_EQ
(
Pont
(
250
,
200
),
poli1
[
2
]);
EXPECT_EQ
(
Pont
(
250
,
200
),
poli1
[
2
]);
Alakzat
*
p
=
&
poli1
;
p
->
mozgat
(
Pont
(
10
,
10
));
EXPECT_EQ
(
Pont
(
130
,
150
),
poli1
[
0
])
<<
"*** Biztos, hogy jol tarolja a poligon pontjait? ***
\n
"
;
}
ENDM
}
ENDM
#endif // ELKESZULT
#endif // ELKESZULT
...
@@ -137,6 +142,8 @@ int main(int argc, char** argv) {
...
@@ -137,6 +142,8 @@ int main(int argc, char** argv) {
#if ELKESZULT >= 6
#if ELKESZULT >= 6
TEST
(
Szakasz
,
clone
)
{
TEST
(
Szakasz
,
clone
)
{
if
(
!
_Has_fn_clone_const
<
Szakasz
*
,
Szakasz
>::
fn
)
FAIL
()
<<
"*** Nem konstans clone, vagy nem Szakasz* ***
\n
"
;
Szakasz
*
psz1
=
new
Szakasz
(
Pont
(
20
,
40
),
100
,
0
,
WHITE
);
Szakasz
*
psz1
=
new
Szakasz
(
Pont
(
20
,
40
),
100
,
0
,
WHITE
);
cout
<<
*
psz1
<<
endl
;
cout
<<
*
psz1
<<
endl
;
Szakasz
*
psz2
=
psz1
->
clone
();
Szakasz
*
psz2
=
psz1
->
clone
();
...
@@ -147,6 +154,11 @@ int main(int argc, char** argv) {
...
@@ -147,6 +154,11 @@ int main(int argc, char** argv) {
delete
psz1
;
delete
psz1
;
EXPECT_EQ
(
Pont
(
120
,
40
),
psz2
->
getpv
());
EXPECT_EQ
(
Pont
(
120
,
40
),
psz2
->
getpv
());
delete
psz2
;
delete
psz2
;
/// clone alapból
Alakzat
*
ap1
=
new
Szakasz
(
Pont
(
20
,
40
),
Pont
(
100
,
100
),
GREEN
);
Alakzat
*
ap2
=
ap1
->
clone
();
delete
ap1
;
delete
ap2
;
}
ENDM
}
ENDM
#endif // ELKESZULT
#endif // ELKESZULT
...
@@ -170,6 +182,24 @@ int main(int argc, char** argv) {
...
@@ -170,6 +182,24 @@ int main(int argc, char** argv) {
tabla
.
rajzol
();
tabla
.
rajzol
();
EXPECT_EQ
(
1u
,
tabla
.
size
());
EXPECT_EQ
(
1u
,
tabla
.
size
());
}
ENDM
}
ENDM
TEST
(
Rajztabla
,
copy
)
{
Rajztabla
tabla
;
tabla
.
felrak
(
new
Szakasz
(
Pont
(
20
,
40
),
100
,
0
,
WHITE
));
cout
<<
"tabla rajzol::
\n
"
;
tabla
.
rajzol
();
EXPECT_EQ
(
1u
,
tabla
.
size
());
{
// uj blokk, ebben jön létre az új tabla
Rajztabla
ujtabla
=
tabla
;
ujtabla
.
felrak
(
new
Szakasz
(
Pont
(
40
,
40
),
100
,
0
,
WHITE
));
cout
<<
"
\n
ujtabla rajzol:
\n
"
;
ujtabla
.
rajzol
();
EXPECT_EQ
(
2u
,
ujtabla
.
size
());
}
cout
<<
"
\n
tabla rajzol:
\n
"
;
tabla
.
rajzol
();
EXPECT_EQ
(
1u
,
tabla
.
size
());
}
ENDM
#endif // ELKESZULT
#endif // ELKESZULT
#if ELKESZULT >= 8
#if ELKESZULT >= 8
...
@@ -198,7 +228,6 @@ int main(int argc, char** argv) {
...
@@ -198,7 +228,6 @@ int main(int argc, char** argv) {
}
ENDM
}
ENDM
#endif // ELKESZULT
#endif // ELKESZULT
/// Itt a vége
/// Itt a vége
if
(
ELKESZULT
<
5
&&
!
gtest_lite
::
test
.
fail
())
if
(
ELKESZULT
<
5
&&
!
gtest_lite
::
test
.
fail
())
ADD_FAILURE
()
<<
"
\n
Legalabb ELEKSZULT == 5-ig oldja meg a feladatokat!
\n
"
;
ADD_FAILURE
()
<<
"
\n
Legalabb ELEKSZULT == 5-ig oldja meg a feladatokat!
\n
"
;
...
...
Alakzatlab3/gtest_lite.h
View file @
becdcbee
...
@@ -10,6 +10,7 @@
...
@@ -10,6 +10,7 @@
* Sz.I. 2019 singleton
* Sz.I. 2019 singleton
* Sz.I. 2021 ASSERT.., STRCASE...
* Sz.I. 2021 ASSERT.., STRCASE...
* Sz.I. 2021 EXPEXT_REGEXP
* Sz.I. 2021 EXPEXT_REGEXP
* Sz.I. 2021 CREATE_Has_fn_
*
*
* A tesztelés legalapvetőbb funkcióit támogató függvények és makrók.
* A tesztelés legalapvetőbb funkcióit támogató függvények és makrók.
* Nem szálbiztos megvalósítás.
* Nem szálbiztos megvalósítás.
...
@@ -187,7 +188,7 @@
...
@@ -187,7 +188,7 @@
/// https://cpptalk.wordpress.com/2009/09/12/substitution-failure-is-not-an-error-2
/// https://cpptalk.wordpress.com/2009/09/12/substitution-failure-is-not-an-error-2
/// Használat:
/// Használat:
/// CREATE_Has_(size)
/// CREATE_Has_(size)
/// ... if (Has_size<std::string>::member)...
/// ... if (
_
Has_size<std::string>::member)...
#define CREATE_Has_(X) \
#define CREATE_Has_(X) \
template<typename T> struct _Has_##X { \
template<typename T> struct _Has_##X { \
struct Fallback { int X; }; \
struct Fallback { int X; }; \
...
@@ -198,6 +199,14 @@ template<typename T> struct _Has_##X { \
...
@@ -198,6 +199,14 @@ template<typename T> struct _Has_##X { \
static bool const member = sizeof(f<Derived>(0)) == 2; \
static bool const member = sizeof(f<Derived>(0)) == 2; \
};
};
#define CREATE_Has_fn_(X, S) \
template<typename R, typename T> struct _Has_fn_##X##_##S { \
template<typename C, R (C::*f)() S> struct ChT; \
template<typename D> static char (&f(ChT<D, &D::X>*))[1]; \
template<typename D> static char (&f(...))[2]; \
static bool const fn = sizeof(f<T>(0)) == 1; \
};
/// Segédfüggvény egy publikus adattag, vagy tagfüggvény létezésének tesztelésére
/// Segédfüggvény egy publikus adattag, vagy tagfüggvény létezésének tesztelésére
/// fordítási időben
/// fordítási időben
inline
void
hasMember
(...)
{}
inline
void
hasMember
(...)
{}
...
@@ -273,6 +282,8 @@ public:
...
@@ -273,6 +282,8 @@ public:
#endif
#endif
#ifndef CPORTA
#ifndef CPORTA
std
::
cerr
<<
"
\n
---> "
<<
name
<<
std
::
endl
;
std
::
cerr
<<
"
\n
---> "
<<
name
<<
std
::
endl
;
#else
std
::
cout
<<
"
\n
---> "
<<
name
<<
std
::
endl
;
#endif // CPORTA
#endif // CPORTA
++
sum
;
++
sum
;
}
}
...
...
Alakzatlab3/memtrace.cpp
View file @
becdcbee
...
@@ -5,8 +5,9 @@ Keszitette: Peregi Tamas, BME IIT, 2011
...
@@ -5,8 +5,9 @@ Keszitette: Peregi Tamas, BME IIT, 2011
Kanari: Szeberenyi Imre, 2013.
Kanari: Szeberenyi Imre, 2013.
VS 2012: Szeberényi Imre, 2015.,
VS 2012: Szeberényi Imre, 2015.,
mem_dump: 2016.
mem_dump: 2016.
meset felszabaditaskor: 2018.
me
m
set felszabaditaskor: 2018.
typo: 2019.
typo: 2019.
poi_check: 2021.
*********************************/
*********************************/
/*definialni kell, ha nem paracssorbol allitjuk be (-DMEMTRACE) */
/*definialni kell, ha nem paracssorbol allitjuk be (-DMEMTRACE) */
...
@@ -178,7 +179,6 @@ START_NAMESPACE
...
@@ -178,7 +179,6 @@ START_NAMESPACE
dying
=
TRUE
;
dying
=
TRUE
;
exit
(
120
);
exit
(
120
);
}
}
static
void
initialize
();
static
void
initialize
();
END_NAMESPACE
END_NAMESPACE
...
@@ -188,6 +188,7 @@ END_NAMESPACE
...
@@ -188,6 +188,7 @@ END_NAMESPACE
#ifdef MEMTRACE_TO_MEMORY
#ifdef MEMTRACE_TO_MEMORY
START_NAMESPACE
START_NAMESPACE
typedef
struct
_registry_item
{
typedef
struct
_registry_item
{
void
*
p
;
/* mem pointer*/
void
*
p
;
/* mem pointer*/
size_t
size
;
/* size*/
size_t
size
;
/* size*/
...
@@ -197,6 +198,12 @@ START_NAMESPACE
...
@@ -197,6 +198,12 @@ START_NAMESPACE
static
registry_item
registry
;
/*sentinel*/
static
registry_item
registry
;
/*sentinel*/
static
registry_item
*
find_registry_item
(
void
*
p
)
{
registry_item
*
n
=
&
registry
;
for
(;
n
->
next
&&
n
->
next
->
p
!=
p
;
n
=
n
->
next
);
return
n
;
}
static
void
print_registry_item
(
registry_item
*
p
)
{
static
void
print_registry_item
(
registry_item
*
p
)
{
if
(
p
)
{
if
(
p
)
{
print_registry_item
(
p
->
next
);
print_registry_item
(
p
->
next
);
...
@@ -225,6 +232,13 @@ START_NAMESPACE
...
@@ -225,6 +232,13 @@ START_NAMESPACE
}
}
return
0
;
return
0
;
}
}
/* Ellenorzi, hogy a pointer regisztralt-e. Ha nem, akkor 0-val tér vissza */
int
poi_check
(
void
*
pu
)
{
if
(
pu
==
NULL
)
return
1
;
initialize
();
return
find_registry_item
(
P
(
pu
))
->
next
!=
NULL
;
}
END_NAMESPACE
END_NAMESPACE
#endif
/*MEMTRACE_TO_MEMORY*/
#endif
/*MEMTRACE_TO_MEMORY*/
...
@@ -271,14 +285,6 @@ START_NAMESPACE
...
@@ -271,14 +285,6 @@ START_NAMESPACE
return
TRUE
;
return
TRUE
;
}
}
#ifdef MEMTRACE_TO_MEMORY
static
registry_item
*
find_registry_item
(
void
*
p
)
{
registry_item
*
n
=
&
registry
;
for
(;
n
->
next
&&
n
->
next
->
p
!=
p
;
n
=
n
->
next
);
return
n
;
}
#endif
static
void
unregister_memory
(
void
*
p
,
call_t
call
)
{
static
void
unregister_memory
(
void
*
p
,
call_t
call
)
{
initialize
();
initialize
();
#ifdef MEMTRACE_TO_FILE
#ifdef MEMTRACE_TO_FILE
...
...
Alakzatlab3/memtrace.h
View file @
becdcbee
...
@@ -101,7 +101,8 @@ END_NAMESPACE
...
@@ -101,7 +101,8 @@ END_NAMESPACE
#if defined(MEMTRACE_TO_MEMORY)
#if defined(MEMTRACE_TO_MEMORY)
START_NAMESPACE
START_NAMESPACE
int
mem_check
(
void
);
int
mem_check
(
void
);
int
poi_check
(
void
*
);
END_NAMESPACE
END_NAMESPACE
#endif
#endif
...
@@ -191,7 +192,6 @@ START_NAMESPACE
...
@@ -191,7 +192,6 @@ START_NAMESPACE
void
mem_dump
(
void
const
*
mem
,
size_t
size
,
FILE
*
fp
=
stdout
);
void
mem_dump
(
void
const
*
mem
,
size_t
size
,
FILE
*
fp
=
stdout
);
END_NAMESPACE
END_NAMESPACE
#endif
/*MEMTRACE_C*/
#endif
/*MEMTRACE_C*/
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment