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

Problem z kompilacją programu na komputerach innych niż mój

Ostatnio zmodyfikowano 2017-06-08 21:50
Autor Wiadomość
ws89
Temat założony przez niniejszego użytkownika
Problem z kompilacją programu na komputerach innych niż mój
» 2017-06-01 18:45:57
Dzień dobry,

na zaliczenie miałem napisać program, w którym użytkownik wczytuje N elementów do listy jednokierunkowej. Użytkownik następnie wpisuje wiek, a program usuwa co trzeci element z listy o wieku większym niż wiek wpisany. Po sprawdzeniu czy działa poprawnie przesłałem ten program do sprawdzenia i okazało się, że mimo, że u mnie program działa to jest błąd w 200 linijce tj. "wyszwiek(&*glowa)". Mógłby mi ktoś podpowiedzieć co napisałem źle? Mile widziane również rozwiązanie z objaśnieniem.

Pozdrawiam

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

using namespace std;

struct SElement
{
    int wiek;
    string gatunek;
    double cena;
    SElement * nast;
};

void pisz( SElement * adres )
{
    while( adres )
    {
        cout << "Wiek rosliny : \n";
        cout << adres->wiek << endl;
        cout << "Gatunek rosliny : \n";
        cout << adres->gatunek << endl;
        cout << "Cena rosliny : \n";
        cout << adres->cena << endl;
        adres = adres->nast;
        cout << endl;
    };
};

void wyszwiek( SElement *& adres )
{
    int licznik = 0;
    int wiek;
    SElement * pierwszy;
   
    pierwszy = adres;
   
    cout << "Podaj wiek roslin, z ktorych co trzecia zostanie usunieta z listy\n";
    cin >> wiek;
   
    // okreslanie ilosci elementow wiekszych od wpisanego wieku
    if( adres->wiek > wiek )
         licznik = 1;
   
    while( adres->nast != NULL )
    {
        adres = adres->nast;
        if( adres->wiek > wiek )
             licznik++;
       
    };
    // deklaracja tablicy dynamicznej, w której mieszcza sie elementy wieksze od wpisanego wieku
    int * A = new int[ licznik ];
   
    int la = 0;
   
    adres = pierwszy;
   
    if( adres->wiek > wiek )
    {
        A[ la ] = 1;
        la++;
    }
    int us = 1;
   
    while( adres->nast != NULL )
    {
        adres = adres->nast;
        us++;
       
        if( adres->wiek > wiek )
        {
            A[ la ] = us;
            la++;
        };
    };
   
    // ustalenie ilosci elementow do usuniecia i deklaracja ich w tablicy dynamicznej
    if( la > 0 )
    {
        int ul = la / 3;
       
        int * B = new int[ ul ];
        int dousun = 2;
       
        for( int i = 0; i < ul; i++ )
        {
            B[ i ] = A[ dousun ];
            dousun += 3;
        };
       
        SElement * usun, * aktualny;
        adres = pierwszy;
        // petle usuwajace wybrane elementy
        if( B[ ul - 1 ] == A[ licznik - 1 ] )
        {
            while( adres->nast->nast != NULL )
                 adres = adres->nast;
           
            usun = adres->nast;
            adres->nast = adres->nast->nast;
            delete usun;
           
            adres = pierwszy;
            if( ul > 1 )
            {
                for( int i = ul - 2; i > - 1; i-- )
                {
                    for( int j = 2; j < B[ i ]; j++ )
                         adres = adres->nast;
                   
                    usun = adres->nast;
                    adres->nast = adres->nast->nast;
                    delete usun;
                    adres = pierwszy;
                };
               
            };
        }
        else
        {
            for( int i = ul - 1; i > - 1; i-- )
            {
                for( int j = 2; j < B[ i ]; j++ )
                     adres = adres->nast;
               
                usun = adres->nast;
                adres->nast = adres->nast->nast;
                delete usun;
                adres = pierwszy;
            };
        };
       
        adres = pierwszy;
       
        delete[] A;
        delete[] B;
        cout << "liczba usunietych elementow: " << ul << endl;
    };
   
};

void usun_liste( SElement *& adres )
{
    SElement * aktualny;
   
    aktualny = adres;
   
    while( aktualny )
    {
        adres = aktualny;
        aktualny = aktualny->nast;
        delete adres;
    };
   
    adres = NULL;
   
};




