Volání funkcí - problém s výpisem čísel – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Volání funkcí - problém s výpisem čísel – C / C++ – Fórum – Programujte.comVolání funkcí - problém s výpisem čísel – C / C++ – Fórum – Programujte.com

 

Honza
~ Anonymní uživatel
450 příspěvků
20. 8. 2012   #1
-
0
-

Ahoj,

v kódu níže jsem se snažil o jednoduchý výpočet, horní funkce by mi měla vrátit 4 čísla, které se snažím  vypsat, ale výsledek dává divná čísla. Jsem fakt amatér, můžete mi někdo poradit? Díky.

Čísla mi to dává tyto:

out is 1.794074e-307, 3.362959e+230, -1.#QNAN0e+000, 3.395193e-313

double *xvec(double a [], double b []){
	int lena = sizeof(a)/sizeof(a[0]);
	int lenb = sizeof(b)/sizeof(b[0]);
	double out [lena];
	int i = 0;
	if(lena != lenb)
	{
	  cout << "Error: Negative Number entered\n";
	}

	while (i<lena)
		{
			out[i] = a[i]*b[i];
			i++;
		}

	return (out);
}


int main(void){

	int const size = 4;
	double a [size]={1,3,1,2};
	double b [size]={1,2,1,2};

	//int out [sizeof(a)/sizeof(a[0])];
	double *out = new double[size];;

	out = xvec(a, b);

	printf("out is %e, %e, %e, %e",out[0], out[1], out[2], out[3]);

	return 0;

}
Nahlásit jako SPAM
IP: 2001:67c:2594:110a:953b:3...–
vitamin+8
Grafoman
20. 8. 2012   #2
-
0
-

Nasledujuce funkcie su priblyzne rovnake:

void fnc(double *d){
	cout << sizeof(d);	//vrati velkost pointra
}
//a:
void fnc(double d[]){
	cout << sizeof(d);	//tiez vrati velkost pointra
}

Takze si pole indexoval zle.  //vytvoril si ho male, ale kedze sa vytvaralo na lokalnom stacku tak si nazasahoval do slej pamete a program nespadol

Dalsi problem je tu:

double *fnc(){
	double out [4];
	

	return out;	//vracias pointer ktory ukazuje na lokalnu premennu
}

Funkcia vrati pointer ktory ukazuje na lokalnu premennu, ale najprv tie premenne zmaze...

gcc mi vypise aj warning:

test.cpp:24:9: warning: address of local variable ‘d’ returned [enabled by default]

Ty si alokoval pamet v nadradenej funkcii a ulozil ju do pomocnej premennej, potom si zavolal funkciu ktora vratila pointer ktori ukazoval do chybnej pamete a zapisal si ho do tej pomocnej premennej ktora ukazovala na dynamicky alokovanu pamet, cize mas ako bonus memory leak :)

Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
vitamin+8
Grafoman
20. 8. 2012   #3
-
0
-

Na taketo vypocty je v c++ zaujimava kniznica: <valarray>

Program moze byt potom napisany nasledovne:

#include <valarray>
#include <iostream>
using namespace std;

int main(void){

	valarray<double> a = {1, 3, 1, 2};
	valarray<double> b = {1, 3, 1, 2};
	valarray<double> out;
	
	//out = a * b;
	out = a;
	out *= b;
	
	for(auto i : out)cout << i << ", ";
	cout << endl;
}
Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Honza
~ Anonymní uživatel
450 příspěvků
21. 8. 2012   #4
-
0
-

#3 vitamin

Díky moc, ta knihovna se určitě bude hodit. Každopádně práci s pamětí si budu muset nastudovat. Zatím jsem pracoval jen s MATLABem a tam jsem vlastně nic řešit nemusel. 

čau,

Honza

Nahlásit jako SPAM
IP: 2001:67c:2594:110a:bcde:4...–
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, 28 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ý