• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed dynamiczna tablica dwuwymiarowa jako argument przesyła błędne dane

VPS Starter Arubacloud
0 głosów
664 wizyt
pytanie zadane 3 maja 2019 w C i C++ przez mefiak Nowicjusz (120 p.)
zamknięte 4 maja 2019 przez mefiak

Witam, tak jak w tytule mam problem z poprawnym przerzuceniem danych do funkcji. Sprawdzałem zawartość tablicy przed i po wrzuceniu i wartości nie są sobie równe, przez co program generuje złe wyniki. 
Program dotyczy dekompozycje pseudolosowego układu MUX(binarnego). Problem pojawia się po podzieleniu układu na 4 podukładu w funkcji mux w których wyrazami pod 2 pierwszymi indeksami w tablicy są kolejno 00,01,10,11, kiedy wrzucam te wartości do kolejnej funkcji - sprawdzanie która sprawdza od czego zależą te podzielone linie to zauważyłem, że linia wyjść zostaje zmieniona, nie mam pojęcia dlaczego. Próbuje to naprawić już cały dzień i nie mam pojęcia dlaczego się tak dzieje. Wrzucam cały kod, bo po prostu nie wiem co jest w nim do zmiany. Będę wdzięczny za wszelką próbę pomocy. Wiem, że kod jest trochę zagmatwany, ale nie myślałem, że będę go musiał komuś pokazywać i że zajmie mi aż tyle linijek, także z góry przepraszam.

#include <iostream>
#include <cstdlib>
#include <time.h>
#include <fstream>
#include <string>
using namespace std;
fstream dane;
int ktoryMux = 1;
void usuwanieUkladu(int** uklad, int p)
{
    for(int i=0;i<p;i++)
    {
        delete [] uklad[p];
    }
}
void wyswietlUklad(int** uklad, int n, int m, int p)
{
    cout<<"(WEJSCIA)"<<"      (WYJSCIA)"<<endl;
    dane<<"(WEJSCIA)"<<"      (WYJSCIA)"<<endl;
    for(int i=0;i<p;i++)
    {
        for(int j = 0; j<n; j++)
        {
            cout<<uklad[i][j];
            dane<<uklad[i][j];
        }
        cout<<"      ";
        dane<<"      ";
        for(int j = 0; j<m; j++)
        {
            cout<<uklad[i][j];
            dane<<uklad[i][j];
        }
        cout<<endl;
        dane<<endl;
    }
}
int** tworzenieUkladu(int n, int m, int p)
{
    int** uklad= new int*[p];
    int los;
    int wskaznik;
    for(int i=0;i<p;i++)
    {
        uklad[i] = new int[n+m];
        for(int j=0;j<n+m;j++)
        {
            los = (rand()%2);
            uklad[i][j]=los;
        }
    }
    for(int i=0;i<p;i++)//sprawdzenie czy zaden wiersz sie nie powtarza
    {
        for(int k=i+1;k<p;k++)
        {
                for(int j=0;j<m;j++)
                {
                    if(uklad[i][j]==uklad[k][j])
                        wskaznik=1;
                    else
                    {
                        wskaznik=0;
                        break;
                    }
                }
                if(wskaznik==1 && uklad[i][m] != uklad[k][m])//m - wyjscie
                {
                    if(uklad[k][m+n-1]==1)
                        uklad[k][m+n-1]=0;
                    else
                        uklad[k][m+n-1]=1;
                }
                for(int j=0; j<m+n;j++)
                {
                    if(uklad[i][j]==uklad[k][j])
                        wskaznik=1;
                    else
                    {
                        wskaznik=0;
                        break;
                    }
                }

            if(wskaznik==1)
            {
                for(int j=0;j<n+m;j++)
                {
                    los = (rand()%2);
                    uklad[k][j]=los;
                }
                k--;
            }
        }
    }
    return uklad;
}
int** macierz(int ilWiersz, int ilKol)
{
    int** mac = new int*[ilWiersz];
    for(int i=0; i<ilWiersz; i++)
    {
        mac[i]=new int[ilKol];
    }
    return mac;
}
void dodajDoMacierzy(int** macierz, int* wiersz, int dlugosc, int ktoryWiersz)
{
    for(int i=0;i<dlugosc;i++)
    {
        macierz[ktoryWiersz][i]=wiersz[i];
    }
}
string sprawdzenie(int** wiersze, int iloscWierszy, int dlugoscWiersza, int x2)
{
    int wskaznik, s;
    if(iloscWierszy==0)return "-";
    if(iloscWierszy==1)return to_string (wiersze[0][dlugoscWiersza-1]);
    for(int i=0; i<iloscWierszy;i++)
    {
        for(int j=0; j<iloscWierszy;j++)
        {
            if(wiersze[i][dlugoscWiersza-1]!=wiersze[j][dlugoscWiersza-1])
            {
                wskaznik=0;
                break;
            }
            else
                wskaznik=1;
        }
        if(wskaznik==0) break;
    }
    if(wskaznik==1)
        return to_string(wiersze[0][dlugoscWiersza-1]);
    for(int i=x2+1; i<dlugoscWiersza-1;i++)//bo ostatni wyraz jest y-iem
    {
        for(int j=0;j<iloscWierszy;j++)
        {
            if(wiersze[j][i]==wiersze[j][dlugoscWiersza-1])
                wskaznik=1;
            else
            {
                wskaznik=0;
                break;
            }
        }
        if(wskaznik==1)
        {
            return "x"+to_string(i);
        }

    }

    for(int i=x2+1;i<dlugoscWiersza-1;i++)
    {
        for(int j=0;j<iloscWierszy;j++)
        {
            if(wiersze[j][dlugoscWiersza-1]==0)
                s=1;
            else
                s=0;
            if(wiersze[j][i]!=s)
            {
                wskaznik=0;
                break;
            }
            else
            {
                wskaznik=1;
            }
        }
        if(wskaznik==1)
            return "-x"+to_string(i);

    }
    if(dlugoscWiersza==2)
        return "Blad";
    ktoryMux++;
    return "MUX"+to_string(ktoryMux);
}
void mux(int** uklad, int n, int p, int x1, int x2)
{
    static int L=0;L++;
    cout<<"x"<<x1<<";"<<"x"<<x2<<endl;
    if(x2!=n+1)
    {
        int** wiersze00 = macierz(p, 1+n),**wiersze01 = macierz(p, 1+n),**wiersze10 = macierz(p, 1+n),**wiersze11 = macierz(p, 1+n);
        int uklad00=0,uklad01=0,uklad10=0, uklad11=0;
        for(int i = 0; i<p;i++)
        {
            if(uklad[i][x1]==0 && uklad[i][x2]==0)
            {
                dodajDoMacierzy(wiersze00, uklad[i], 1+n, uklad00);
                uklad00++;
            }
            else if(uklad[i][x1]==0 && uklad[i][x2]==1)
            {
                dodajDoMacierzy(wiersze01, uklad[i], 1+n, uklad01);
                uklad01++;
            }
            else if(uklad[i][x1]==1 && uklad[i][x2]==0)
            {
                dodajDoMacierzy(wiersze10, uklad[i], 1+n, uklad10);
                uklad10++;
            }
            else
            {
                dodajDoMacierzy(wiersze11, uklad[i], 1+n, uklad11);
                uklad11++;
            }
        }
        string
        muxOrNotA=sprawdzenie(wiersze00, uklad00,1+n,x2),
        muxOrNotB=sprawdzenie(wiersze01, uklad01,1+n,x2),
        muxOrNotC=sprawdzenie(wiersze10, uklad10,1+n,x2),
        muxOrNotD=sprawdzenie(wiersze11, uklad11,1+n,x2), M="M";
        cout<<"L:"<<L<<endl;
        cout<<"MUX "<<L<<"(00)   "<<muxOrNotA<<endl;
        cout<<"MUX "<<L<<"(01)   "<<muxOrNotB<<endl;
        cout<<"MUX "<<L<<"(10)   "<<muxOrNotC<<endl;
        cout<<"MUX "<<L<<"(11)   "<<muxOrNotD<<endl;
        dane<<"L:"<<L<<endl;
        dane<<"MUX "<<L<<"(00)   "<<muxOrNotA<<endl;
        dane<<"MUX "<<L<<"(01)   "<<muxOrNotB<<endl;
        dane<<"MUX "<<L<<"(10)   "<<muxOrNotC<<endl;
        dane<<"MUX "<<L<<"(11)   "<<muxOrNotD<<endl;
        if(muxOrNotA[0] == M[0])mux(wiersze00,n,uklad00,x1+2,x2+2);
        if(muxOrNotB[0] == M[0])mux(wiersze01, n,uklad01,x1+2,x2+2);
        if(muxOrNotC[0] == M[0])mux(wiersze10, n,uklad10,x1+2,x2+2);
        if(muxOrNotD[0] == M[0])mux(wiersze11, n,uklad11,x1+2,x2+2);
        usuwanieUkladu(wiersze00, uklad00);usuwanieUkladu(wiersze01,uklad01);usuwanieUkladu(wiersze10,uklad10);usuwanieUkladu(wiersze11,uklad11);
    }
    else
    {
        cout<<"L:"<<L<<endl;dane<<"L:"<<L+1<<endl;
        cout<<"MUX (00)"<<L<<x2<<endl;dane<<"MUX (00)"<<x2<<endl;
        cout<<"MUX (01)"<<L<<x2<<endl;dane<<"MUX (01)"<<x2<<endl;
        cout<<"MUX (10)"<<L<<x2<<endl;dane<<"MUX (10)"<<x2<<endl;
        cout<<"MUX (11)"<<L<<x2<<endl;dane<<"MUX (11)"<<x2<<endl;
    }
}
int main()
{
    cout<<"Program wykonuje dekompozycje ukladu kombinacyjnego funkcji logicznej."<<endl;
    dane.open("dane.txt", ios::out | ios::trunc);
    while(true)
    {
    srand(time(NULL));
    int n,p;
    cout << "ilosc wejsc" << endl;
    cin>> n;
    dane<< "ilosc wejsc" <<n<< endl;
    cout<<"ilosc stanow okreslonych"<<endl;
    cin>> p;
    dane<<"ilosc stanow okreslonych"<<p<<endl;
    int** uklad = tworzenieUkladu(n,1,p);
    wyswietlUklad(uklad,n,1,p);
    mux(uklad,n,p,0,1);
    usuwanieUkladu(uklad,p);
    bool powtorzycCzyNie;
    cout<<"Jezeli chcesz powtorzyc wcisnij 0, jezeli chcesz zamknac program wcisnij 1"<<endl;
    cin>>powtorzycCzyNie;
    if(powtorzycCzyNie==1) break;
    }
    dane.close();
    return 0;
}

 

