• 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
514 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 123 wizyt
pytanie zadane 28 stycznia 2022 w C i C++ przez danielch Użytkownik (660 p.)
0 głosów
1 odpowiedź 203 wizyt
pytanie zadane 19 kwietnia 2020 w C i C++ przez julsonem Nowicjusz (120 p.)
+1 głos
2 odpowiedzi 1,087 wizyt
pytanie zadane 15 kwietnia 2018 w C i C++ przez Stasq Nowicjusz (150 p.)

92,455 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

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!

...