Jak uproscic iterowanie po tablicy statycznej?
Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Zarejestruj się!

Jak uproscic iterowanie po tablicy statycznej?

AutorWiadomość
Temat założony przez niniejszego użytkownika
Jak uproscic iterowanie po tablicy statycznej?
» 2017-08-06 15:10:50
Mam kilka tablic typu const *char
Prawidłowo działa wyświetlanie tablicy,
gdy przechodzę po niej wskaźnikiem
lub za pomocą funkcji show_tab lecz to mnie
nie satysfakcjonuje, ponieważ każda tablice
muszę wywoływać osobno.
Postanowiłem przejść przez tablice dwoma pętlami for,
lecz wychodzą śmieci, i nie wiem jak temu zaradzić.
Może ma ktoś jakiś pomysł?


C/C++
//Code::Blocks Wersja #:16.01! mingw32-gcc System#: Windows XP 32bit
#include <iostream>

#define TABELEMENTS ((unsigned)(sizeof(tab) / sizeof(char*)))
#define TABELEMENTS1 ((unsigned)(sizeof(tab1) / sizeof(char*)))
#define TABELEMENTS2 ((unsigned)(sizeof(tab2) / sizeof(char*)))
#define TABELEMENTS3 ((unsigned)(sizeof(tab3) / sizeof(char*)))
#define TABELEMENTS4 ((unsigned)(sizeof(tab4) / sizeof(char*)))
#define TABELEMENTS5 ((unsigned)(sizeof(tab5) / sizeof(char*)))
using namespace std;

const char * tab1[] = { "Piotr", "Pawel" };
const char * tab2[] = { "Tomasz", "Andrzej" };
const char * tab3[] = { "Szymon" };
const char * tab4[] = { "Mateusz" };
const char * tab5[] = { "Marek", "Jakub", "Lukasz" };
const char * tab[ 5 ] = { * tab1, * tab2, * tab3, * tab4, * tab5 };

void show_tab( const char ** tab, const int n )
{
    for( int i = 0; i < n; i++ )
    {
        cout << tab[ i ] << " ";
    }
    cout << endl;
}

void koniec()
{
    cout << endl << "..........Koniec Programu.........." << endl;
    cin.get();
    cin.get();
}
int main()
{
    cout << "TABELEMENTS :" << TABELEMENTS << " sizeof tab " << sizeof tab << endl;
    cout << "TABELEMENTS1 :" << TABELEMENTS1 << " sizeof tab1 " << sizeof tab1 << endl;
    cout << "TABELEMENTS2 :" << TABELEMENTS2 << " sizeof tab2 " << sizeof tab2 << endl;
    cout << "TABELEMENTS3 :" << TABELEMENTS3 << " sizeof tab3 " << sizeof tab3 << endl;
    cout << "TABELEMENTS4 :" << TABELEMENTS4 << " sizeof tab4 " << sizeof tab4 << endl;
    cout << "TABELEMENTS5 :" << TABELEMENTS5 << " sizeof tab5 " << sizeof tab5 << endl;
   
    cout << endl << endl;
   
    const char * wsk = tab[ 0 ];
    for( int i = 0; i < 60; i++ )
    {
        cout << * wsk;
        wsk++;
    }
    cout << endl << endl;
   
    show_tab( tab1, TABELEMENTS1 ); //ok
    show_tab( tab2, TABELEMENTS2 ); //ok
    show_tab( tab3, TABELEMENTS3 ); //ok
    show_tab( tab4, TABELEMENTS4 ); //ok
    show_tab( tab5, TABELEMENTS5 ); //ok
   
    cout << endl << endl;
   
    for( unsigned int i = 0; i < sizeof tab / sizeof tab[ 0 ]; i++ )
    {
        for( unsigned int j = 0; j < sizeof tab + j / sizeof( tab + j )[ 0 ]; j++ )
        {
            cout << tab[ i ][ j ] << " ";
        }
        cout << endl;
    }
   
    cout << endl << endl;
   
    for( unsigned int i = 0; i < sizeof tab1 / sizeof tab1[ 0 ]; i++ )
    {
        cout << tab1[ i ] << " "; //ok
    }
   
    cout << endl;
    for( unsigned int i = 0; i < sizeof tab5 / sizeof tab5[ 0 ]; i++ )
    {
        cout << tab5[ i ] << " "; //ok
    }
   
    cout << endl;
   
   
    koniec();
    return 0;
}

