søppel Skrevet 3. april 2004 Del Skrevet 3. april 2004 int my_pos = 100; // ..kode..kode.. if(end_pos == 0) end_pos == my_pos; cout << "end_pos: " << end_pos << endl; // ..kode..kode.. ..utskrift ved kjøring: end_pos: 0 ..teit feil, eller hva? heh :} Lenke til kommentar
kjetil7 Skrevet 3. april 2004 Del Skrevet 3. april 2004 Ja, den er klassisk. Men en god kompilator gir deg en warning (MSVC 7.1 gir warning). En enda mer klassisk feil er kanskje: if(end_pos = 0) end_pos = my_pos; Derfor pleier jeg alltid skrive konstanten først: if(0 == end_pos) end_pos = my_pos Lenke til kommentar
<BøNilzen> Skrevet 3. april 2004 Del Skrevet 3. april 2004 if(end_pos == 0) end_pos == my_pos; Du skal bare bruke "==" inni paranteser som i "if" setningen. Ellers skal du bruke enkel, så det blir vel if(end_pos == 0) end_pos = my_pos; Lenke til kommentar
☀ ❄ Skrevet 3. april 2004 Del Skrevet 3. april 2004 Han skjønte nok det, <BøNilzen> Men det er heldigvis lett for kompilatorer å rette en if (var = 5), det er "fortere gjort" å glemme å definere en copy-ctor for klasser med dynamisk allokert minne e.l. (Har brent meg på det et par ganger opp gjennom tida..) Lenke til kommentar
kjetil7 Skrevet 3. april 2004 Del Skrevet 3. april 2004 (endret) Han skjønte nok det, <BøNilzen> Men det er heldigvis lett for kompilatorer å rette en if (var = 5), det er "fortere gjort" å glemme å definere en copy-ctor for klasser med dynamisk allokert minne e.l. (Har brent meg på det et par ganger opp gjennom tida..) Hmmm... ikke mange kompilatorer (ingen?) gir deg warning ved å skrive: if(var = 5) { //... } Verken msvc eller gcc gir deg noen som helst warning, fordi det jo er helt legal og meningsfylt kode. Men: if(5 = var) { //... } ... kompilerer derimot ikke. Kan ikke telle hvor mange ganger jeg har rettet opp andres kode som har denne "unødvendige" feilen. Noen takler ikke å ha konstanten først, men fakta er at mange gjør denne feilen. Den kunne vært unngått hvis man tilvenner seg å skrive konstanten først. Mangelen på copy c'tor er også en stor feilkilde som du nevner. Og ikke minst mangelen på en virtuell copy c'tor (Clone) et sted nede i klassehiarkiet... Endret 3. april 2004 av kjetil7 Lenke til kommentar
søppel Skrevet 3. april 2004 Forfatter Del Skrevet 3. april 2004 (endret) Husk at kompilere har forskjellige nivåer for advarsler. F.eks. GCC's C-kompiler 'gcc' og GCC's C++-kompiler 'g++' har begge en parameter -Wall som er kjekk. Denne koden: int i; if(i = 5) {} Gir ingen meldinger når jeg kompilerer slik: gcc test.c -o test ..eller slik.. g++ test.cpp -o test Derimot, hvis jeg øker "advarsel-nivået": gcc -Wall test.c -o testtest.c: In function `main': test.c:5: warning: suggest parentheses around assignment used as truth value ..eller slik.. g++ -Wall test.cpp -o testtest.cpp: In function `int main()': test.cpp:5: warning: suggest parentheses around assignment used as truth value Kan være lurt å ha -Wall (og andre parametere) på mens man driver med kodingen. :] Dette gjelder GCC 3.* og MinGW (basert på GCC 3.*). Edit: int i; if(i == 1) i == 2; g++ -Wall test.cpp -o testtest.cpp: In function `int main()': test.cpp:6: warning: statement with no effect ...hm.. tror jeg må sjekke Makefilene .. jeg skulle fått advarsel, for jeg vet at tidligere så har (blandt annet) -Wall vært med, så noe må ha gått i vasken her et sted på veien .. :} Endret 3. april 2004 av søppel Lenke til kommentar
kjetil7 Skrevet 3. april 2004 Del Skrevet 3. april 2004 (endret) Selvfølgelig kan du sette opp advarselnivået. Men da får du sannsynligvis mange andre uønskede advarsler også. Jeg vil våge å påstå at de fleste ikke bruker høyeste advarselnivå på kompilatoren sin. Alle mine tester var med standard advarselnivå (noe som jeg selvfølgelig burde ha nevnt). Poenget mitt var bare at det er en god kodeskikk å skrive konstanten først i slike tilfeller. Selvfølgelig er opp til en selv om man ønsker å praktisere det, men jeg kan i hvertfall av erfaring si at MANGE gjør denne feilen. Edit: skriveleifer Endret 3. april 2004 av kjetil7 Lenke til kommentar
A_N_K Skrevet 3. april 2004 Del Skrevet 3. april 2004 Mitt inntrykk er heller at -Wall er ganske vanlig, bruker det stadig selv i alle fall. I ett prosjekt er jeg tvunget til å bruke -pedantic i tillegg pga. GCC 2.9x-brukere :\ Lenke til kommentar
☀ ❄ Skrevet 3. april 2004 Del Skrevet 3. april 2004 Jeg har også inntrykk av at -Wall er mye brukt, bruker det også ofte selv. Jeg vet at på flere akademiske institutter (les: Universiteter rundt omkring osv.) er det et krav at programmene skal kompilere med -Wall uten å klage. Testet på Borlands gratis kommandolinje-kompilator, og den sa: Warning W8060 tmp1.cpp 4: Possibly incorrect assignment in function main() Lenke til kommentar
kjetil7 Skrevet 3. april 2004 Del Skrevet 3. april 2004 Mulig det. Snakker bare av egen erfaring jeg. I de produksjonsmiljøene jeg har kjennskap til er det mest vanlig med lev. 3 i msvc og standard nivå på Sun kompilatoren. Har aldri brukt gcc i kommersiell sammenheng så jeg har ikke like god kjennskap til den. Men kompilatorene blir jo bedre og bedre og de bør jo kanskje gi en warning når det ikke står i parantes etter min mening. Uansett var det i hvertfall noe av det første jeg ble lært av gode kodeskikker i sin tid tilbake (for mange, mange år siden ) Skal forøvrig teste på Intel kompilatoren når jeg får tid. Har den ikke på maskinen her, men skal se hva jeg får til i morgen (hvis ingen er raskere enn meg..) Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå