[C/C++] for loop VS while loop i.c.m multidimensionale array

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hoi, ik heb een vraag:

Het is normaal gesproken zo dat als je door een multidimensionale array wilt gaan dan neem je een for loop.

Zoals het volgende:

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const char * array[3][3] = {
        {"str1", "str1", "str1"},
        {"str2","str2", "str2"},
        {"str3","str3","str3"}
};

int main() {
    int i, j;

    for(i = 0; i < 3; i++) {
        for(j = 0; j < 3; j++) {
            printf("%s ", array[i][j]);
        }
    }

    return 0;
}


Output: str1 str1 str1 str2 str2 str2 str3 str3 str3

Echter wil ik het met een while loop doen. En dan krijg ik dit:

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const char * array[3][3] = {
        {"str1", "str1", "str1"},
        {"str2","str2", "str2"},
        {"str3","str3","str3"}
};

int main() {
    int i = 0;
    int j = 0;

    while(i < 3) {
        while(j < 3) {
            printf("%s ", array[i][j]);
            j++;
        }
        i++;
    }

    return 0;
}


Output: str1 str1 str1

Dit doe ik met GCC 4.7.2. Is dit een bug of toch een standaard die ik over het hoofd zie? Of doe ik iets verkeert?

Acties:
  • 0 Henk 'm!

  • falcon4ever
  • Registratie: Oktober 2001
  • Laatst online: 07-04-2021
Moet je j niet even op nul zetten voordat je de 2e loop in gaat?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ah, zo dus :X

C:
1
2
3
4
5
6
7
8
9
10
while(i < 3) {
        while(j < 3) {
            printf("%s ", array[i][j]);
            j++;
        }
        if(j == 3) {
            j = 0;
        }
        i++;
    }


Output: str1 str1 str1 str2 str2 str2 str3 str3 str3

Oeps, my mistake.. Bedankt ;)

Acties:
  • 0 Henk 'm!

  • falcon4ever
  • Registratie: Oktober 2001
  • Laatst online: 07-04-2021
Vanwaar die if? Gewoon op nul zetten alvorens je de 2e while loop in gaat.

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const char * array[3][3] = {
        {"str1", "str1", "str1"},
        {"str2", "str2", "str2"},
        {"str3", "str3", "str3"}
};

int main() {
    int i = 0;
    int j = 0;

    while(i < 3) {
        j = 0;
        while(j < 3) {
            printf("%s ", array[i][j]);
            j++;
        }
        i++;
    }

    return 0;
}

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Oh ja :$ Je hebt gelijk.

/me doet graag moeilijk :X

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 19-09 21:24

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ja, je gebruikt geen debugger. Sorry hoor, maar als je gewoon door je programma heen had gestept dan had je ook meteen gezien wat er fout ging. Gaat ook wat sneller dan GoT gebruiken als interpreter voor je code :) ("crowdcomputing" 8)7)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Big Womly
  • Registratie: Oktober 2007
  • Laatst online: 01-09 13:39

Big Womly

Live forever, or die trying

Dat niet alleen. Het is handig te weten wat je juist doet in je for loop
code:
1
for (init; condition; loopstep) {}

is altijd te herschrijven in een while loop
code:
1
2
3
4
init;
while (condition) {
    loopstep;
}

When you talk to God it's called prayer, but when God talks to you it's called schizophrenia


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 19-09 21:24

.oisyn

Moderator Devschuur®

Demotivational Speaker

Met de caveat dat als er een continue in staat dat 'loopstep' dan niet wordt uitgevoerd in een while, maar wel in een for ;)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:51
Sowieso is Big Womly's notatie verwarrend omdat die niet duidelijk maakt wanneer de loop body precies wordt uitgevoerd. (Vóór loopstep, weten jij en ik, maar dat kan je niet afleiden uit de gegeven code, als je alleen weet hoe een while-loop werkt.)

edit:
Ik vraag me af wat wel juist zou zijn... Misschien dit?
C:
1
init; if (condition) do { body } while (loopstep, condition);

(In C++ creëert het hele ding ook nog een nieuwe lexical scope, dus zou je nog blokhaken om het geheel kunnen zetten.)