komentarz zamknięcia: Udało mi się rozwiązać problem.
komentarz 4 maja 2019 przez RafalS VIP (122,820 p.)
Pozaznaczaj w kodzie miejsca o których wspominasz i najlepiej pokaż dokładnie co się stało a czego się spodziewałeś.
komentarz 4 maja 2019 przez mefiak Nowicjusz (120 p.)
Dzięki za chęć pomocy, ostatecznie udało mi się rozwiązać problem, który był tak strasznie błachy, że aż głupio... Po 10 godzinach zastanawiania się o co chodzi okazało się, że funkcja do wyświetlania układów robi to źle, a cała reszta programu działa jak powinna. Nie wiem czy bardziej się ciesze, że znalazłem problem, czy bardziej mnie to irytuje xd

1 odpowiedź

0 głosów
odpowiedź 4 maja 2019 przez inny_sub Obywatel (1,120 p.)
Spróbuj rozbić swój problem na kilka mniejszych aż dojdziesz do sedna sprawy (2-3 instrukcji). Wyślij wtedy kod, bo te 200 linijek się ciężko czyta.
komentarz 4 maja 2019 przez mefiak Nowicjusz (120 p.)
Bardzo się cieszę, że chcesz pomóc, ale udało mi się naprawić to co było nie tak. nie wiem jak odpowiedzieć na 2 komentarze na raz, ale opisałem to w odpowiedzi powyżej, dzięki wielkie za chęci!

Podobne pytania

0 głosów
0 odpowiedzi 133 wizyt
pytanie zadane 28 stycznia 2022 w C i C++ przez danielch Użytkownik (660 p.)
0 głosów
1 odpowiedź 215 wizyt
pytanie zadane 19 kwietnia 2020 w C i C++ przez julsonem Nowicjusz (120 p.)
+1 głos
2 odpowiedzi 1,107 wizyt
pytanie zadane 15 kwietnia 2018 w C i C++ przez Stasq Nowicjusz (150 p.)

92,768 zapytań

141,691 odpowiedzi

320,508 komentarzy

62,106 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...