ricardo83 Temat założony przez niniejszego użytkownika |
Błąd podczas przekazywania tablicy do funkcji » 2010-07-26 14:55:21 Witam Tym razem mam problem z przekazywaniem do funkcji wskaznikow do tablicy. Kod wyglada nastepujaco i kompilator nie zglasza zadnych bledow ale wynik na konsoli prezentuje jakies dziwne symbole. Program ktory napisalem ma posortowac tablice znakow. Technika sortowania-babelkowe. #include <cstdlib> #include <iostream>
using namespace std;
void zamiana( char * a, char * b );
int main( int argc, char * argv[] ) { char tablica[ 10 ] = "janeczek"; char * w = tablica; char * x =& tablica[ 1 ]; printf( "Prezentacja wskaznikow\n %c %c\n", * w, * x ); int i = 0; while( tablica[ i ] != '\0' ) { zamiana( w, x ); i++; w = w + 1; x = x + 1; } i = 0; printf( "Prezentacja tablicy po:\n" ); while( tablica[ i ] != '\0' ) { printf( "%c\n", tablica[ i ] ); i++; } system( "PAUSE" ); return EXIT_SUCCESS; }
void zamiana( char * a, char * b ) { char temp; while( * a != '\0' ||* b != '\0' ) { if( * a >* b ) { temp =* a; * a =* b; * b = temp; } * a++; * b++; } }
Prosze o pomoc bo pewnie jest tu jakis babol ale nie moge go znalezc. pozdrawiam |
|
programator |
» 2010-07-26 15:46:12 Nie potrafię wskazać błędu:D ale ja używam takiej funkcji sortującej: void sortuj( int * tab, int ile ) { int temp; for( int i = 0; i < ile - 1; i++ ) { for( int i = 0; i < ile - 1; i++ ) { if( tab[ i ] > tab[ i + 1 ] ) { temp = tab[ i + 1 ]; tab[ i + 1 ] = tab[ i ]; tab[ i ] = temp; } } } }
Zmienisz int na char i gotowe:) |
|
VND |
» 2010-07-26 18:42:23 Ciut poprawione: #include <cstdlib> #include <cstdio> #include <iostream>
using namespace std;
void zamiana( char * a, char * b );
int main( int argc, char * argv[] ) { char tablica[ 10 ] = "janeczek"; char * w = tablica; char * x =& tablica[ 1 ]; printf( "Prezentacja wskaznikow\n %c %c\n", * w, * x ); int i = 0; while( tablica[ i ] != '\0' ) { zamiana( w, x ); i++; } i = 0; printf( "Prezentacja tablicy po:\n" ); while( tablica[ i ] != '\0' ) { printf( "%c\n", tablica[ i ] ); i++; } system( "PAUSE" ); return EXIT_SUCCESS; }
void zamiana( char * a, char * b ) { char temp; while( * a != '\0' && * b != '\0' ) { if( * a >* b ) { temp =* a; * a =* b; * b = temp; } a++; b++; } }
a tak można odrobinkę szybciej, gdy nie została wykonana żadna zamiana liter można skończyć sortowanie. Nie trzeba też wypisywać tablicy po znaku. #include <cstdlib> #include <iostream> #include <cstdio>
using namespace std;
bool zamiana( char * a, char * b );
int main( int argc, char * argv[] ) { char tablica[ 10 ] = "janeczek"; char * w = tablica; char * x =& tablica[ 1 ]; while( zamiana( w, x ) != false ); printf( "Prezentacja tablicy po:\n" ); cout << tablica << endl; system( "PAUSE" ); return EXIT_SUCCESS; }
bool zamiana( char * a, char * b ) { bool byla_zmiana = false; char temp; while( * b != 0 ) { if( * a >* b ) { temp =* a; * a =* b; * b = temp; byla_zmiana = true; } a++; b++; } return byla_zmiana; }
|
|
ricardo83 Temat założony przez niniejszego użytkownika |
» 2010-07-27 11:07:58 dzieki za pomoc :) rzeczywiscie brak inkrementacji wskaznikow w glownej petli sprawia ze program dziala zgodnie z oczekiwania :)
dzieki za poswiecony czas :)
Pozdrawiam |
|
ricardo83 Temat założony przez niniejszego użytkownika |
» 2010-07-28 11:06:54 jeszcze mam pytanko odnosnie petli while w funkcji zamiana. czemu jej zachowanie jest zgola nieoczekiwane (pojawiaja sie krzaczki w drukowanej tablicy), jesli zamienie && na || ? Pozdrawiam |
|
lenrokskate |
» 2010-07-28 13:23:37 ponieważ && to operator AND czyli polskie "i" a operator || to OR czyli polskie "lub" |
|
ricardo83 Temat założony przez niniejszego użytkownika |
» 2010-07-28 13:39:58 tak wiem co oznaczaja te dwa operatory :) ale zastanawiam sie czemu petla while w funkcji void zamiana( char * a, char * b ) { char temp; while( * a != '\0' && * b != '\0' ) { if( * a >* b ) { temp =* a; * a =* b; * b = temp; } a++; b++; } } musi zostac przerwana dopiero w momencie kiedy obie wartosci natrafiaja na znak \0 . W momencie gdy mamy operator || petla powinna przerwac swoje dzialanie gdy jedna z wartosci trafia na \0 ale tak sie nie dzieje i drukuje jakies dziwne krzaczki. Czy ktos moze wie dlaczego tak sie dzieje? Pozdrawiam |
|
VND |
» 2010-07-28 17:17:57 To nie tak. while( * a != '\0' && * b != '\0' ) w tym warunku masz znak różności ( != ) czyli powinieneś go odczytać: wykonuj pętlę while gdy *a i *b są różne od znaku \0 (koniec tekstu) Czyli pętla będzie działać tak długo, aż któryś ze wskaźników trafi na znak kończący tekst. Przy or (||) do spełnienia warunku wystarczy, że tylko jedna wartość jest prawdą. Podczas pierwszego (i jedynego) przebiegu pętli while, wskaźnik a dojdzie do litery "z" a wskaźnik b do znaku końca tekstu (czyli 0). Zero jest mniejsze od 122 (litera Z) więc zostaną zamienione miejscami. W tym momencie pętla zaczyna pracować poza tekstem "janeczek" i tak będzie pracowicie zamieniać kolejne znaki, nadpisując nie swoją pamięć, dopóki się nie wysypie. Dodatkowo w tym przypadku sprawdzanie a jest niepotrzebne bo b wyprzedza a o jeden znak.Tak więc b zawsze wcześniej będzie pokazywać na koniec tekstu. Mówiąc ogólnie pętla while działa dopóki warunek jest spełniony. A i jeszcze jedno char tablica[ 10 ] = "janeczek" nie zeruje pozostałych miejsc w tabeli, które nie są zajęte przez litery. Masz tylko pewność, że tablica[8]=0, tablica[9] może być zerem, ale nie musi. |
|
« 1 » 2 |