kt1117 Opublikowano 23 Września 2011 Udostępnij Opublikowano 23 Września 2011 Witam. Próbuję posegregować tablicę znaków alfabetycznie. Wymyśliłem taki kod: #include <iostream> #include <string> using namespace std; string n[150]; int nn; string temp; bool zmiana; void sort(int x=0) { if (n[x]>n[x+1]) { temp=n[x]; n[x]=n[x+1]; n[x+1]=temp; zmiana=true; } if (x<nn-1) { sort(x++); } else { if (zmiana==true) { zmiana=false; sort(); } } } int main() { cin>>nn; for(int x=0;x<nn;x++) { cin >> n[x]; } sort(); for (int z=0;z<nn;z++) { cout<<n[z]<<endl; } return 0; } Niestety program kończy działanie bez podania wyniku z kodem błędu:-1073741819 Podejrzewam, że to przez tą zagmatwaną referencję, ale nie jestem pewien. Mógłby mi ktoś powiedzieć o co chodzi? Napisałem sobie ten program iteracyjnie i dostałem za niego 100 pkt, ale mimo to chciałbym się dowiedzieć, czemu ten nie działa. Czy jest to przeładowanie stosu? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Will Opublikowano 23 Września 2011 Udostępnij Opublikowano 23 Września 2011 else { if (zmiana==true) { zmiana=false; sort(); } } } To się wykona jak x==nn-1 więc co dalej chcesz sortować? temp=n[x]; n[x]=n[x+1]; n[x+1]=temp; zmiana=true; Dlaczego wybierasz najwolniejszą wersję jaką zna świat? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
kt1117 Opublikowano 23 Września 2011 Autor Udostępnij Opublikowano 23 Września 2011 Całe wymyślałem sam, niczym się nie sugerowałem. Miałem taki zamysł, że jeśli po przejściu przez pętlę coś się zmieniło, to mogło zniszczyć inny układ. Chodzi o coś takiego. 5143 1534 1354 1345 Czyli jeśli coś się zmieniło, sprawdza czy już jest dobrze posegregowane. Jeśli jest dobrze posegregowane to zmienna ma wartość false i program kończy działanie. Z tym drugim to da się inaczej? E:W innym muszę zamienić string na float i spowrotem. Robię to za pomocą atof i sstream. Czy są szybsze metody? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Will Opublikowano 23 Września 2011 Udostępnij Opublikowano 23 Września 2011 Ok, w takim razie jaki jest warunek zakończenia tej funkcji? Nie ma go, będzie się zapętlać w nieskończoność więc jak to ma działać? Z tym drugim to da się inaczej? Zakładając, że: for(int x=0;x<nn;x++) { cin >> n[x]; } Wykona się maksymalną ilość 150: 150 razy malloc! i to w pętli a najważniejsza zasada to: "Keep heap allocations to a minimum, and never allocate from the heap within a loop" Potem przy każdym porównaniu 3 przypisania. Skorzystaj z tablic statycznych. Zrób jedną na dane a drugą dla indeksów, porównuj dane a modyfikuj tablice indeksów. Potem przy wypisywaniu: cout<<dataArray[indexArray ]; Wtedy zamiast 3 przypisań, które mogą składać się z setek elementów masz 3 przypisana zwykłych liczb. Nie wiem jak działa funkcja porównująca string'a ale napisz swoją dla tablicy char i sprawdzaj oczywisty wariant jak długość sekwencji czy co tam jeszcze wymyślisz żeby ograniczyć liczbę porównań. E: Jeśli masz tylko liczby i mieszczą się w jakimś long long czy co tam oferuje twój kompilator o największej pojemności to oczywiście z tego skorzystaj a nie baw się w tablicę. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
kt1117 Opublikowano 23 Września 2011 Autor Udostępnij Opublikowano 23 Września 2011 Czyli źle myślałem, że funkcja zakończy działanie gdy x=>nn-1 i zmiana=false? To już rozumiem czemu się zapętliło. Z tymi porównaniami też rozumiem, zapomniałem że działam na tablicach ukrytych w stringach. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się