int main( int argc, char * argv[] )
{
    SElement * glowa, * ogon, * aktualny, * usun;
    int n;
   
    cout << "Wpisz ile roslin chcesz dodac do listy ?\n";
    cin >> n;
   
    if( n != 0 )
    {
        glowa = new SElement;
        cout << "Podaj wiek rosliny: \n";
        cin >> glowa->wiek;
        cout << "Podaj gatunek rosliny: \n";
        cin.ignore();
        getline( cin, glowa->gatunek );
        cout << "Podaj cene rosliny: \n";
        cin >> glowa->cena;
        glowa->nast = NULL;
        ogon = glowa;
       
        cout << endl;
       
        for( int i = 1; i < n; i++ )
        {
            aktualny = new SElement;
            cout << "Podaj wiek rosliny: \n";
            cin >> aktualny->wiek;
            cout << "Podaj gatunek rosliny: \n";
            cin.ignore();
            getline( cin, aktualny->gatunek );
            cout << "Podaj cene rosliny: \n";
            cin >> aktualny->cena;
            aktualny->nast = NULL;
            ogon->nast = aktualny;
            ogon = aktualny;
        };
       
       
        pisz( glowa );
       
        wyszwiek( &* glowa );
       
    };
   
    cout << "Lista po usunieciu \n";
    pisz( glowa );
   
    usun_liste( glowa );
   
    if( glowa )
    {
        cout << "lista po usunieciu\n";
        pisz( glowa );
    }
    else
         cout << "lista zostala usunieta\n";
   
   
    system( "Pause" );
    return 0;
}
P-161940
Paitius
» 2017-06-01 18:56:27
Dlaczego jedną funkcję wywołujesz tak: pisz( glowa ), a drugą wywołujesz tak:  wyszwiek( &* glowa ) mimo tych samych argumentów?

Dzięki '&' w definicji funkcji przy argumencie operujesz na oryginale zmiennej. Bez funkcja operuje na kopii. Wywołując funkcję nie dodajesz '&', więc: wyszwiek(glowa)


       
P-161941
Kinexity
» 2017-06-01 19:00:24
void wyszwiek( SElement *& adres );

wyszwiek( &* glowa );


Co w tych dwóch zapisach ma dać ampersand i gwiazdka obok siebie, bo albo nie znam tej magicznej techniki albo to jest błąd...
P-161942
ws89
Temat założony przez niniejszego użytkownika
» 2017-06-01 19:12:30
Dziękuję za podpowiedzi. Usunąłem z wywołania gwiazdkę i ampersand ale zostawiłem w deklaracji funkcji i teraz też mi działa. Czy teraz jest dobrze ?

 
C/C++
void wyszwiek( SElement *& adres )

C/C++
wyszwiek( glowa )
P-161943
Kinexity
» 2017-06-01 19:27:39
Ujmę pytanie tak: jak ty w ogóle chcesz przekazać argument do funkcji: przez wskaźnik, referencję, czy normalnie?
P-161944
jankowalski25
» 2017-06-01 20:06:34
@Kinexity: To jest referencja do wskaźnika.
P-161947
Kinexity
» 2017-06-01 20:14:40
Szczerze mówiąc wydaje mi się, że można by było uniknąć takiego ewenementu.
P-161949
jankowalski25
» 2017-06-01 20:18:18
@Kinexity: Zapewne tak, ale w ten sposób można sprawić, że zmiana wartości wskaźnika będzie widoczna po wywołaniu funkcji. Czasem to się przydaje, ale oczywiście można użyć chociażby podwójnego wskaźnika.
Czy teraz jest dobrze ?
Samo wywołanie tak, "ale to nie znaczy, że nie ma innych błędów".
sh: Pause: nie znaleziono polecenia
U mnie nie ma polecenia
pause
, ani tym bardziej
Pause
. Włącz zatrzymywanie konsoli w IDE, którego używasz lub wywołuj program bezpośrednio z terminala.

Dopisano:
cin.ignore();
Wiesz, że to pomija tylko jeden znak?

Dopisano:
C/C++
aktualny = new SElement;
cout << "Podaj wiek rosliny: \n";
cin >> aktualny->wiek;
cout << "Podaj gatunek rosliny: \n";
cin.ignore();
getline( cin, aktualny->gatunek );
cout << "Podaj cene rosliny: \n";
cin >> aktualny->cena;
C/C++
glowa = new SElement;
cout << "Podaj wiek rosliny: \n";
cin >> glowa->wiek;
cout << "Podaj gatunek rosliny: \n";
cin.ignore();
getline( cin, glowa->gatunek );
cout << "Podaj cene rosliny: \n";
cin >> glowa->cena;
Można napisać funkcję zamiast powtarzać niemal identyczny kod.
P-161950
« 1 » 2
  Strona 1 z 2 Następna strona