Żle skonstruowałem ta druga pętle for.

C/C++
for( unsigned int i = 0; i < sizeof tab / sizeof tab[ 0 ]; i++ )
{
    for( unsigned int j = 0; j < sizeof tab + j / sizeof( tab + j )[ 0 ]; j++ )
    {
        cout << tab[ i ][ j ] << " ";
    }
    cout << endl;
}


Gdy odnosze sie do jednej tablicy jest ok.

C/C++
for( unsigned int i = 0; i < sizeof tab1 / sizeof tab1[ 0 ]; i++ )
{
    cout << tab1[ i ] << " "; //ok
}
P-163855
» 2017-08-06 15:24:00
C/C++
sizeof tab + j / sizeof( tab + j )[ 0 ]
Co to za bzdury? Priorytety operatorów! Od kiedy a + b / c to to samo co (a + b) / c? Do tego nie łapiesz w ogóle, co robi sizeof. Ten operator zwraca rozmiar typu operandu, ale sam operand nie jest obliczany, a więc wartości zmiennych nie wpłyną nigdy na wynik. A nawet gdyby to wszystko było poprawne, to j jest iteratorem pętli, w której masz ten warunek, więc ta pętla i tak by nie działała poprawnie.

Gdy odnosze sie do jednej tablicy jest ok.
Bo tab1 jest tablicą, a tab[0] nią nie jest.
P-163856
Temat założony przez niniejszego użytkownika
» 2017-08-06 15:34:41
sizeof(int) – zwraca rozmiar typu int w bajtach
sizeof buffer – zwraca rozmiar tablicy w bajtach

Mogę stąd bardzo łatwo wyciągnąć ilość elementów z tablicy.
Wystarczy podzielić przez rozmiar pojedynczego elementu!
P-163857
» 2017-08-06 15:47:08
Jakiego typu twoim zdaniem jest tab[i]?
P-163858
Temat założony przez niniejszego użytkownika
» 2017-08-06 15:58:59
Ja wiem, że tą drugą pętle źle skonstruowałem.
P-163859
» 2017-08-06 16:05:10
Nie wątpię. W końcu o tylu błędach w tej pętli ci napisałem. To skoro wiesz, to możesz zacząć poprawiać. Potem wrócimy do tego, czy da się tą pętlę poprawnie sformułować bez dodatkowych zmian w kodzie.
P-163860
» 2017-08-06 16:09:22
C/C++
#include <iostream>
#include <cstddef>

struct ArrayRef
{
    const char * const * array;
    std::size_t size;
   
    template < std::size_t size >
    ArrayRef( const char * const( & array )[ size ] )
        : array( array )
         , size( size )
    { }
};

const char * tab1[] = { "Piotr", "Pawel" };
const char * tab2[] = { "Tomasz", "Andrzej" };
const char * tab3[] = { "Szymon" };
const char * tab4[] = { "Mateusz" };
const char * tab5[] = { "Marek", "Jakub", "Lukasz" };
ArrayRef tab[] = { tab1, tab2, tab3, tab4, tab5 };

int main()
{
    for( const auto & a: tab )
    {
        for( std::size_t i = 0; i < a.size; ++i )
             std::cout << a.array[ i ] << ' ';
       
        std::cout << '\n';
    }
}

P-163861
Temat założony przez niniejszego użytkownika
» 2017-08-06 16:11:07
oki. posiedzę nad tym jak to rozwiązac . Zastanawiam się jeszcze czy na końcu każdej tablicy dodać 0 lub NULL?

Dzięki Monika90 za kod. Nie wpadłbym na takie rozwiązanie.
P-163862
« 1 » 2
 Strona 1 z 2Następna strona