Dlaczego w C++ nie mogę użyć zakresowego for na tablicy

wazer | 2021-02-17 10:25:17 UTC | #1

Czemu nie można używać zakresowego for w linii 7
#include

using namespace std;

void coutContentOfTheArray(const char source[]) {
    /*
    for(auto & elem : source){
        cout<<elem;
        if(elem == 0)cout<<endl;
    }
     */
    for (int i = 0; i <= 100; ++i) {
        cout << source[i];
        //if(source[i]== 0)cout<<i<<':'<<source[i]<<endl; 
    }
    cout << endl;
}

void copyArrayWordsEvenOdd(const char source[], char evenWords[], char oddWords[]) {

    int iSourceCharacterNumber = 0;
    int iOddCharacterNumber = 0;
    int iEvenCharacterNumber = 0;
    bool isEven = true;
    do {
        if (source[iSourceCharacterNumber] == ' ') {
            if (isEven) {
                evenWords[iEvenCharacterNumber] = source[iSourceCharacterNumber];
                ++iEvenCharacterNumber;
            } else {
                oddWords[iOddCharacterNumber] = source[iSourceCharacterNumber];
                ++iOddCharacterNumber;
            }
            ++iSourceCharacterNumber;
            isEven = !isEven;
        }
        if (isEven) {

            evenWords[iEvenCharacterNumber] = source[iSourceCharacterNumber];
            ++iEvenCharacterNumber;
            ++iSourceCharacterNumber;
        } else {
            oddWords[iOddCharacterNumber] = source[iSourceCharacterNumber];
            ++iSourceCharacterNumber;
            ++iOddCharacterNumber;
        }


    } while (source[iSourceCharacterNumber] != 0);
    evenWords[iEvenCharacterNumber] = 0;
    oddWords[iOddCharacterNumber] = 0;
}


int main() {
    char source[100] = {"pierwszy drugi trzeci czwarty piaty"};
    char evenWords[100]{0};
    char oddWords[100]{0};
    /*
    for(auto elem : source){
        cout<<elem;
        if(elem == 0)cout<<endl;
    }
     */
    copyArrayWordsEvenOdd(source, evenWords, oddWords);
    //source[14]=5;
    //cout<<source[14];//
    coutContentOfTheArray(oddWords);
}

Nieznajomy11 | 2020-11-14 17:13:18 UTC | #2

[quote=”wazer, post:1, topic:16729”]
i czemu nie można używać zakresowego for w linii 7
[/quote]

Podczas przekazywania tablicy jako parametr jest ona traktowana jako wskaźnik. Tablice z zasady są nieciekawe w używaniu. Przyszły do C++ prosto z C.

Dlatego właśnie używa się takich rzeczy jak std::vector. Można to jednak “obejść” używając template, np. w taki sposób:

#include <iostream>

template <typename T>
void arrayTest(T& source) {
    for (auto &elem : source) {
        std::cout << elem;
    }
}

int main() {
    char source[100] = {"pierwszy drugi trzeci czwarty piaty"};
    arrayTest(source);
    return 0;
}

system | 2021-02-17 10:31:43 UTC | #3

Ten temat został automatycznie zamknięty 32 dni po ostatnim wpisie. Tworzenie nowych odpowiedzi nie jest już możliwe.