Data: 2010-07-26 14:55:21
ricardo83 | Błąd podczas przekazywania tablicy do funkcji
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
| Data: 2010-07-26 15:46:12
programator |
Nie potrafię wskazać błędu 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
| Data: 2010-07-26 18:42:23
VND |
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++; // w++; niepotrzebne // x++; niepotrzebne }
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') // a jest niepotrzebne b szybciej wyjdzie poza tablicę, && zamiast || {
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); // lub while(zamiana(w,x));
printf("Prezentacja tablicy po:\n"); cout<<tablica<<endl; // wypisanie tablicy
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; }
| Data: 2010-07-27 11:07:58
ricardo83 |
dzieki za pomoc  rzeczywiscie brak inkrementacji wskaznikow w glownej petli sprawia ze program dziala zgodnie z oczekiwania 
dzieki za poswiecony czas 
Pozdrawiam | Data: 2010-07-28 11:06:54
ricardo83 |
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 | Data: 2010-07-28 13:23:37
lenrokskate |
ponieważ && to operator AND czyli polskie "i" a operator || to OR czyli polskie "lub" | Data: 2010-07-28 13:39:58
ricardo83 |
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') // a jest niepotrzebne b szybciej wyjdzie poza tablicę, && zamiast || {
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 | Data: 2010-07-28 17:17:57
VND |
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.
| |
| Statystyki tematu | Ostatnio przeczytali |
|---|
| Czytało użytkowników: | 23 | ricardo83, maciejo, jacek_k, OSA_PL, VND, lenrokskate, programator, madmike44, SeaMonster131, ison, TheLukon, michalp, Iname (√ιק), malan | | Przeczytało użytkowników: | 14 | | Czytało osób ogólnie: | 59 | | Przeczytało osób ogólnie: | 27 |
| Ostatnia Aktualizacja| 2010-09-01 19:27:34 (4 dni temu) | |
| Ostatnio aktywni |
|---|
| wiew | 33 min | | Koni | 44 min | | Mateusz124 | 47 min | | fish13 | 73 min | | wiewiorka | 87 min | | lenrokskate | 8 godz | | dmx81 | 11 godz | | steckel | 11 godz | | pixelmaster | 15 godz | | maciejo | 15 godz | | jurasnumeras | 15 godz | | Imperator_Edi | 16 godz |
|