Scalanie 2 tablic

0

Witam staram się zrobić scalanie 2 posortowanych tablic mam problem starałem się zaimplementować to co jest na Wiki na temat scalania jednak coś mi nie idzie mam coś takiego:

#include <stdio.h>
#include <stdlib.h>

int scalanie(int *tabA, int *tabB){
	int lenA, lenB,i=0,j=0,k,suma;
	lenA =  sizeof(tabA)/sizeof(int);
	lenB =  sizeof(tabB)/sizeof(int);
	suma = lenA + lenB;
	int tab[suma];
	while(k == suma){
		if (i == lenA){
			for(j; j == lenB; j++){
				tab[k+i]=tabB[j];
				k++;
			}
		}
		if (j == lenB){
			for(i; i == lenA; i++){
				tab[k+j]=tabA[i];
				k++;
			}
		}
		if(tabA[i]<=tabB[j]){
			tab[k] = tabA[i];
			i++;}
		else{
			tab[k] = tabB[j];
			j++;
		}
	k++;
	}
	return tab[suma];
};
main(){
int i, len, lenB, suma;
int tab[5] = {0,1,2,3,4};
int tabB[5] = {5,6,7,8,9};
len =  sizeof(tab)/sizeof(int);
lenB =  sizeof(tabB)/sizeof(int);
suma = len+lenB;
int tabW[suma];
tabW[suma] = scalanie(tab, tabB);
printf("Scalone tablice: ");
for(i = 0; i <=suma; i++){
	printf("%d, ", tabW[i]);
}
printf("\n");

}
 

i program zwraca mi coś takiego:

~/Pulpit/scalanie$ ./scalanie
Scalone tablice: -1075434544, 134513116, -1075434556, 11643508, 0, -1217295544, 1, 0, 1, 11643160, 129100401,  
 

Proszę o pomoc i z góry dziękuję
Pozdrawiam

0

sizeof(tabA) da zapewne 4, bo tyle miejsca zwykle zajmuje wskaźnik tak jak to zdefiniowałeś.

Moim zdaniem dobrze byłoby przekazać długość tablic w osobnych parametrach.
Deklaracja mogłaby wyglądać tak:

int * merge(int *tabA, int sizeA, int *tabB, int sizeB);

Dodatkowo warto pomyśleć o tym co będzie wynikiem tej funkcji.
O tablicach myślimy jako spójnych obszarach pamięci, więc przy scalaniu warto zaalokować tablicę rozmiaru sizeA + sizeB, obliczyć tam wynik i zwrócić wskaźnik na tę tablicę.

Edit:
teraz przeczytałem twojego kodu (face palm!) i trochę wskazówek:

  • w funkcji deklarujesz tablicę, w której zapamiętujesz wynik i po zakończeniu działania tej funkcji jest ona usuwana, więc wyniku nie odczytasz później
  • funkcja zwraca tab[suma] co jest przekroczeniem zaalokowanej tablicy i masz szczęście, że nie ma błędu, bo coś tam siedzi w pamięci i masz do tego dostęp (śmieć)
  • w funkcji głównej utworzyłeś tablicę tabW, która jakoś nie jest nigdzie wypełniana. Jak myślisz, kiedy tam się pojawią wyniki?
0

a po co przekazywać rozmiar? Ten program jest tylko pogladowy :) żeby pokazać co nie działa, rozmiary tablic zmieniają się w programie. Co może być przyczyną zwracania wartości takich? wygląda jakby nic się nie zmianiały te wartości w zainicjalizowanej tablicy

0

Właśnie wyedytowałem post powyżej, ale jeszcze podkreślę: w funkcji wyniki zbierasz w tablicy, która po zakończeniu działania funkcji jest kasowana. A zwracasz jednego inta, który jest śmieciem.

i taki kod:

int tabW[suma];
tabW[suma] = scalanie(tab, tabB);

jest bardzo błędny. Tablice są numerowane od 0, czyli największy index to suma-1. Funkcja scalanie zwraca jedną liczbą, którą przypisujesz pod tabW[suma], czyli komórkę za tablicą.

0

Dzięki za rozjaśnienie tematu. Tylko mam kolejne pytanie robię coś takiego

 
int sortuj(int *tab, int n){
	int i,j, temp;
	for(j=0; j<n-1; j++){
	for(i=0; i<n-1; i++){
		if(tab[i] > tab[i+1]){
		temp = tab[i];
		tab[i] = tab[i+1];
		tab[i+1] = temp;		
		}
	}
	}
	return tab[n];
};

dalej w programie

tabA[srA] = sortuj(tabA,srA); 

i wynik wyświetlany jest poprawnie. to przypadek?
W jaki sposób moge zapisać ten wynik posortowany do tablicy?

0

Co tam robi return tab[n];? Przecież pisałem, że tak nie można. Jeżeli działasz na tablicy to nic nie zwracaj. (void). Przecież w funkcji sortuj już wpisujesz prawidłowe wartości, więc wystarczy wywołać tę funkcję ''sortuj(...)';' i nie przypisywać nigdzie wyniku, bo nic nie zwraca.

Trochę marnujesz czas innych. Najpierw poczytaj jakąś książkę o C. Polecam Kernighan & Ritchie "Język ANSI C".

0

Dziękuję Ci za odpowiedź, jednak jeśli uważasz, że nie warto poświęcać czas to go nie poświęcaj

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