Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Typ fukcji, a return.

Ostatnio zmodyfikowano 2016-01-30 14:26
Autor Wiadomość
Dan2ra
Temat założony przez niniejszego użytkownika
Typ fukcji, a return.
» 2016-01-23 18:57:28
Witam,
oto fragment mojego kodu:

C/C++
#include <iostream>
#include <cstdlib>

using namespace std;

struct macierz
{
    int wiersze;
    int kolumny;
    int wsp[ 10 ][ 10 ];
};

//--------

macierz wyznacznik()

{
    int wynik;
    macierz ABC;
    wynik = ABC.wsp[ 0 ][ 0 ] + ABC.wsp[ 1 ][ 0 ]; //itd. - tymczasowy zapis
   
    return wynik;
}

chciałbym funkcją liczyć wyznacznik macierzy 3x3, ale kompilator wywala błąd:

error: could not convert 'wynik' from 'int' to 'macierz'|


gdzie jest błąd??

P-143928
pekfos
» 2016-01-23 19:10:51
C/C++
macierz wyznacznik()
Od kiedy wyznacznik macierzy liczy się z niczego i jest macierzą?
P-143929
bombatom69
» 2016-01-23 19:12:26
Dla C++ nie ma znaczenia co chcesz zrobić tylko jak to robisz.
Deklarujesz w nagłówku funkcji, że będziesz zwracał obiekt klasy macierz a zwracasz liczbę int i tutaj jest problem.

Inne pytanie jest takie, czy jesteś pewien, że typ int wystarczy do wyznacznika? Oczywiście C++ nie będzie protestował w tej sprawie ale Ty pewnie tak :)
P-143930
Dan2ra
Temat założony przez niniejszego użytkownika
» 2016-01-23 19:27:20
Jestem b. początkujący. Dzięki za podpowiedz.

Teraz kompilator wywala błąd w innym miejscu programu, a mianowicie:
C/C++
case 4:
{
    A = wczytaj(); //funkcja wczytująca macierz
    wyznacznik( A );
    wypisz( A );
}

błąd:

