Pętla FOR(int i = 0)

0

Cześć, mam problem. Za każdym razem jak dotąd robiłem kilka pętli for w mainie to w każdym forze dawałem int i = 0, działało.
W tym programie muszę dać int i = 0; powyżej wszystkimi FOR'ami aby nie było błędu. Mało tego, dziwne, że jak dam int i = 0 powyżej wszystkimi FOR'ami to mogę dać jeszcze jeden int i = 0 w pierwszym FOR'ze i też działa. Czemu nie działa to kiedy daję int i = 0 w drugim forze gdzie są wi=tabint, wf=tabflo? Niżej kod programu
Chodzi mi o 3 miejsca oznaczone <---------------------------- w kodzie. W książce jedyny "int i = 0" znajdował się w pierwszym forze, w drugim było samo "i=0", no ale nie działa mi tak również.

int main()
{
    int i; < -------------------------------------- tu dalem int i bo inaczej nie dziala drugi for
    int *wi;
    float *wf;
    int tabint[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    float tabflo[10];

    wf = &tabflo[0];  // ustawienie wskaznika na poczatek tabflo

    for(int i=0;i<10;i++)  // zaladowanie tabflo wartosciami poczatkowymi czyli 1/10 2/10 3/10 ... 9/10   <----- tu moge dać int i=0, a jest to już wyżej zrobione.
    {
        *(wf++) = i / 10.0; // to inaczej *wf = i / 10.0; wf++;
    }

    cout << "Tresc tablic na poczatku\n";

    for(i=0,wi=tabint,wf=tabflo; i<10; i++){ // wypisanie tablic      <----- o tu nie moge dać int i = 0 takjakby te wi i wf to blokowały
        cout << i  << ") \t" << *wi << "\t\t\t\t" << *wf << endl;
        wi++;
        wf++;
    }
    /************nowe ustawienie wskaznikow**************/
    wi = &tabint[5];
    wf = tabflo + 2;
    /***********wpisanie do tablic kilkua nowych wartosci****/
    for(i=0;i<4;i++){
        *(wi++)= -222;
        *(wf++)= -777.5;
    }

    cout << "Nowa tresc tablic\n";
    wi = tabint;
    wf = tabflo;
    for(i=0;i<10;i++){
        cout << "tabint[" << i << "] = " << *(wi++) << "              tabflo[" << i << "] = " << *(wf++) << endl;
    }

    return 0;}
4

W języku C++ każda zmienna której używasz musi posiadać swoją deklarację, czyli miejsce gdzie określasz jakiego jest typu. Problem polega na tym, że istnieje tak zwane przykrywanie nazw. Może dla ilustracji:

int main() {
    int i = 5;
    {
        i = 4;
    }
    cout << i; // to będzie teraz 4
    // int i = 3;   -> to byłby błąd kompilacji
    i = 3;
    cout << i; // to będzie teraz 3
    {
        int i = 7; // to jest zupełnie nowa zmienna, której nazwa przykrywa starą
        cout << i; // to jest 7;
    }
    cout << i; // to będzie nadal 3
}

Jak zrobisz for (int i = 0; ...) to ta zmienna i będzie dostępna tylko wewnątrz bloku pętli for. Zatem jeśli nie ma zmiennej bezpośrednio o tej nazwie w mainie, to w każdym forze musisz zadeklarować zmienną i.

Edit: chyba jednak nie zrozumiałem z czym masz problem

2

Bo jak sobie w 2 pętli zrobisz int i, wi to deklarujesz wi typu int a wi ma być int*. Po prostu sobie przysłaniasz tamtą deklarację.

2

Problem nie jest specyficzny dla pętli for. Możesz chcieć np. zadeklarować kilka intów:

int a = 1;
int b = 2;
int c = 3;

Możesz to też zrobić w jednej linii:

int a = 1, b = 2, c = 3;

Problem polega na tym, że w forze, jeśli dasz i = 0, wi=tabint, to jest to interpretowane jak

i = 0;
wi=tabint;

Jeśli zaś dasz int i = 0, wi=tabint, to jest to interpretowane jak

int i = 0, wi=tabint;

czyli

int i = 0;
int wi=tabint;

i to nie ma sensu, bo tabint nie jest typu int.

0

@enedil: Tak, zakres ważności itp. to rozumiem. I tak jak mówisz zrobiłem wcześniej co nie działało. W każdym osobnym forze osobnie deklarowałem tego inta od razu inicjalizując. O dziwo nie działa, a po drugie błąd wyskakuje tylko w linijce zaznaczonej niżej "<------------------------------------". Błąd to
error: invalid conversion from 'int*' to 'int' [-fpermissive]|
error: invalid conversion from 'float*' to 'int' [-fpermissive]|
error: invalid type argument of unary '' (have 'int')|
error: invalid type argument of unary '
' (have 'int')|
||=== Build failed: 4 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

int main()
{

    int *wi;
    float *wf;
    int tabint[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    float tabflo[10];

    wf = &tabflo[0];  // ustawienie wskaznika na poczatek tabflo

    for(int i=0;i<10;i++)  // zaladowanie tabflo wartosciami poczatkowymi czyli 1/10 2/10 3/10 ... 9/10
    {
        *(wf++) = i / 10.0; // to inaczej *wf = i / 10.0; wf++;
    }

    cout << "Tresc tablic na poczatku\n";

    for(int i=0,wi=tabint,wf=tabflo; i<10; i++){ // wypisanie tablic  <------------------------------------------------------------------------------------  tu pokazuje kompilator błąd 
        cout << i  << ") \t" << *wi << "\t\t\t\t" << *wf << endl;
        wi++;
        wf++;
    }
    /************nowe ustawienie wskaznikow**************/
    wi = &tabint[5];
    wf = tabflo + 2;
    /***********wpisanie do tablic kilkua nowych wartosci****/
    for(int i=0;i<4;i++){  
        *(wi++)= -222;
        *(wf++)= -777.5;
    }

    cout << "Nowa tresc tablic\n";
    wi = tabint;
    wf = tabflo;
    for(int i=0;i<10;i++){
        cout << "tabint[" << i << "] = " << *(wi++) << "              tabflo[" << i << "] = " << *(wf++) << endl;
    }

    return 0;
}
0

Super, już rozumiem dzięki wam, tylko pytanie jak to dobrze napisać? Po prostu tak jak zrobiłem na początku czyli deklaracja int i = 0 ponad wszystkimi forami i w pętlach tylko inicjalizować?

1

Nie zagłębiałem się w ten kod, ale chyba mógłbyś to
wi=tabint,wf=tabflo
sobie przypisać przed pętlą i nie byłoby problemu.
Tak zresztą uczyniłeś z kolejnymi dwoma pętlami.

0

W książce chciał chyba pokazać kilka możliwości i miejsc przypisania tego wi i wf dlatego tak to wygląda, że później to zrobiłem z innymi pętlami. Ale tak czy siak wszystko wyjaśnione, dzięki wielkie chłopaki :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1