Serwis został przeniesiony pod nową domenę: http://cpp0x.pl/
PowrótPowrótHistoria odwiedzonych stron
AutorWiadomość
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: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 gotowewesoły

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 wesoły
rzeczywiscie brak inkrementacji wskaznikow w glownej petli sprawia ze program dziala zgodnie z oczekiwania wesoły

dzieki za poswiecony czas wesoły

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 wesoły
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.

12



Statystyki tematuOstatnio przeczytali
Czytało użytkowników:23ricardo83, 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



PowrótPowrótHistoria odwiedzonych stron
Panel Logowania
Login:
Hasło:

Użytkowników
Obecnie aktywnych:13
Zalogowanych:0
Zarejestrowanych:4367
Ostatnie 24h:539
Non-cookie 24h:2688
Wszystkich:214122
Ostatnia Aktualizacja
2010-09-01 19:27:34 (4 dni temu)
Ostatnio aktywni
wiew33 min
Koni44 min
Mateusz12447 min
fish1373 min
wiewiorka87 min
lenrokskate8 godz
dmx8111 godz
steckel11 godz
pixelmaster15 godz
maciejo15 godz
jurasnumeras15 godz
Imperator_Edi16 godz

Wynajem Sopot - wakacje
Pokój 2 osobowy 130zł/doba;
Lokalizacja: Sopot


O portaluArchiwumHistoriaIndeksRegulaminWyszukiwarkaLinki
Kurs HTML - strona WWW za darmoRestauracja "ATOL" - SopotValid HTML 4.01 TransitionalValid CSS!HTML CSS JavaScript FLASH PHP MySQL