Przekazywanie tablic struktur do funkcji.

0

Witam!
Piszę program i już na tak wczesnym etapie pojawia mi się problem z przekazywanie tablicy struktur do funkcji, szukam ciągle w internecie ale nie potrafię znaleźć błędu, oto kod:

#include <iostream>
#include <string>
#include <cstdlib>
#include <conio.h>
using namespace std;
const int N=51;
bool czymoze(struct pole pionki);
void skokwprawo();
void skokwlewo();
struct pole
    {
        int pole;
        int lpionkow;
    };
int main()
{
    int i,n;
    string czydalej;
    pole pionki[N];
    for(int j=0,k=-N/2;j<N;j++,k++)
    {
        pionki[j].pole=k;
        pionki[j].lpionkow=0;
    }
    do
    {
        cout<<"\nwprowadz numer pola: ";
        cin>>i;
        cout<<"\nwprowadz ilosc pionkow na polu: ";
        cin>>n;
        pionki[i+N/2].lpionkow=n;
        system("cls");
        cout<<"\nczy chcesz kontynuowac(Y/N)";
        cin>>czydalej;
        system("cls");
        if(czydalej=="N"||czydalej=="n")
            break;
    }while(1);
    if(czymoze(pionki))
       skokwprawo();
    else
        skokwlewo();
    for(int j=0;j<N;j++)
        cout<<pionki[j].pole<< " " << pionki[j].lpionkow<<endl;
    return 0;
}
 
0
struct pole
    {
        int pole;
        int lpionkow;
    };
bool czymoze(pole pionki[]);
void skokwprawo();
void skokwlewo();
0

ale on nie tworzy kopii tych struktur? Bo napisałem cały program i mi się pięknie kompiluje tylko nic się w nim nie dzieje i wynikałoby mi z tego że to przez to że nie pracuje na oryginale tablicy struktur.

0

Tablice są przekazywane przez wskaźnik - żadnych kopii.

0

Nie byłem pewien czy dla tablicy struktur też tak będzie. Znalazłem kilka błędów i teraz się nie kończy.
Wrzucam wszystko co napisałem oraz polecenie, byłbym wdzięczny za pomoc. W treści jest że nie skończona, nie umiem jeszcze list dlatego zrobiłem na skończonej.

#include <iostream>
#include <string>
#include <cstdlib>
#include <conio.h>
using namespace std;
struct pole
    {
        int pole;
        int lpionkow;
    };
const int N=20;
int czymoze(pole pionki[],int i);
bool czykoniec(pole pionki[]);
void skokwprawo(pole pionki[],int i);
void skokwlewo(pole pionki[],int i);
int main()
{
    int i,n;
    string czydalej;
    pole pionki[N];
    for(int j=0,k=-N/2;j<N;j++,k++)
    {
        pionki[j].pole=k;
        pionki[j].lpionkow=0;
    }
    do//wprowadzanie danych dp tablicy struktu
    {
        cout<<"\nwprowadz numer pola: ";
        cin>>i;
        cout<<"\nwprowadz ilosc pionkow na polu: ";
        cin>>n;
        pionki[i+N/2].lpionkow=n;
        system("cls");
        cout<<"\nczy chcesz kontynuowac(Y/N)";
        cin>>czydalej;
        system("cls");
        if(czydalej=="N"||czydalej=="n")
            break;
    }while(1);
    while(1)//petla krecaca sie caly czas, przerywana jest breakiem
    {
        if(czykoniec(pionki))//funkcja ktora sprawdza czy dana konfiguracja jest prawidlowa, jezeli jest to przerywa petle
            break;
        for(int i=N-1;i>=0;i--)//petla przechodzaca po calej tablicy struktur od "prawej" strony
        {
            if(czymoze(pionki,i)==1)//jezeli funkcja czy moze zwroci 1, tzn mozliwy jest skok w prawo to go wykonuje i konczy petle
            {
                skokwprawo(pionki,i);
                break;
            }
            else if(czymoze(pionki,i)==2)//jezeli funkcja czy moze zwroci 2, tzn jezeli skok w prawo jest niemozliwy to ykonuje w lewo jak jest mozliwy
            {
                skokwlewo(pionki,i);
                break;
            }
        }
    }
    for(int j=0;j<N;j++)//petla wypisujaca konfiguracje
        cout<<pionki[j].pole<< " " << pionki[j].lpionkow<<endl;
    return 0;
}
bool czykoniec(pole pionki[])//funkcja sprawdzajaca czy dana konfiguracja jest juz prawidlowa
{
    bool ok=false;
    for(int i=0;i<N;i++)//petla poruszajca sie po calej tablicy
    {
        if((pionki[i].lpionkow+pionki[i-1].lpionkow)<2)//jezeli warunki sa spelnione to jak sie petla skonczy i ciagle bedzie true to koniec
            ok=true;
        else if(pionki[i].lpionkow>1)//jezeli na jakims polu liczba pionkow jest wieksza od 1 to od razu konczy petle i funkcje zwracajac false
        {
            ok=false;
            break;
        }
    }
    return ok;
}
void skokwprawo(pole pionki[],int i)//funkcja wykonująca skok w prawo
{
    pionki[i+1].lpionkow+=1;
    pionki[i].lpionkow-=1;
    pionki[i-1].lpionkow-=1;
}
void skokwlewo(pole pionki[],int i)//fukncja wykonujaca skok w lewo
{
    pionki[i].lpionkow-=1;
    pionki[i-1].lpionkow+=1;
    pionki[i-2].lpionkow+=1;
}
int czymoze(pole pionki[],int i)//funkcja okreslajaca ktory skok nalezy wykonac
{
    if(i<N-1&&i>0)//sprawdzanie warunku skoku w prawo
    {
        if(pionki[i].lpionkow!=0&&pionki[i-1].lpionkow!=0&&(pionki[i].lpionkow<pionki[i-1].lpionkow))
        {
            return 1;
        }
    }
    else if(i>0)//sprawdzanie warunku skoku w lewo
    {
        if(pionki[i].lpionkow>1&&pionki[i].lpionkow>pionki[i-1].lpionkow)
        {
        return 2;
        }
    }
    else//jezeli zadne to nie wykoana skoku dla danego pola
    return 0;
}
 
0

Wiem że mam błąd w tej funkcji, podejrzewam że nie wchodzi do ifa opisanego w komentarzu.

 int czymoze(pole pionki[],int i)
{
    if((i<N-1)&&i>0)//tutaj wchodzi
    {
        if(((pionki[i].lpionkow!=0)&&(pionki[i-1].lpionkow!=0))&&((pionki[i].lpionkow<pionki[i-1].lpionkow)))//tutaj jest chyba blad bo tu nigdy nie wchodzi a powinien
        {
            return 1;
        }
    }
    else if(i>0)//tutaj wchodzi
    {
        if(pionki[i].lpionkow>1&&pionki[i].lpionkow>pionki[i-1].lpionkow)//drugi blad tutaj bo tutaj tez nie wchodzi a powinien
        {
            return 2;
        }
    }
    else//jezeli zadne to nie wykoana skoku dla danego pola
    return 0;
}
0

i>=0

0

To jest dobrze, bo ma nie sprawdzać mi tego 0 bo wtedy mi zakres przekroczy. Dorzucę wywołanie.

 if((czymoze(pionki,i))==1)

1 użytkowników online, w tym zalogowanych: 0, gości: 1