[ Voor 37% gewijzigd door Soultaker op 21-01-2013 14:09 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 19-09 21:24

.oisyn

Moderator Devschuur®

Demotivational Speaker

Zo klopt ie volgens mij wel ja. Op voorwaarde dat er geen operator,(decltype(loopstep), decltype(condition)) bestaat in C++ dan :P

[ Voor 107% gewijzigd door .oisyn op 21-01-2013 14:38 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:51
Het wás C code hè, maar in C++ is het nog te fixen met:

C:
1
init; if (condition) do body; while ((void)loopstep, (bool)condition);

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 19-09 21:24

.oisyn

Moderator Devschuur®

Demotivational Speaker

De topictitel is C/C++ ;)

En dan eigenlijk zo:
C++:
1
init; if (condition) do body; while ((void)(loopstep), (condition));

De (bool) is feitelijk niet nodig.
.edit: de haakjes om condition ook niet trouwens.

[ Voor 13% gewijzigd door .oisyn op 21-01-2013 15:04 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Big Womly
  • Registratie: Oktober 2007
  • Laatst online: 01-09 13:39

Big Womly

Live forever, or die trying

Soultaker schreef op maandag 21 januari 2013 @ 14:05:
Sowieso is Big Womly's notatie verwarrend omdat die niet duidelijk maakt wanneer de loop body precies wordt uitgevoerd. (Vóór loopstep, weten jij en ik, maar dat kan je niet afleiden uit de gegeven code, als je alleen weet hoe een while-loop werkt.)
Je hebt gelijk
code:
1
2
3
for (init; condition; loopstep) {
    body;
}


is altijd te herschrijven in een while loop
code:
1
2
3
4
5
init;
while (condition) {
    body;
    loopstep;
}


Voila, verbeterd :)

When you talk to God it's called prayer, but when God talks to you it's called schizophrenia


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 19-09 21:24

.oisyn

Moderator Devschuur®

Demotivational Speaker

Volg je de discussie überhaupt wel?

C:
1
2
3
4
5
for (init; condition; loopstep) {
    if (something)
        continue;
    foo();
}

Oeps.

Samenvattend
C:
1
2
3
for (init; condition; loopstep) {
    body;
}

Is altijd te herschrijven als
C:
1
2
3
4
5
6
7
8
9
10
11
{
    init;
    if (condition)
    {
        do
        {
            body;
        }
        while((void)(loopstep), condition);
    }
}

[ Voor 50% gewijzigd door .oisyn op 22-01-2013 14:59 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Big Womly
  • Registratie: Oktober 2007
  • Laatst online: 01-09 13:39

Big Womly

Live forever, or die trying

Niet elke programmeertaal heeft een continue statement. Ik heb dan ook bewust het in gewonde code tags gezet ipv C of C++
Ik ben sowieso iemand die continue en break statements mijd. Het maakt de code onoverzichtelijker door je lus op verschillende plaatsen te onderbreken. En dat is een persoonlijk voorkeur

Even tussendoor
Hoe moet ik die
C:
1
 while((void)(loopstep), condition);
interpreteren?
Dit heb ik in mijn C-tijd niet tegengekomen en in Java is dit volgens mij niet geldig.

When you talk to God it's called prayer, but when God talks to you it's called schizophrenia


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 19-09 21:24

.oisyn

Moderator Devschuur®

Demotivational Speaker

Big Womly schreef op dinsdag 22 januari 2013 @ 16:59:
Niet elke programmeertaal heeft een continue statement.
Dan moet je niet van die boude statements maken dat een for lus op die manier altijd te schrijven als while lus :). Daarnaast is dit gewoon een C en C++ topic, dus andere talen zijn sowieso compleet irrelevant. Ik ken overigens geen C-achtige talen die geen continue kennen. Heb je een voorbeeld?
Ik ben sowieso iemand die continue en break statements mijd.
Prima, moet je zelf weten. Maar dat is dan hetzelfde als zeggen dat een for lus niet te schrijven is als while lus omdat je persoonlijk while lussen altijd mijdt :)
Even tussendoor
Hoe moet ik die
C:
1
 while((void)(loopstep), condition);
interpreteren?
Dit heb ik in mijn C-tijd niet tegengekomen en in Java is dit volgens mij niet geldig.
De expressie a, b betekent: evalueer eerst a, daarna b, en het resultaat van de expressie is b

In C++ is het daarnaast van belang om loopstep naar void te casten omdat je operator, kunt overloaden, waardoor (loopstep, condition) ineens een hele andere betekenis krijgt, wat hier niet gewenst is. Door de cast naar void is er geen user defined operator, meer mogelijk, want void is geen geldig functie-argument.

[ Voor 9% gewijzigd door .oisyn op 22-01-2013 17:13 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Big Womly
  • Registratie: Oktober 2007
  • Laatst online: 01-09 13:39

Big Womly

Live forever, or die trying

Al goed, al goed... je krijgt gelijk!
Voornamelijk omdat je ook gelijk hebt :P

When you talk to God it's called prayer, but when God talks to you it's called schizophrenia

Pagina: 1