Solved C++ struct function with return struct ...
-
MYS = MYQThread so....
-- MYQThread .h struct MyStruct { // DEFINE int Value; }; /* now I try to do these*/ MyStruct MyFunc(with parameter){some calculation with pnota bene arameter and some other local variable}; // DEFINE -- MYQThread .cpp MyStruct MyFunc() { // IMPLEMENT /* so your answer is : " in these local copy make your calculation" ... is right?*/ MyStruct localcopy; localcopy.Value=100; return localcopy; } -- in these MYQThread.cpp-- /* but my file.h and file.cpp is the same so is not possible do these ....*/ #include " MYQThread .h" void buttonClick() { MyStruct usedhere = MyFunc(); // USING }
If I understand well your reply you think mi struct function is utilize in other part of my app ... but is define in QThread.h and implement + utilized in QThread.cpp
Regards
GiorgioNote:
@mrjj perhaps your answer sounds like you'd better build a class that a struct func .... -
make sure that
MYQThread .cppMyStruct MyFunc(same params as in .h) {...}
No sure i understand
/* but my file.h and file.cpp is the same so is not possible do these*/why is file.cpp and file.h the same?
Also for the use
void buttonClick() {
MyStruct usedhere = MyFunc( ACTUAL PARAMETERS); // USING}
-
/***********MYQThread .h*****************/ struct FindACPTarghet{ cv::Point2f Square_Points[4]; bool Find_Upper_Half_Square; bool Find_Lower_Half_Square; cv::Point Get_centrale; cv::Point Get_mezzo_rect_risc; cv::Point Get_mezzo_rect_risc1; cv::Point Get_mezzo_rect_risc_pt2; cv::Point Get_mezzo_rect_risc_pt3; double X_Point; double Y_point; double Angle; bool Major_Side1; bool Major_Side2; bool Get_Upper_Half_Square; bool Get_Lower_Half_Square; //Get_Angle_Central_Point_Targhet GetDataTarghet; }/*FindCentPoint*/; class datathread : public QThread { Q_OBJECT public: explicit datathread(QObject *parent = 0, bool bthw = false); void run(); bool Stop; FindACPTarghet FindCentPoint( cv::Point2f Square_Points[4], bool Find_Upper_Half_Square, bool Find_Lower_Half_Square); /***********MYQThread .cpp*****************/ FindACPTarghet FindCentPoint( cv::Point2f Square_Points[4], bool Find_Upper_Half_Square, bool Find_Lower_Half_Square) { FindACPTarghet FindTarghet; <---------------------------------------- F_lung1 = 0; F_lung2 = 0; F_lung3 = 0; F_lung4 = 0; F_lung5 = 0; F_barix = 0; F_bariy = 0; F_intbarix = 0; F_intbariy = 0; F_bariangle = 0; bool choose0 = false, choose1 = false, choose2 = false, choose3 = false; F_lung1 = std::pow((std::pow((Square_Points[0].x - Square_Points[1].x),2) + std::pow((Square_Points[0].y - Square_Points[1].y),2)), 0.5); F_lung2 = std::pow((std::pow((Square_Points[1].x - Square_Points[2].x),2) + std::pow((Square_Points[1].y - Square_Points[2].y),2)), 0.5); if (F_lung2 > F_lung1) {.................. ........................ FindTarghet.Get_centrale = F_centrale; <--------------------------------- /*******************************undefined error reference**********************/ FindTarghet.Get_mezzo_rect_risc = F_mezzo_rect_risc; FindTarghet.Get_mezzo_rect_risc1 = F_mezzo_rect_risc1; FindTarghet.Get_mezzo_rect_risc_pt2 = F_mezzo_rect_risc_pt2; FindTarghet.Get_mezzo_rect_risc_pt3 = F_mezzo_rect_risc_pt3; FindTarghet.X_Point = F_intbarix; FindTarghet.Y_point = F_intbariy; FindTarghet.Angle = F_bariangle_template; FindTarghet.Major_Side1 = false; FindTarghet.Major_Side2 = false; FindTarghet.Get_Upper_Half_Square = false; FindTarghet.Get_Lower_Half_Square = false; return FindTarghet; } /***********MYQThread .cpp qthread::run*****************/ void datathread::run() { ... ... ... FindACPTarghet OneTarghet = FindCentPoint(rect_points, true, false); centrale = OneTarghet.Get_centrale; mezzo_rect_risc = OneTarghet.Get_mezzo_rect_risc; mezzo_rect_risc1 = OneTarghet.Get_mezzo_rect_risc1; mezzo_rect_risc_pt2 = OneTarghet.Get_mezzo_rect_risc_pt2; mezzo_rect_risc_pt3 = OneTarghet.Get_mezzo_rect_risc_pt3; intbarix = OneTarghet.X_Point; intbariy = OneTarghet.Y_point; bariangle = OneTarghet.Angle;
Not understand very well why I can't use return with struct ....
Regards
Giorgio -
But you can use struct as return. :)
FindTarghet.Get_centrale = F_centrale;
what is F_central?
I dont see you define it ?
so that would explain "undefined" -
@mrjj mmm....
/********* as global var in MYQThread .cpp*****************/ int F_intbarix = 0, F_intbariy = 0; double F_lung1 = 0, F_lung11 = 0, F_lung2 = 0, F_lung3 = 0, F_lung4 = 0, F_lung5 = 0, F_barix = 0, F_bariy = 0, F_bariangle = 0, F_bariangle_template = 0; int DeF_barix = 0, DeF_bariy = 0, DeF_bariangle = 0, DeF_bariangle_template = 0; int X_mezzo_rect_risc = 0, Y_mezzo_rect_risc = 0, X_mezzo_rect_risc1 = 0, Y_mezzo_rect_risc1 = 0; int X_mezzo_rect_risc_pt2 = 0, Y_mezzo_rect_risc_pt2 = 0, X_mezzo_rect_risc_pt3 = 0, Y_mezzo_rect_risc_pt3 = 0; int DeF_Major_Side1 = 0, DeF_Major_Side2 = 0, DeF_Get_Upper_Half_Square = 0, DeF_Get_Lower_Half_Square = 0; cv::Point F_centrale = cv::Point(0 ,0); <------------------------------------------------------- /****** and use these variable into calculation and as result too... so i put it into return struc as you see****/ cv::Point F_mezzo_rect_risc = cv::Point(0 ,0); cv::Point F_mezzo_rect_risc1 = cv::Point(0 ,0); cv::Point F_mezzo_rect_risc_pt2 = cv::Point(0 ,0);
Regards
giorgio -
@gfxx so I try to define F_centrale into struc func..
FindACPTarghet FindCentPoint( cv::Point2f Square_Points[4], bool Find_Upper_Half_Square, bool Find_Lower_Half_Square) { FindACPTarghet FindTarghet; <---------------------------------------- int F_intbarix = 0, F_intbariy = 0; double F_lung1 = 0, F_lung11 = 0, F_lung2 = 0, F_lung3 = 0, F_lung4 = 0, F_lung5 = 0, F_barix = 0, F_bariy = 0, F_bariangle = 0, F_bariangle_template = 0; int DeF_barix = 0, DeF_bariy = 0, DeF_bariangle = 0, DeF_bariangle_template = 0; int X_mezzo_rect_risc = 0, Y_mezzo_rect_risc = 0, X_mezzo_rect_risc1 = 0, Y_mezzo_rect_risc1 = 0; int X_mezzo_rect_risc_pt2 = 0, Y_mezzo_rect_risc_pt2 = 0, X_mezzo_rect_risc_pt3 = 0, Y_mezzo_rect_risc_pt3 = 0; int DeF_Major_Side1 = 0, DeF_Major_Side2 = 0, DeF_Get_Upper_Half_Square = 0, DeF_Get_Lower_Half_Square = 0; cv::Point F_centrale = cv::Point(0 ,0); cv::Point F_mezzo_rect_risc = cv::Point(0 ,0); cv::Point F_mezzo_rect_risc1 = cv::Point(0 ,0); cv::Point F_mezzo_rect_risc_pt2 = cv::Point(0 ,0); cv::Point F_mezzo_rect_risc_pt3 = cv::Point(0 ,0); cv::Point F_un_quarto_rect_risc = cv::Point(0 ,0); cv::Point F_un_quarto_rect_risc1 = cv::Point(0 ,0); cv::Point F_un_quarto_rect_risc_pt2 = cv::Point(0 ,0); cv::Point F_un_quarto_rect_risc_pt3 = cv::Point(0 ,0); bool choose0 = false, choose1 = false, choose2 = false, choose3 = false; F_lung1 = std::pow((std::pow((Square_Points[0].x - Square_Points[1].x),2) + std::pow((Square_Points[0].y - Square_Points[1].y),2)), 0.5); F_lung2 = std::pow((std::pow((Square_Points[1].x - Square_Points[2].x),2) + std::pow((Square_Points[1].y - Square_Points[2].y),2)), 0.5); if (F_lung2 > F_lung1) {..................
but result is the same...
Regards
giorgio -
@gfxx Ok the function works whithout error ... but I have 0 result value for all variables ....
Regards
giorgio -
@gfxx mmm.... these type of approach is not desirable in my case ... so at the last I solve my problem wit a specific c++ class with function that return struct result ... if someone had this same problem or wish to create a class with a return statement struct or a void with a return struct placed here the basic steps ....
/*************************FILE.h*********************************/ #ifndef FILE_H #define FILE_H #include <QThread> /**** and other magic include ****/ #include <QtCore/QVariant> ..... struct myFirstStruct{ cv::Point2f Square_Points[4]; bool Up1_2Square; bool Down1_2Square; bool returnValue1; bool returnValue2; ...... /***other member DECLARE ***/ }; class File { public: File(); myFirstStruct myVoid( cv::Point2f Square_Points[4], bool Up1_2Square, bool Down1_2Square); struct myFirstStruct MyIstance; private: }; #endif // FILE_H /*************************FILE.cpp*********************************/ #include "File.h" File::File() { } myFirstStruct File::myVoid(cv::Point2f Square_Points[4], bool Up1_2Square, bool Down1_2Square) { /***do somethings*****/ MyIstance.returnValue1 = calculatedvalue1; MyIstance.returnValue2 = calculatedvalue2; return MyIstance; } /*************************InSomeFileOfYourApp.cpp*********************************/ #include "File.h" int var1; ..... Your::mainOrSub(){ File MyClassIstance; MyClassIstance.myVoid(cv-point-value, bool-value, bool-value); yourCalculatedData1 = myVoid.MyIstance.returnValue1; yourCalculatedData2 = myVoid.MyIstance.returnValue2; ....... }
I hope These Help someone ...
Regards
Giorgio -
@gfxx Class and Struct are the same thing.
struct MyClass{ // stuff }; // is the same as: class MyClass{ public: // stuff };
see http://www.cplusplus.com/doc/tutorial/classes/ for a quick overview of how to use classes and structs
-
@VRonin yes struct and class is quite similar .... but not the same things..... I know .. some C programmers not like class and prefer struct .... When I was A good programmer I use me too only struct and no class .... but for now I'm happy class exist .... ;)
regards
Giorgio -
@gfxx C has no classes. C has only structs and they cannot contain methods, just members. C is not an object oriented language. In C++ they are the same, the only difference is the default access level (public for struct, private for class)
-
@VRonin I Know that C has no classes .. I use it sometime, but I study it only 10 year ago and not use it for long long time ...... but I also know that many good programmers using C ++ but most use C do not really like the classes especially if you can use the struct .... but unfortunately I'm not a good programmer ... so use the classes and I facilitate my work .... anyway thanks to this link so today I can learn something new. :))
anyhow I'm not a good programmer and if you would suggest me some modification to my code example, in order to make me able to use struct instead class I'm happy to receive your suggest.
Some post ago I write these snip:
/***********MYQThread .h*****************/ struct FindACPTarghet{ cv::Point2f Square_Points[4]; bool Find_Upper_Half_Square; bool Find_Lower_Half_Square; cv::Point Get_centrale; cv::Point Get_mezzo_rect_risc; cv::Point Get_mezzo_rect_risc1; cv::Point Get_mezzo_rect_risc_pt2; cv::Point Get_mezzo_rect_risc_pt3; double X_Point; double Y_point; double Angle; bool Major_Side1; bool Major_Side2; bool Get_Upper_Half_Square; bool Get_Lower_Half_Square; //Get_Angle_Central_Point_Targhet GetDataTarghet; }/*FindCentPoint*/; class datathread : public QThread { Q_OBJECT public: explicit datathread(QObject *parent = 0, bool bthw = false); void run(); bool Stop; FindACPTarghet FindCentPoint( cv::Point2f Square_Points[4], bool Find_Upper_Half_Square, bool Find_Lower_Half_Square); /***********MYQThread .cpp*****************/ FindACPTarghet FindCentPoint( cv::Point2f Square_Points[4], bool Find_Upper_Half_Square, bool Find_Lower_Half_Square) { FindACPTarghet FindTarghet; <---------------------------------------- F_lung1 = 0; F_lung2 = 0; F_lung3 = 0; F_lung4 = 0; F_lung5 = 0; F_barix = 0; F_bariy = 0; F_intbarix = 0; F_intbariy = 0; F_bariangle = 0; bool choose0 = false, choose1 = false, choose2 = false, choose3 = false; F_lung1 = std::pow((std::pow((Square_Points[0].x - Square_Points[1].x),2) + std::pow((Square_Points[0].y - Square_Points[1].y),2)), 0.5); F_lung2 = std::pow((std::pow((Square_Points[1].x - Square_Points[2].x),2) + std::pow((Square_Points[1].y - Square_Points[2].y),2)), 0.5); if (F_lung2 > F_lung1) {.................. ........................ FindTarghet.Get_centrale = F_centrale; <--------------------------------- /*******************************undefined error reference**********************/ FindTarghet.Get_mezzo_rect_risc = F_mezzo_rect_risc; FindTarghet.Get_mezzo_rect_risc1 = F_mezzo_rect_risc1; FindTarghet.Get_mezzo_rect_risc_pt2 = F_mezzo_rect_risc_pt2; FindTarghet.Get_mezzo_rect_risc_pt3 = F_mezzo_rect_risc_pt3; FindTarghet.X_Point = F_intbarix; FindTarghet.Y_point = F_intbariy; FindTarghet.Angle = F_bariangle_template; FindTarghet.Major_Side1 = false; FindTarghet.Major_Side2 = false; FindTarghet.Get_Upper_Half_Square = false; FindTarghet.Get_Lower_Half_Square = false; return FindTarghet; } /***********MYQThread .cpp qthread::run*****************/ void datathread::run() { ... ... ... FindACPTarghet OneTarghet = FindCentPoint(rect_points, true, false); centrale = OneTarghet.Get_centrale; mezzo_rect_risc = OneTarghet.Get_mezzo_rect_risc; mezzo_rect_risc1 = OneTarghet.Get_mezzo_rect_risc1; mezzo_rect_risc_pt2 = OneTarghet.Get_mezzo_rect_risc_pt2; mezzo_rect_risc_pt3 = OneTarghet.Get_mezzo_rect_risc_pt3; intbarix = OneTarghet.X_Point; intbariy = OneTarghet.Y_point; bariangle = OneTarghet.Angle;
Not work ... but compile is ok...
Thank a lot
Giorgio