nanoant20 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ł? #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 ); show_tab( tab2, TABELEMENTS2 ); show_tab( tab3, TABELEMENTS3 ); show_tab( tab4, TABELEMENTS4 ); show_tab( tab5, TABELEMENTS5 ); 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 ] << " "; } cout << endl; for( unsigned int i = 0; i < sizeof tab5 / sizeof tab5[ 0 ]; i++ ) { cout << tab5[ i ] << " "; } cout << endl; koniec(); return 0; }
Żle skonstruowałem ta druga pętle for. 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. for( unsigned int i = 0; i < sizeof tab1 / sizeof tab1[ 0 ]; i++ ) { cout << tab1[ i ] << " "; }
|
|
pekfos |
» 2017-08-06 15:24:00 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. |
|
nanoant20 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! |
|
pekfos |
» 2017-08-06 15:47:08 Jakiego typu twoim zdaniem jest tab[i]? |
|
nanoant20 Temat założony przez niniejszego użytkownika |
» 2017-08-06 15:58:59 Ja wiem, że tą drugą pętle źle skonstruowałem. |
|
pekfos |
» 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. |
|
Monika90 |
» 2017-08-06 16:09:22 #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'; } }
|
|
nanoant20 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. |
|
« 1 » 2 |