undefined reference to `wyznacznik(macierz)'


czy to jest problem tego typu, że przekazuję typ macierz do funkcji typu int??
P-143934
bombatom69
» 2016-01-23 19:31:08
Kompilator dość grzecznie informuje Cię, że nie posiada takiej funkcji jaką wywołujesz. Przeczytaj jeszcze raz poradę pekfosa i koniecznie poczytaj jeszcze raz rozdział o funkcjach w kursie/książce/czymkolwiek z czego się uczysz.
P-143937
Dan2ra
Temat założony przez niniejszego użytkownika
» 2016-01-27 19:27:51
Proszę o oświecenie. Dlaczego program zamiast pokazać wyznacznik, pokazuję zadaną do liczenia wyznacznika macierz?

KOD:

C/C++
#include <iostream>
#include <cstdlib>

using namespace std;

struct macierz
{
    int wiersze;
    int kolumny;
    int wsp[ 10 ][ 10 ];
};

void wypisz( struct macierz ABC );
macierz wczytaj();
macierz suma( macierz A, macierz B );
macierz roznica( macierz X, macierz Y );
macierz iloczyn( macierz X, macierz Y );
int wyznacznik( macierz ABC );


int main()

{
    int liczba;
    macierz A, B, S, R1, R2, I, W;
   
    cout << endl << "Co chcesz zrobic z macierzami?" << endl << endl;
    cout << "1. Dodac." << endl;
    cout << "2. Odjac." << endl;
    cout << "3. Pomnozyc." << endl;
    cout << "4. Liczyc wyznacznik macierzy 3x3." << endl << endl;
    cout << "Wybor: "; cin >> liczba;
    system( "cls" );
    cout << endl;
   
    switch( liczba )
    {
       
    case 1:
       
        {
            cout << "Podaj dane macierzy A: " << endl << endl;
            A = wczytaj();
            cout << endl << "Podaj dane macierzy B: " << endl << endl;
            B = wczytaj();
            system( "cls" );
            cout << endl << "MACIERZ A:" << endl << endl;
            wypisz( A );
            cout << endl << "MACIERZ B:" << endl << endl;
            wypisz( B );
           
            S = suma( A, B );
            cout << endl << "SUMA: " << endl << endl;
            wypisz( S );
           
           
            break;
        }
       
    case 2:
       
        {
            cout << "Podaj dane macierzy od ktorej chcesz odjac: " << endl << endl;
            A = wczytaj();
            cout << endl << "Podaj dane macierzy odejmowanej: " << endl << endl;
            B = wczytaj();
            system( "cls" );
            cout << endl << "MACIERZ A:" << endl << endl;
            wypisz( A );
            cout << endl << "MACIERZ B:" << endl << endl;
            wypisz( B );
           
            R1 = roznica( A, B );
            cout << endl << "ROZNICA: " << endl << endl;
            wypisz( R1 );
           
           
            break;
        }
       
       
       
    case 3:
       
        {
            cout << "Podaj dane macierzy A: " << endl << endl;
            A = wczytaj();
            cout << endl << "Podaj dane macierzy B: " << endl << endl;
            B = wczytaj();
            system( "cls" );
            cout << endl << "MACIERZ A:" << endl << endl;
            wypisz( A );
            cout << endl << "MACIERZ B:" << endl << endl;
            wypisz( B );
           
            cout << endl << "ILOCZYN: " << endl << endl;
            I = iloczyn( A, B );
           
            wypisz( I );
           
           
            break;
        }
       
       
    case 4:
       
        {
            W = wczytaj();
            wyznacznik( W );
            wypisz( W );
           
            break;
        }
       
    }
   
   
    return 0;
}
// KONIEC MAIN


void wypisz( struct macierz ABC )
{
    for( int i = 0; i < ABC.wiersze; i++ )
    {
        for( int j = 0; j < ABC.kolumny; j++ )
        {
            cout.width( 5 );
            cout << ABC.wsp[ i ][ j ];
        }
        cout << endl;
    }
}


//------------------------------------

macierz wczytaj()
{
    macierz ABC;
   
    cout << "Liczba wierszy: ";
    cin >> ABC.wiersze;
    cout << "Liczba kolumn: ";
    cin >> ABC.kolumny;
    cout << endl;
   
    for( int i = 0; i < ABC.wiersze; i++ )
    for( int j = 0; j < ABC.kolumny; j++ )
    {
        cout << "Podaj wspolczynnik [" <<( i + 1 ) << "] , [" <<( j + 1 ) << "]: ";
        cin >> ABC.wsp[ i ][ j ];
    }
    return ABC;
}

//------------------------------------

macierz suma( macierz A, macierz B )
{
   
    macierz wynik;
   
    if(( A.kolumny != B.kolumny ) ||( A.wiersze != B.wiersze ) )
    {
        cout << "## Inne wymiary!!";
        exit( 1 );
    }
    for( int i = 0; i < A.kolumny; i++ ) {
        for( int j = 0; j < A.wiersze; j++ ) {
            wynik.wsp[ i ][ j ] = A.wsp[ i ][ j ] + B.wsp[ i ][ j ];
        }
    }
   
    return wynik;
}

//--------------------------------

macierz roznica( macierz X, macierz Y )
{
   
    macierz wynik;
   
    if(( X.kolumny != Y.kolumny ) ||( X.wiersze != Y.wiersze ) )
    {
        cout << endl << "## Inne wymiary!!";
        exit( 1 );
    }
    for( int i = 0; i < X.kolumny; i++ ) {
        for( int j = 0; j < X.wiersze; j++ ) {
            wynik.wsp[ i ][ j ] = X.wsp[ i ][ j ] - Y.wsp[ i ][ j ];
        }
    }
    return wynik;
}

//-----------------------------------

macierz iloczyn( macierz X, macierz Y )
{
    macierz Z;
   
    if( X.kolumny == Y.wiersze )
    {
        for( int i = 0; i < X.kolumny; i++ )
        {
            for( int j = 0; j < Y.wiersze; j++ )
            {
                Z.wsp[ i ][ j ] = 0;
                for( int k = 0; k < X.kolumny; k++ )
                {
                    Z.wsp[ i ][ j ] = Z.wsp[ i ][ j ] +( X.wsp[ i ][ k ] * Y.wsp[ k ][ j ] );
                }
            }
        }
    } else
    {
        cout << "Nie mozna pomnozyc! Liczba kolumn pierwszj macierzy" << endl;
        cout << "jest inna niz liczba wierszy drugiej." << endl;
    }
    return Z;
}

//--------------------------------

int wyznacznik( macierz ABC )

{
    int wynik;
    wynik =( ABC.wsp[ 0 ][ 0 ] + ABC.wsp[ 1 ][ 0 ] + ABC.wsp[ 2 ][ 2 ] ) +( ABC.wsp[ 1 ][ 0 ] + ABC.wsp[ 2 ][ 1 ] + ABC.wsp[ 0 ][ 2 ] )
    +( ABC.wsp[ 2 ][ 0 ] + ABC.wsp[ 0 ][ 1 ] + ABC.wsp[ 1 ][ 2 ] ) -( ABC.wsp[ 0 ][ 2 ] + ABC.wsp[ 1 ][ 1 ] + ABC.wsp[ 2 ][ 0 ] )
    -( ABC.wsp[ 1 ][ 2 ] + ABC.wsp[ 2 ][ 1 ] + ABC.wsp[ 0 ][ 0 ] -( ABC.wsp[ 2 ][ 2 ] + ABC.wsp[ 0 ][ 1 ] + ABC.wsp[ 1 ][ 0 ] ) );
   
    return wynik;
}
P-144075
bombatom69
» 2016-01-27 21:04:48
Odwróćmy pytanie: dlaczego Twoim zdaniem powinien zrobić to co napisałeś?

Na przyszłość: prezentuj tylko właściwe fragmenty kodu. Nikt w internecie nie ma czasu z gumy.
P-144083
Dan2ra
Temat założony przez niniejszego użytkownika
» 2016-01-28 14:53:01
Zakładam, że błąd jest tutaj:

C/C++
{
    W = wczytaj();
    wyznacznik( W );
    wypisz( W );
   
    break;
}

program pokazuję po prostu wczytaną macierz W, bo funkcja zwraca typ int i z macierzą W nic się nie dzieje. Jeśli mam racje to nie wiem jak sobie z tym poradzić.


edit:

OK, dałem po prostu w funkcji cout<<wynik; a funkcje wypisz wyrzuciłem:

C/C++
int wyznacznik( macierz ABC )

{
    int wynik;
    wynik =( ABC.wsp[ 0 ][ 0 ] * ABC.wsp[ 1 ][ 1 ] * ABC.wsp[ 2 ][ 2 ] ) +( ABC.wsp[ 1 ][ 0 ] * ABC.wsp[ 2 ][ 1 ] * ABC.wsp[ 0 ][ 2 ] ) +( ABC.wsp[ 2 ][ 0 ] * ABC.wsp[ 0 ][ 1 ] * ABC.wsp[ 1 ][ 2 ] ) -
    ( ABC.wsp[ 0 ][ 2 ] * ABC.wsp[ 1 ][ 1 ] * ABC.wsp[ 2 ][ 0 ] ) -( ABC.wsp[ 1 ][ 2 ] * ABC.wsp[ 2 ][ 1 ] * ABC.wsp[ 0 ][ 0 ] ) -( ABC.wsp[ 2 ][ 2 ] * ABC.wsp[ 0 ][ 1 ] * ABC.wsp[ 1 ][ 0 ] );
    cout << a;
   
    return wynik;
}

Jest to dobre rozwiązanie?
P-144107
« 1 » 2 3
  Strona 1 z 3 Następna strona