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;
}