Megoldva: Undefined operation

 ( pelz | 2008. szeptember 25., csütörtök - 2:31 )

Sziasztok!

Van egy ilyen programsorom:

      int i;
      // bla-bla-bla
      for (i = 0; i < steps; a[low+i] = temp[i++]);

Erre ezt üzeni a fordító:

Idézet:
warning: operation on ‘i’ may be undefined

Szerintetek, melyik műveletre gondol, és hogyan lehetne írni az utasítást, hogy ne kapjak ilyen figyelmeztetést. Egyáltalán érdemes ezzel foglalkozni?

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

A kiertekelesi sorrend nem trivialis (a[low+i]=temp[i++] a gazos resz). Azaz mit csinaljon a fordito?
- elobb kiszamolja hogy a jobb oldali erteket hova tegye (kiertekeli a low+i-t), megvan a memoria hely a[] vmelyik eleme, majd utana kiertekeli a jobb oldalt
- elobb kiertekeli a jobb oldalt, fasza, majd utana kitalalja hogy az eredmenyt hova is kell tenni a memoriaban.
A ket megoldas mas eredmenyt ad, es erre a C szabvany nem mond semmit, hogy ekkor mi a teendo", marmint milyen sorrendben kell kiertekelni.

Szerk: a megoldas lehet: k=i++, a[low+i]=temp[k], pl. ha erre a sorrendre gondoltal :] ha nem, akkor
a[low+i]=temp[i], i++.

http://c-faq.com/expr/evalorder2.html

a[low+i] = temp[i++] kétértelmű:

a[low+i] = temp;i++

ill.

old_i=i++;a[low+i] = temp[old_i]

A probléma az, hogy i++ azt jelenti, hogy i++ kiértékelődik i-nek, majd a következő szekvenciapont (;) előtt valamikor inkrementálódik. De még ez előtt használod is indexként i-t, így nem egyértelmű, hogy ez az inkrementálás előtt vagy után van. Az értékadás nem szekvenciapont.

Java-ban pl. ez nem lenne gond.

--
[i]The Net is indeed vast and infinite...
http://gablog.eu

Mindkettőtök hozzászólását nagyon köszönöm. Igyekszem ezeket a kétértelmű kifejezéseket kerülni a jövőben.

Üdv: Pelz.

Egyébként ezt a verziót szerettem volna:

Idézet:
a[low+i]=temp[i], i++

Ha nem akarod, hogy a kollegád a pokolba kívánjon a rossz karbantarthatóság miatt, akkor a jó hagyományos gyalog módszert javaslom


for(int i=0; i<steps; ++i) a[low+i] = temp[i];

Nem attól jó programozó valaki, ha kriptikusan fogalmaz, hanem ha világosan fogalmazva tudja előadni a jó ötleteit.

Igazad van!

Sok embernel elofordul, hogy gyors es kicsi kodot szeretne irni es az a teves kepzete tamad, ha kisebb a forrass, ill. tobb dolgot pasziroz egyetlen kifejezesbe akkor az ugy jobb lesz.

Tobbnyire tevednek.


Amit nem lehet megirni assemblyben, azt nem lehet megirni.