Nie wyswietla sie tablica

0
 #include<iostream>
#include<cstdlib>
#include<cstring>
using namespace std;

//FUNKCJA MNOZENIE 2 CIAGOW BITOWYCH
char *mnoz(char ciag1[4], char ciag2[4]){
	char suma[4][7];
	char wynik[8];
	int a, b;

	for (a = 0; a < 4; a++){
		for (b = 0; b < 7; b++){
			if (a > b)suma[a][b] = '0';
			else if(b-a>=0 && b-a<4) suma[a][b] = ((ciag1[b-a] - '0') * (ciag2[b - a] - '0')) + '0';
			else suma[a][b] = '0';
		}
	}

	for (a = 0; a < 7; a++){
		wynik[a] = 0;
		for (b = 0; b < 4; b++){
			wynik[a] += suma[b][a]-'0';
		}
		wynik[a] = (wynik[a] % 2)+'0';
	}
	wynik[7]='\0';
	return wynik;
}

//FUNKCJA DODAWANIE 2 CIAGOW BITOWYCH
char *dod(char ciag1[5], char ciag2[5]){
	char wynik[6];
	int i;
	for(i=0;i<5;i++){
	wynik[i]=(ciag1[i]-'0'+ciag2[i]-'0')%2+'0';
	}
	wynik[5]='/0';
	return wynik;
}

int main(void){
	char test[5] = "1011";
	char test2[5]="1111";
	int i;
	char *wynik;
	wynik=(char*)malloc(sizeof(*wynik)*8);
	wynik=mnoz(test, test2);
	/*wynik=dod(test,test2);*/
	for(i=0;i<8;i++){
	cout<<wynik[i];
	}

	system("pause");
	return 0;
}

Dlaczego wynik nie jest wyswietlany, debbuger pokazuje ze funkcja zwraca prawidłową wartosc.

2

Twoja tablica wynik jest utworzona LOKALNIE na STOSIE wewnątrz funkcji. Po wyjściu z tej funkcji automatycznie pamięć ta zostaje zwolniona i twoja tablica znika. Musisz alokować pamięć dynamicznie albo przekazac do funkcji tablicę zaalokowaną wcześniej, przed wywołaniem funkcji.

0
char wynik[6];
...
return wynik;

wynik to jakaś lokalna tablica, która przestanie poprawnie istnieć po zakończeniu funkcji. W C nie możesz zwracać tablic w ten sposób. Nawet gdyby to było dozwolone, to masz inny poważny błąd:

wynik=(char*)malloc(sizeof(*wynik)*8);
wynik=mnoz(test, test2);

Alokujesz pamięć, a potem wyrzucasz wskaźnik, żeby wskazać na inny obszar pamięci. Wyciek. Poza tym gdzie jest free?
Rozwiązaniem jest przekazanie do funkcji dod() wskaźnika do alokowanej pamięci i operowanie na niej zamiast lokalnej tablicy.

0

Malutka modyfikacja

 #include<iostream>
#include<cstdlib>
#include<cstring>
#include <array>
using namespace std;
 
//no cześć
array<char, 8> mnoz(char ciag1[4], char ciag2[4]){
    char suma[4][7];
    array<char, 8> wynik;
    int a, b;
 
    for (a = 0; a < 4; a++){
        for (b = 0; b < 7; b++){
            if (a > b)suma[a][b] = '0';
            else if(b-a>=0 && b-a<4) suma[a][b] = ((ciag1[b-a] - '0') * (ciag2[b - a] - '0')) + '0';
            else suma[a][b] = '0';
        }
    }
 
    for (a = 0; a < 7; a++){
        wynik[a] = 0;
        for (b = 0; b < 4; b++){
            wynik[a] += suma[b][a]-'0';
        }
        wynik[a] = (wynik[a] % 2)+'0';
    }
    wynik[7]='\0';
    return wynik;
}
 
int main(void){
    char test[5] = "1011";
    char test2[5]="1111";
    int i;
    //no cześć
    auto wynik=mnoz(test, test2);
    /*wynik=dod(test,test2);*/
    for(i=0;i<8;i++){
    cout<<wynik[i];
    }
    return 0;
}

wynik: 1101001
Zanim ktoś się przyczepi: tak, w tagach jest C++; Widać to też po nagłówkach

0

Mógłbys mi wytlumczyc jeszcze czym jest "array<char, 8>"
ii przed wynikiem "auto"?
dziekuje za pomoc

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