Przekazywanie wartości przez funkcję(C)

0

Pytanie jest następujące, dlaczego tablica wartości zmiennej klucz[1][1][0] wywala mi -3,-3,-3,-3, mimo iż w funkcji wartości są wyliczane prawidłowo, alokuję dynamicznie pamięc w funkcji, oraz inne elementy np klucz[1][0][0] daje już dobre wyniki, wszystkie inne tablice klucz[1] mają prawidłowe wartości, a jedynie ta jedna, opisana powyżej ma jakieś dziwne wartości. Dzięki, poniżej kod

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char* xor(const char *klucz1,const char *klucz2){
	int a;
	char *wynik=(char*)malloc(sizeof(*wynik)*4);
	for(a=0;a<4;a++){
		wynik[a]=(klucz1[a]+klucz2[a]-2*'0')%2 +'0';
	}
	return wynik;
}

void tworzenie(char macierz[2][2][4],char *k0){
	int a,b,c;
	for(a=0;a<2;a++){
		for(b=0;b<2;b++){
			for(c=0;c<4;c++){
				macierz[0][0][c]=k0[c];
				macierz[0][1][c]=k0[c+4];
				macierz[1][0][c]=k0[c+8];
				macierz[1][1][c]=k0[c+12];
			}
		}
	}
}

int main(void){
	char klucz[3][2][2][4];

	char *k0="1001111001110110";
	tworzenie(klucz[0],k0);
	strcpy(klucz[1][0][0],xor(xor(sbox(0,klucz[0][1][1]),"0001"),klucz[0][0][0]));
	strcpy(klucz[1][1][0],xor(klucz[0][1][0],klucz[1][0][0]));
	strcpy(klucz[1][0][1],xor(klucz[0][0][1],klucz[1][1][0]));
	strcpy(klucz[1][1][1],xor(klucz[0][1][1],klucz[1][0][1]));
	return 0;
}
0

Nie wiem czy prawidłowo, co masz w tym sboku ?

0

Dodam tylko, że sbox zwraca dobrą wartość więc mniejsza o tą funkcję, ale proszę kodzik.

 //FUNKCJA SBOX
//TYP=1-SZYFROWANIE
//TYP=2-DESZYFROWANIE
char* sbox(int typ,char *ciag1){
	char *ciag=(char*)malloc(sizeof(*ciag)*4);
	//typ E
	if(typ==0){
		if(ciag1[0]=='0'){
			if(ciag1[1]=='0'){
				if(ciag1[2]=='0'){
					if(ciag1[3]=='0')strcpy(ciag,"1110");
					else strcpy(ciag,"0100");
				}
				else{
					if(ciag1[3]=='0')strcpy(ciag,"1101");
					else strcpy(ciag,"0001");
				}
			}
			else{
				if(ciag1[2]=='0'){
					if(ciag1[3]=='0')strcpy(ciag,"0010");
					else strcpy(ciag,"1111");
				}
				else{
					if(ciag1[3]=='0')strcpy(ciag,"1011");
					else strcpy(ciag,"1000");
				}
			}
		}
		else{
			if(ciag1[1]=='0'){
				if(ciag1[2]=='0'){
					if(ciag1[3]=='0')strcpy(ciag,"0011");
					else strcpy(ciag,"1010");
				}
				else{
					if(ciag1[3]=='0')strcpy(ciag,"0110");
					else strcpy(ciag,"1100");
				}
			}
			else{
				if(ciag1[2]=='0'){
					if(ciag1[3]=='0')strcpy(ciag,"0101");
					else strcpy(ciag,"1001");
				}
				else{
					if(ciag1[3]=='0')strcpy(ciag,"0000");
					else strcpy(ciag,"0111");
				}
			}
		}
	}
	//typ D-int typ=1
	else{
		if(ciag1[0]=='0'){
			if(ciag1[1]=='0'){
				if(ciag1[2]=='0'){
					if(ciag1[3]=='0')strcpy(ciag,"1110");
					else strcpy(ciag,"0011");
				}
				else{
					if(ciag1[3]=='0')strcpy(ciag,"0100");
					else strcpy(ciag,"1000");
				}
			}
			else{
				if(ciag1[2]=='0'){
					if(ciag1[3]=='0')strcpy(ciag,"0001");
					else strcpy(ciag,"1100");
				}
				else{
					if(ciag1[3]=='0')strcpy(ciag,"1010");
					else strcpy(ciag,"1111");
				}
			}
		}
		else{
			if(ciag1[1]=='0'){
				if(ciag1[2]=='0'){
					if(ciag1[3]=='0')strcpy(ciag,"0111");
					else strcpy(ciag,"1101");
				}
				else{
					if(ciag1[3]=='0')strcpy(ciag,"1001");
					else strcpy(ciag,"0110");
				}
			}
			else{
				if(ciag1[2]=='0'){
					if(ciag1[3]=='0')strcpy(ciag,"1011");
					else strcpy(ciag,"0010");
				}
				else{
					if(ciag1[3]=='0')strcpy(ciag,"0000");
					else strcpy(ciag,"0101");
				}
			}
		}
	}
	return ciag;
}
0

Wywal to poczytaj o operacjach bitowych i zrób od nowa.

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