Chyba ... funkce nemá 6 argumentů... – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Chyba ... funkce nemá 6 argumentů... – C / C++ – Fórum – Programujte.comChyba ... funkce nemá 6 argumentů... – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
oxidián0
Grafoman
22. 6. 2016   #1
-
0
-

Nemohu přijít na to proč dostávám tuto hlášku.

drawing:hpp

namespace drawing
{
	static void Circle( cv::Mat& img, cv::Point center, int radius, const void* color, int fill );
	void circle( cv::InputOutputArray _img, cv::Point center, int radius,
	const cv::Scalar& color, int thickness, int line_type, int shift );
}

void Drawing_Circle( CvArr* _img, CvPoint center, int radius,
			CvScalar color, int thickness, int line_type, int shift );

drawing.cpp:

#include "precomp.hpp"
#include "drawing.hpp"

namespace drawing
{
// zde vynechám nějaké funkce...

void circle( cv::InputOutputArray _img, cv::Point center, int radius,
             const cv::Scalar& color, int thickness, int line_type = cv::LINE_8, int shift = 0 )
{
    cv::Mat img = _img.getMat();

    if( line_type == CV_AA && img.depth() != CV_8U )
        line_type = 8;

    CV_Assert( radius >= 0 && thickness <= MAX_THICKNESS &&
        0 <= shift && shift <= XY_SHIFT );

    double buf[4];
	// TADY BY TO MOHLO KRACHNOUT KDYŽ JSEM TO VYNECHAL:
    // cv::scalarToRawData(color, buf, img.type(), 0);

    if( thickness > 1 || line_type >= CV_AA || shift > 0 )
    {
        center.x <<= XY_SHIFT - shift;
        center.y <<= XY_SHIFT - shift;
        radius <<= XY_SHIFT - shift;
        EllipseEx( img, center, cv::Size(radius, radius),
                   0, 0, 360, buf, thickness, line_type );
    }
    else
        Circle( img, center, radius, buf, thickness < 0 );
}
} // konec namespace drawing


main.hpp:

#include "drawing.hpp"

main.cpp

#include "main.hpp"
#include "drawing.hpp"


// ve funkci main volám:
drawing::circle( I,
        center,
        radius,
        cv::Scalar( 255, 255, 255 ), 0,  8);

a na konci to hodí chybu že funkce drawing::circle nemá 6 argumentů. Dobře má jich 7, ale 7 argument je nastaven jako nepovinný viz

int shift = 0

jak to opravit?

Nahlásit jako SPAM
IP: 78.45.87.–
Kit+15
Guru
22. 6. 2016   #2
-
+1
-
Zajímavé

#1 oxidián
Opravil bych to tak, že bych doplnil i ten sedmý argument.

BTW: Sedm parametrů funkce? To se zase někdo urval z řetězu.

Nahlásit jako SPAM
IP: 194.228.68.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
lukas.balaz0
Super člen
22. 6. 2016   #3
-
0
-

#1 oxidián
Rýchly google mi povedal, že defaultné parametre MAJÚ byť v deklarácii a NEMAJÚ byť v definícii. Netestoval som, dúfam, že netrepem ....

Nahlásit jako SPAM
IP: 80.242.41.–
oxidián0
Grafoman
22. 6. 2016   #4
-
0
-

#3 lukas.balaz
To jsem už myslím zkoušel. To však píše u funkce v headeru chybu C2572 předeklarování :  redefinition of default parameter : parameter 7

Nahlásit jako SPAM
IP: 78.45.87.–
oxidián0
Grafoman
22. 6. 2016   #5
-
0
-

#2 Kit
To je funkce která je součástí knihovny, já jsem jen převzal jejich kód, který je open source. Jsou tam takové věci jako tloušťka čáry apod.  Sedmý parametr se má doplňovat sám (je předdefinovaný).

Nahlásit jako SPAM
IP: 78.45.87.–
Kit+15
Guru
22. 6. 2016   #6
-
0
-

#5 oxidián
Mně to funguje přesně tak jak to popsal lukas.balaz 

#include <stdio.h>

void circle(int a, int b = 1);
void circle(int a, int b) {
    printf("%d %d\n", a, b);
}

int main() {
    circle(2);
    circle(3,4);
}

Výstup: 

2 1
3 4
Nahlásit jako SPAM
IP: 194.228.68.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
oxidián0
Grafoman
22. 6. 2016   #7
-
0
-

OK, zítra se na to ještě podívám. Dík.

Nahlásit jako SPAM
IP: 78.45.87.–
oxidián0
Grafoman
23. 6. 2016   #8
-
0
-

No prostě to nejede

