Rekurzivní algoritmus pro determinant matic – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Rekurzivní algoritmus pro determinant matic – C / C++ – Fórum – Programujte.comRekurzivní algoritmus pro determinant matic – C / C++ – Fórum – Programujte.com

 

Jirka
~ Anonymní uživatel
305 příspěvků
17. 8. 2011   #1
-
0
-

Zdravím, mám za úkol udělat funkci na výpočet determinant, funkce se pak použije v programu, sem s programováním ale totální začátečník a proto bych byl vděčný za každou pomoc, kdyby někdo mohl říct co je špatně.. Háže to chybu: fatal error LNK1120: 1 unresolved externals.

 

float **determinant(float **MAT_A)
{
int i, k, l, h;
	int det;
	int SUB[n][n] = {0};
if (RAD_A< 1) return 0;				// Není matice
if (RAD_A == 1) return MAT_A[0][0];		// Matice 1x1
if (RAD_A == 2)					// Matice 2x2
	det = MAT_A[0][0] * MAT_A[1][1] - MAT_A[1][0] * MAT_A[0][1];	
for (int i = 0; i < RAD_A; i++)			// Rozklad podle prvního řádku
		{
for (int k = 0; k < RAD_A - 1; k++)		// Vytvoření submatice
	for (int l = 0; k < RAD_A - 1; l++)
		SUB[k-1][h] = MAT_A[k][l];
		h++;

	det += pow(-1.0, i) * MAT_A[0][i] * determinant(SUB, RAD_A-1);
        return d;
}

Díky za každou pomoc

Nahlásit jako SPAM
IP: 88.102.116.–
KIIV
~ Moderátor
+43
God of flame
17. 8. 2011   #2
-
0
-

co je to  "n" ?

int SUB[n][n] = {0};

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Jirka
~ Anonymní uživatel
305 příspěvků
17. 8. 2011   #3
-
0
-

n je počet sloupců a řádků, de facto řád matice

Nahlásit jako SPAM
IP: 88.102.116.–
KIIV
~ Moderátor
+43
God of flame
17. 8. 2011   #4
-
0
-

a kde to definujes? (totiz lepsi bude celej kod nez jen nicnerikajici kus kde nektere promenne nejsou definovany v nem)

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Jirka
~ Anonymní uživatel
305 příspěvků
17. 8. 2011   #5
-
0
-

Tenhle kód bude jen header programu, definovaný to bude asi v samotným programu kde se bude zadávat jakej řád ta matice bude mít

Nahlásit jako SPAM
IP: 88.102.116.–
KIIV
~ Moderátor
+43
God of flame
17. 8. 2011   #6
-
0
-

coze?

header si predstavuju jako    "float **determinant(float **MAT_A);" nic vic

kazdopadne chybova hlaska znamena neco ve stylu "pouziva se promenna/funkce, ktera ma byt nekde definovana ale neni (treba extern int A; musi mit nekde jednu definici  int A; jinak to proste nenajde kde ta promenna je)"

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Jirka
~ Anonymní uživatel
305 příspěvků
17. 8. 2011   #7
-
0
-

Jak sem řekl, v C++ se téměř neorientuju, ale musím v tom stvořit ten program, takže se asi budu v hodně věcech plést.. Já si pod headerem představuju soubor .h ve kterým budou uložený všechny funkce. A pak ji pomocí #include zahrnu do programu a budu už jen volat funkce.. Aha.. Takže bych měl zkusit nějak spatlat dohromady program, kde bych zahrnul všechny proměnný a ten error by mi to nemělo hodit? Fakt se omlouvám za neznalost..

Nahlásit jako SPAM
IP: 88.102.116.–
KIIV
~ Moderátor
+43
God of flame
17. 8. 2011   #8
-
0
-

#7 Jirka
chce to spis nastudovat trochu principy .. treba prave hlavicek a zdrojaku...

zdrojaky se muzou kompilovat oddelene do *.o, hlavickovy soubory maji zaukol "popsat" co v nich je, ale jen pro ucely volani - ne to znova definovat komplet (proste aby kompilator vedel, ze existuje funkce A ktera ocekava parametry X Y Z a vraci neco

proste:

knihovna.h

zkompilujes:  knihovna.c -> knihovna.o

zkompilujes:  program.c -> program.o  (includuje jen knihovna.h)

a nakonec slinkujes   knihovna.o + program.o  do binarky

linker pak akorat hlasi, pokud mas nekde deklaraci neceho, ale nikde nedefinujes co to ma delat

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Jirka
~ Anonymní uživatel
305 příspěvků
17. 8. 2011   #9
-
0
-

#8 KIIV
Jo, tohle sem studoval jen okrajově, navíc už nemám moc času, mám tak maximálně měsíc abych vytvořil program, takže se maximálně modlím, abych to stihnul a zkouším to nějak stvořit i bez větších znalostí.. Náhodou nevíš, jestli by se tady našel někdo, kdo by byl ochotnej s tím třeba pomoct, nechci aby to za mě někdo napsal, ale spíš jen poukazovat na chyby a proč tam jsou a jak to eventuelně opravit.. Neříkám, že bych chtěl pomoc zadarmo..

Nahlásit jako SPAM
IP: 88.102.116.–
KIIV
~ Moderátor
+43
God of flame
17. 8. 2011   #10
-
0
-

#9 Jirka
to bude stacit hazet sem.. se nekdo najde... akorat necekej ze to za tebe nekdo bude chtit delat

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Jirka
~ Anonymní uživatel
305 příspěvků
17. 8. 2011   #11
-
0
-

No dobře, zkusím to.. Tak pro začátek, zkouším jestli ta funkce vůbec funguje, takže si nechám vytvořit náhodnou matici 5x5 a pak zavolat tu funkci, problém je, že to hází ten stejnej fatal error (fatal error LNK1120: 1 unresolved externals) a to konkrétně u části  

det += pow(-1.0, w) * MAT_A[0][w] * DET(SUB); 

mám podtržený to DET.. a DET je ta funkce kterou mám definovanou takhle  

int **DET(int MAT_A[5][5]);
Nahlásit jako SPAM
IP: 88.102.116.–
KIIV
~ Moderátor
+43
God of flame
17. 8. 2011   #12
-
0
-

#11 Jirka
nedava mi moc smysl proc nasobit det pointerem na pointer na int co vraci DET

to co oznacujes jako definici je jen deklarace - chtelo by to i tu definici (tj. co to vlastne ma delat? proste kod funkce DET)

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
KIIV
~ Moderátor
+43
God of flame
17. 8. 2011   #13
-
0
-

mimochodem misto  pow(-1.0, w) bys klidne mohl dat neco jako   (w & 1 ? -1 : 1)  a vyhnul by ses pow() nad realnejma cislama (melo by to byt prinejmensim rychlejsi)

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Jirka
~ Anonymní uživatel
305 příspěvků
17. 8. 2011   #14
-
0
-

   

int **DET(int MAT_A[5][5]);
{
	int w, x, y, z;
	int det;
	int RAD_A = 5;
	int SUB[5][5] = {0};	
for (int w = 0; w < RAD_A; w++)										// Rozklad podle prvního řádku
		{
for (int x = 0; x < RAD_A - 1; x++)									// Vytvoření submatice
	for (int y = 0; x < RAD_A - 1; y++)
		SUB[x-1][z] = MAT_A[x][y];
		z++;

	det += pow(-1.0, w) * MAT_A[0][w] * DET(SUB); 
		}
}

Tohle je celý kód funkce.. Má to počítat determinant matice rekurzivně, funkce vytvoří submatici a zní rekurzivně počítá ten determinant a ten řádek co sem postoval slouží k uložení výsledku.. pow(-1.0, w) slouží pro určení znaménka, druhej činitel je ten prvek podle kterýho je submatice vytvořená a třetí je ten determinant submatice..

Nahlásit jako SPAM
IP: 88.102.116.–
KIIV
~ Moderátor
+43
God of flame
17. 8. 2011   #15
-
0
-

#14 Jirka
no minimalne nepouzivas return - bude se vracet nejaky smeti co je zrovna na miste v pameti, kde by to melo byt..

pow(-1,w) sem samozrejme pochopil - proto sem navrhoval zjistit jestli je ve w nastaven 0. bit - predstavujici 1 a podle toho vratit -1 nebo 1 ( liche w pro -1 a sude pro 1)

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Jirka
~ Anonymní uživatel
305 příspěvků
17. 8. 2011   #16
-
0
-

#15 KIIV
Ještě to není dodělaný, na konci pak chci hodit výstup abych zkontroloval jestli to vůbec funguje.. Ten tvůj způsob moc nechápu, ale to je spíš tím, že Cko chápu jen okrajově.. Ale budu tam používat i komplexní čísla, takže jestli to přes pow nepůjde tak mi asi ani nic nezbyde.. No, jednodušší, nevím, půjde o matic 2x2 - 5x5 a pro 5x5 by ten kód asi moc jednoduchej nebyl ne? Jo ještě jeden dotaz, dá se z programu .exe vytáhnout zdroják?

Nahlásit jako SPAM
IP: 88.102.116.–
KIIV
~ Moderátor
+43
God of flame
17. 8. 2011   #17
-
0
-

#16 Jirka
zalezi jak je zkompilovanej.. assembler se da vytahat vzdy ... program z C by se pri maximalnich podrobnostech pro debug daly taky vytahat--- ale jinak to bude jen assembler

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Jirka
~ Anonymní uživatel
305 příspěvků
24. 8. 2011   #18
-
0
-

Zdravím, tak sem trochu pokročil a podařilo se mi to posunout zase o trošku dál, bohužel sem se zasekl na dalším erroru a konkrétně na erroru "Unhandled exception at 0x011f152e in matice.exe: 0xC0000005: Access violation writing location 0x335c2b08."

 

#include "stdafx.h"
#include "stdlib.h"
#include "stdio.h"
#include "time.h"
#include <math.h>

int DET(int MAT_A[5][5])
{
	int w, x, y, z, d = 0;
	int det = 0;
	int RAD_A = 5;
	int SUB[5][5] = {0};	
for (int w = 0; w < RAD_A; w++)										// Rozklad podle prvního řádku
		{
for (int x = 0; x < RAD_A - 1; x++)									// Vytvoření submatice
	for (int y = 0; x < RAD_A - 1; y++)
		SUB[x-1][z] = MAT_A[x][y];
		z++;

	det += pow(-1.0, w) * MAT_A[0][w] * DET(SUB); 
		}
	return d;
}

int main()
{
	int MAT_A[5][5];
	int i, j, k, l;
	char c;
	srand(time(NULL));						
	for (int i = 0; i < 5; i++)		 			// Matice A
	{
		for (int j = 0; j < 5; j++)
		{
			MAT_A[i][j] = 10*rand()/RAND_MAX;	
			printf("%d  ", MAT_A[i][j]);
		}
		printf("\n");
		printf("\n%d", DET(MAT_A));
	}
}

Taky mi to píše, že proměnná z nebyla inicializována moc nevím, co si před tím představit, pokud někdo pomůžete budu moc vděčný

Nahlásit jako SPAM
IP: 88.102.116.–
ian0
Stálý člen
28. 8. 2011   #19
-
0
-

#18 Jirka
to je prave ten problem, ze promenna z nebyla inicializovana, tak se na ni podivej

v C++ se promenne neinicializuji na zadnou defaultni hodnotu (u trid/struktur se aspon vola konstruktor, u PODu nic), proto tam vzdy dostanes nejakej bordel, kterej byl v pameti pod zasobnikem pred tim, a hadej co se stane, kdyz timhle bordelem indexujes pole? takze si inicializuj z na nulu, tak jako to mas u d a budes v pohode.

jinak pravidlo, v c++ vzdycky prirad promenne nejakou hodnotu, teda pokud nemas duvod to neudelat (napr. to udelas o radek dal ve for cyklu)

Nahlásit jako SPAM
IP: 89.24.135.–
-- ian
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, 23 hostů

Podobná vlákna

Algoritmus pro substituci — založil Sprinter

Algoritmus pro počítání — založil K4BlOs

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ý