Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Błąd podczas przekazywania tablicy do funkcji

Ostatnio zmodyfikowano 2010-07-28 20:28
Autor Wiadomość
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.

C/C++
#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
P-20166
programator
» 2010-07-26 15:46:12
Nie potrafię wskazać błędu:D
ale ja używam takiej funkcji sortującej:
C/C++
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:)
P-20170
VND
» 2010-07-26 18:42:23
Ciut poprawione:
C/C++
#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.
C/C++
#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;
}
P-20177
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
P-20196
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
P-20213
lenrokskate
» 2010-07-28 13:23:37
ponieważ && to operator AND czyli polskie "i" a operator || to OR czyli polskie "lub"
P-20222
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
C/C++
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
P-20229
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.
P-20241
« 1 » 2
  Strona 1 z 2 Następna strona