drawing.hpp(7): error C2086: 'int line_type' : redefinition
drawing.hpp(7) : see declaration of 'line_type'
drawing.hpp(7): error C2086: 'int line_type' : redefinition
drawing.hpp(7) : see declaration of 'line_type'
drawing.hpp(7): error C2572: 'drawing::circle' : redefinition of default parameter : parameter 7
drawing.hpp(6) : see declaration of 'drawing::circle'

nechápu kde byl předtím deklarován, když poprvé má být deklarován na řádku 6-7

Ty asi OpenCV nainstalovaný nemáš, že bys mi to zkusil?

Může na to mít vliv že v namespace cv v souboru imgproc.hpp je deklarováno toto?

CV_EXPORTS_W void circle(InputOutputArray img, Point center, int radius,
                       const Scalar& color, int thickness = 1,
                       int lineType = LINE_8, int shift = 0);

Je to jiný namespace.

Nahlásit jako SPAM
IP: 78.45.87.–
oxidián0
Grafoman
23. 6. 2016   #9
-
0
-

Přeci jen nějaký pokrok:

 drawing.hpp:

#include <opencv2/highgui.hpp>

void Drawing_scalarToRawData(const cv::Scalar& s, void* _buf, int type, int unroll_to);

namespace drawing
{
	static void Circle( cv::Mat& img, cv::Point center, int radius, const void* color, int fill );

	void MyTest( int a = 0 );


	void circle( cv::InputOutputArray _img, cv::Point center, int radius,
		const cv::Scalar& color, int thickness, int line_type = cv::LINE_8, int shift = 0  );
	
}

void Drawing_Circle( CvArr* _img, CvPoint center, int radius,
			CvScalar color, int thickness, int line_type, int shift );

deklarace

void MyTest( int a = 0 );
mi hlásí tu samou chybu:

1>u:\c++\mapcorners\mapcorners\drawing.hpp(11): error C2572: 'drawing::MyTest' : redefinition of default parameter : parameter 1

(ty ostatní chyby C2572 se opakují u další funkce)


Čím to může být? using namespace cv; jsem zrušil v celém projektu + jsem otestoval že v namespacu drawing nedochází ke konfliktu s namepasem cv.

Nahlásit jako SPAM
IP: 78.45.87.–
oxidián0
Grafoman
23. 6. 2016   #10
-
0
-

Mimochodem, když do toho souboru drawing.hpp dám pouze toto:

void MyTest( int a = 0 );
void MyTest( int a ){}

error C2572: 'MyTest' : redefinition of default parameter : parameter 1
drawing.hpp(4) : see declaration of 'MyTest'
drawing.hpp(5): error C2084: function 'void MyTest(int)' already has a body
drawing.hpp(4) : see previous definition of 'MyTest'

a když funkci přejmenuju tak to samé

Edit:

Vyřešeno:

#ifndef DRAWING_N_H
#define DRAWING_N_H

void MyTest1189437( int a = 0 );
void MyTest1189437( int a ){}

#endif

Funguje!

Nahlásit jako SPAM
IP: 78.45.87.–
KIIV
~ Moderátor
+43
God of flame
23. 6. 2016   #11
-
0
-

Jo takze ty mas main.hpp, kde includujes drawing.hpp a pak main.cpp, kde includujes  main.hpp a drawing.hpp, kdy drawing nemelo zadnou ochranu proti znovuvlozeni. Co by se tady jen mohlo posrat :D

Proc tam vubec mas main.hpp, kdyz ten header v nem pak vkladas stejne primo v main.cpp?

Nahlásit jako SPAM
IP: 94.113.93.–
Program vždy dělá to co naprogramujete, ne to co chcete...
oxidián0
Grafoman
23. 6. 2016   #12
-
0
-

Já to pak opravil, ale aspoň jsem se použil že to s defaultním parametrem nemusí mít přímou souvislost.

Nahlásit jako SPAM
IP: 78.45.87.–
Staon0
Návštěvník
15. 9. 2016   #13
-
0
-

#1 oxidián
Je to přesně tak, jak píše lukas.balaz. Implicitní hodnotu argumentu musíte mít v drawing.hpp. Překladač implicitní hodnoty používá v místě, kde se funkce volá. Technicky ji předá do volané funkce stejně, jako kdybyste ji tam ručně napsal. Proto je potřeba, aby ji překladač znal v místě volání, tzn. ve vašem případě v main.cpp. Tam ale vidí pouze drawing.hpp, kde implicitní hodnota uvedená není. Proto hlásí, že funkci se šesti parametry nezná.

Zároveň ovšem implicitní argument nesmí být uvedený v drawing.cpp! Při překladu drawing.cpp by tak viděl dvě implicitní hodnoty (sice v tomto případě stejné, ale tím se nezabývá) a nevěděl by, kterou si vybrat. To jsou ty redefinice, které vám překladač hlásí.

Guideline: implicitní hodnoty argumentů uvádět vždy v headeru.

Nahlásit jako SPAM
IP: 94.112.135.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 60 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý