Tym3k Temat założony przez niniejszego użytkownika |
[C++] Przekazywanie dwuwymiarowej tablicy do funkcji » 2013-12-23 00:18:30 #include <iostream> #include <conio.h> #include <ctime> #include <stdlib.h>
using namespace std;
const int n = 3; int tab[ n ][ n ]; int menu(); void wypelnij( int tab, int min, int max ); int wyznacznik( int tab[][ n ] ); void symetryczna();
int main() { int x, y, tab_1; wypelnij( tab_1, 1, 9 ); switch( menu() ) { case 1: { break; } } cout << endl << endl; getch(); return 0; }
int menu() { cout << " -------------------- Menu Lab 5 ---------------" << endl; cout << "1.Wyliczanie wyznacznika macierzy" << endl; cout << "2.Sprawdz czy macierz jest symetryczna " << endl; cout << "3.Suma wartosci komorek" << endl; cout << "------------------------------------------------" << endl << endl; int opcja; do { cout << "wybierz warunek od 1 do 3" << endl; cin >> opcja; } while( opcja < 1 || opcja > 3 ); }
void wypelnij( int tab[][ n ], int min, int max ) { srand( time( 0 ) ); for( int i = 0; i < n; i++ ) { for( int j = 0; j < n; j++ ) { tab[ i ][ j ] = rand() %( max - min + 1 ) + min; cout << tab[ i ][ j ] << " "; } cout << "\n"; } }
int wyznacznik( int tab[][ n ] ) { int Wyznacznik_1 =( tab[ 0 ][ 0 ] * tab[ 1 ][ 1 ] * tab[ 2 ][ 2 ] ) +( tab[ 0 ][ 1 ] * tab[ 1 ][ 2 ] * tab[ 2 ][ 0 ] ) +( tab[ 0 ][ 2 ] * tab[ 1 ][ 0 ] * tab[ 2 ][ 1 ] ); int Wyznacznik_2 =( tab[ 2 ][ 0 ] * tab[ 1 ][ 1 ] * tab[ 0 ][ 2 ] ) +( tab[ 2 ][ 1 ] * tab[ 1 ][ 2 ] * tab[ 0 ][ 0 ] ) +( tab[ 2 ][ 2 ] * tab[ 1 ][ 0 ] * tab[ 0 ][ 1 ] ); int Wyznacznik = Wyznacznik_1 - Wyznacznik_2; cout << "\nWyznacznik macierzy wynosi " << Wyznacznik << "."; }
[Error] cannot convert 'float' to 'int (*)[3]' for argument '1' to 'float wyznacznik(int (*)[3])'
Dobrze chociaż przekazuje te tablice po funkcjach, przy jednowymiarowych to ładnie śmigało, teraz coś nie chce mi pyknąć. coś znowu przekombinowałem i funkcja która wcześniej poprawnie działała teraaz padła i pokazuje taki błąd 1.cpp:(.text+0x1e): undefined reference to `wypelnij(int, int, int)'
|
|
DejaVu |
» 2013-12-23 01:00:12 Generalnie tablice dwuwymiarowe w C++ to problem. Najlepszym sposobem na ich przekazywanie do funkcji jest utworzenie struktury, np. struct RTablica { int tab[ 12 ][ 13 ]; };
void funkcja( RTablica & _tablica ) { _tablica.tab[ 10 ][ 11 ] = 123; }
int main() { RTablica tab; funkcja( tab ); return 0; }
W każdym innym przypadku jest to droga przez mękę (no chyba, że interesuje Ciebie std::vector<std::vector<int> >, ale to już inna kwestia). |
|
Tym3k Temat założony przez niniejszego użytkownika |
» 2013-12-23 01:02:14 Tego sposobu, nie mogę użyć, a czy wskaźnikami mogę to zrobić? |
|
DejaVu |
» 2013-12-23 01:05:50 #define DRUGI_WYMIAR 123
void funkcja( int _tablica[][ DRUGI_WYMIAR ] ) { _tablica[ 10 ][ 11 ] = 123; }
int main() { int tab[ 12 ][ DRUGI_WYMIAR ]; funkcja( tab ); return 0; } |
|
camillos90 |
» 2013-12-23 01:16:03 Na wskaźnikach: void rob_cos( int ** tab, int n, int m ) { for( int i = 0; i < n; i++ ) for( int j = 0; j < m; j++ ) tab[ i ][ j ] = i * j; }
int main() { int n = 5; int m = 6; int ** tab = new int *[ n ]; for( int i = 0; i < n; i++ ) tab[ i ] = new int[ m ]; rob_cos( tab, n, m ); for( int i = 0; i < n; i++ ) delete[] tab[ i ]; delete[] tab; return 0; }
|
|
leon_w |
» 2013-12-23 11:53:46 void wypelnij( int tab, int min, int max );
|
Tak masz zadeklarowaną funkcje na podczątku void wypelnij( int tab[][ n ], int min, int max )
|
a tak faktycznie wygląda funkcja. Zła deklaracja funkcji może powodować ów błąd. i do funkcji wysyłasz zmienną int zamiast tablicy int x, y, tab_1; wypelnij( tab_1, 1, 9 ); |
W menu dodaj na końcu return opcja; i powinno działać. Aczkolwiek nie wiem, czy obliczenia są poprawne, bo się na tym nie znam :P |
|
Tym3k Temat założony przez niniejszego użytkownika |
» 2013-12-31 00:24:33 |
|
Tym3k Temat założony przez niniejszego użytkownika |
» 2014-01-01 15:36:40 #include <iostream> #include <conio.h> #include <ctime> #include <stdlib.h>
using namespace std;
const int n = 3; int ** tab;
int menu(); void wypelnij_i_pokaz( int ** tab, int min, int max );
int wyznacznik( int ** tab ); bool symetryczna( int ** tab, int n ); int suma_komorek( int ** tab, int n );
int main() { switch( menu() ) { case 1: { system( "CLS" ); cout << "Macierz 3x3" << endl; wypelnij_i_pokaz( tab, 1, 9 ); wyznacznik( tab ); break; } case 2: { wypelnij_i_pokaz( tab, 1, 9 ); if( symetryczna( tab, n ) ) cout << "Tablica jest symetryczna" << endl; else cout << "tablica jest niesymetryczna" << endl; break; } case 3: { wypelnij_i_pokaz( tab, 1, 9 ); suma_komorek( tab, n ); break; } } system( "pause" ); }
int menu() { int opcja; do { cout << " ============ Menu Lab 5 ============" << endl; cout << "1.Wyliczanie wyznacznika macierzy" << endl; cout << "2.Sprawdz czy macierz jest symetryczna " << endl; cout << "3.Suma wartosci komorek" << endl; cout << "=======================================" << endl << endl; cout << "wybierz warunek od 1 do 3" << endl; cin >> opcja; } while( opcja < 1 || opcja > 3 ); return opcja; }
void wypelnij_i_pokaz( int ** tab, int min, int max ) { tab = new int *[ n ]; srand( time( 0 ) ); for( int i = 0; i < n; i++ ) { tab[ i ] = new int[ n ]; for( int j = 0; j < n; j++ ) { tab[ i ][ j ] = rand() %( max - min + 1 ) + min; cout << tab[ i ][ j ] << " "; } cout << "\n"; } }
int wyznacznik( int ** tab ) { int Wyznacznik; tab = new int *[ n ]; for( int i = 0; i < n; i++ ) { tab[ i ] = new int[ n ]; for( int j = 0; j < n; j++ ) { int Wyznacznik_1 =( tab[ 0 ][ 0 ] * tab[ 1 ][ 1 ] * tab[ 2 ][ 2 ] ) +( tab[ 0 ][ 1 ] * tab[ 1 ][ 2 ] * tab[ 2 ][ 0 ] ) +( tab[ 0 ][ 2 ] * tab[ 1 ][ 0 ] * tab[ 2 ][ 1 ] ); int Wyznacznik_2 =( tab[ 2 ][ 0 ] * tab[ 1 ][ 1 ] * tab[ 0 ][ 2 ] ) +( tab[ 2 ][ 1 ] * tab[ 1 ][ 2 ] * tab[ 0 ][ 0 ] ) +( tab[ 2 ][ 2 ] * tab[ 1 ][ 0 ] * tab[ 0 ][ 1 ] ); cout << Wyznacznik_1 << endl; cout << Wyznacznik_2 << endl; Wyznacznik = Wyznacznik_1 - Wyznacznik_2; } } cout << "\nWyznacznik macierzy wynosi " << Wyznacznik << "."; return Wyznacznik; }
bool symetryczna( int ** tab, int n ) { tab = new int *[ n ]; for( int i = 0; i < n; i++ ) { tab[ i ] = new int[ n ]; for( int j = 0; j < n; j++ ) { if( tab[ i ][ j ] != tab[ j ][ i ] ) { return false; } } } return true; }
int suma_komorek( int ** tab, int n ) { int suma = 0; tab = new int *[ n ]; for( int i = 0; i < n; i++ ) { tab[ i ] = new int[ n ]; for( int j = 0; j < n; j++ ) { if(( i + j ) % 2 == 0 ) { suma = suma + tab[ i ][ j ]; } } } cout << "suma wynosi " << suma << endl; return suma; }
W tej sytuacji, program mi pokazuje że wyznacznik jest 0, nie widzi macierzy z poprzedniej funkcji?[/i] |
|
« 1 » 2 |