| 
					
							
        
    
        
						
			 | 
			
			
					    
					
        
         
          
         
	
            | order of volatile access Fra : Ukendt | 
  Dato :  05-12-06 19:07 |  
  |   
            Hej,
 
 Der er vist noget jeg ikke ved om "volatile"
 
 volatile int a, b
 <cut>
 if (a+b > 100)
 giver:
 Warning[Pa082]: undefined behavior: the order of volatile accesses is 
 undefined in this statement.
 
 Jeg trode at volatile bare betød at optimizeren skulle holde snitterne væk. 
 Især fra at optimere en skrivning væk pga en dead assignment (nyttig ifb med 
 debugging).
 
 Er det en warning som IAR har fundet på, eller har det én eller anden 
 forankring i standarder?
 
 tpt 
 
 
  
            
             |   |   
            
        
 
            
         
           Mogens Hansen (05-12-2006) 
         
	
            | Kommentar Fra : Mogens Hansen | 
  Dato :  05-12-06 20:00 |  
  |   
            
 "Troels Thomsen" <nej tak ...> wrote in message 
 news:4575b562$0$20234$edfadb0f@dread16.news.tele.dk...
 
 [8<8<8<]
 > Jeg trode at volatile bare betød at optimizeren skulle holde snitterne 
 > væk. Især fra at optimere en skrivning væk pga en dead assignment (nyttig 
 > ifb med debugging).
 
 volatile betyder at variablens værdi kan ændre sig uden at compileren har 
 mulighed for at vide noget om det - f.eks. i en interupt-rutine.
 Derfor må compileren ikke optimere læsninger væk.
 
 >
 > Er det en warning som IAR har fundet på, eller har det én eller anden 
 > forankring i standarder?
 
 Umiddelbart forstår jeg ikke den warning.
 
 Venlig hilsen
 
 Mogens Hansen 
 
 
  
            
             |   |   
            
        
 
            
         
           Anders J. Munch (05-12-2006) 
         
	
            | Kommentar Fra : Anders J. Munch | 
  Dato :  05-12-06 21:56 |  
  |   
            Troels Thomsen wrote:
 > volatile int a, b
 > <cut>
 > if (a+b > 100)
 > giver:
 > Warning[Pa082]: undefined behavior: the order of volatile accesses is 
 > undefined in this statement.
 
 Ordene "undefined behaviour" er noget sludder her. Men advarslen er
 fornuftigt nok: Du har ikke nogen garanti for at læsningen af a og b
 sker i nogen bestemt rækkefølge, eller overhovedet at de bliver læst
 sekventielt. Tilfældige omstændigheder, såsom ændringer i 
 optimeringsindstillinger, kan komme til at bytte om på rækkefølgen, da 
 der ikke er noget sequence point mellem de to læsninger.
 
 Hvis det skrives om til
    int a_ = a;
    if (a_+b > 100)
 så er der et sequence point ved semikolonet, og det er garanteret at a
 læses før b.
 
 mvh. Anders
  
            
             |   |   
            
        
 
            
         
           Ukendt (05-12-2006) 
         
	
            | Kommentar Fra : Ukendt | 
  Dato :  05-12-06 23:46 |  
  |   
            
 > Men advarslen er
 > fornuftigt nok:
 
 Jeg forstår godt hvad du og de mener....men.... det gælder jo også
 c = func1() + func2()
 ?
 
 Dette eksempel giver ingen warnings.
 
 Det er godt nok grim kode, hvis rækkefølgen betyder noget, men det gælder 
 vel også for eksemplet med to volatile objekter så?
 
 mvh Troels
 
 
  
            
             |   |   
            
        
 
            
         
            Ivan Johansen (06-12-2006) 
         
	
            | Kommentar Fra : Ivan Johansen | 
  Dato :  06-12-06 08:39 |  
  |   
            Troels Thomsen wrote:
 > Det er godt nok grim kode, hvis rækkefølgen betyder noget, men det gælder 
 > vel også for eksemplet med to volatile objekter så?
 
 Grunden er sikkert at volatile ofte bruges ved tilgang til hardware og 
 registre i processoren og i sådan en situation kan rækkefølgen have 
 betydning. Jeg har dog aldrig selv set sådan en warning før. Men 
 "undefines" skulle nok erstattes af "unspecified".
 
 Ivan Johansen
  
            
             |   |   
            
        
 
            
         
             Ukendt (06-12-2006) 
         
	
            | Kommentar Fra : Ukendt | 
  Dato :  06-12-06 22:31 |  
  |   
            >
 > Grunden er sikkert at volatile ofte bruges ved tilgang til hardware og 
 > registre i processoren og i sådan en situation kan rækkefølgen have 
 > betydning. Jeg har dog aldrig selv set sådan en warning før. Men 
 > "undefines" skulle nok erstattes af "unspecified".
 >
 
 Jeg kan komme i tanke om et uart-register på en processor hvor 
 errorflag-registeret cleares autmatisk når man _læser_ data-registeret. Men 
 jeg synes sq det er sjældent.
 
 tpt
 
 
  
            
             |   |   
            
        
 
            
         
            Anders J. Munch (07-12-2006) 
         
	
            | Kommentar Fra : Anders J. Munch | 
  Dato :  07-12-06 19:38 |  
  |   
            Troels Thomsen wrote:
 >> Men advarslen er
 >> fornuftigt nok:
 > 
 > Jeg forstår godt hvad du og de mener....men.... det gælder jo også
 > c = func1() + func2()
 > ?
 > 
 > Dette eksempel giver ingen warnings.
 
 Nej men det kunne det i princippet godt. For det er ikke givet om func1 
 eller func2 udføres først, så hvis begge funktioner har observerbare 
 sideeffekter, så er det usikkert i hvilken rækkefølge de bliver udført.
 
 Det ville bare give en forfærdelig masse falske positive hvis compileren 
 gav en warning hver eneste gang der er to funktionskald i samme udtryk, 
 så det gør den ikke. Men når du højt og klart har erklæret at 
 rækkefølgen er særligt interessant for netop de her to variabler, ved at 
 erklære dem volatile, så lytter compileren naturligvis efter.
 
 mvh. Anders
 
 
  
            
             |   |   
            
        
 
            
         
             Ukendt (09-12-2006) 
         
	
            | Kommentar Fra : Ukendt | 
  Dato :  09-12-06 14:33 |  
  |   
            
> Men når du højt og klart har erklæret at rækkefølgen er særligt 
 > interessant for netop de her to variabler, ved at erklære dem volatile, så 
 > lytter compileren naturligvis efter.
 Jeg mener ikke at man kan finde NOGEN hints i C99 standarden til at volatile 
 skulle betyde dette.
 Alene fraværet af posts fra nogle af gruppens hårde gutter i denne retning, 
 er et vægtigt indicie herfor   
Jeg har også selv søgt efter volatile i standarden, og ikke fundet noget i 
 denne retning.
 Jeg har dog fået det bedre og bedre med denne tilføjelse. Hvis man ser lidt 
 pragmatisk på det, så er det vist bare en god ide !
 Min oprindelige anke var at de har en speciel opfattelse af hvad volatile 
 betyder, men det gør egentlig ikke så meget idet man kun kan "komme til" at 
 skrive bedre kode pga denne warning. Koden vil aldrig virke forkert hvis det 
 kompileres med en anden compiler, etc etc.
 Der er andre ting der også har lidt anderledes betydning på embeddede 
 systemer, eksempelvis "const".
 tpt 
            
              |   |   
            
        
 
            
         
              Kent Friis (09-12-2006) 
         
	
            | Kommentar Fra : Kent Friis | 
  Dato :  09-12-06 14:45 |  
  |   
            Den Sat, 9 Dec 2006 14:32:59 +0100 skrev Troels Thomsen:
 >
 >
 >> Men når du højt og klart har erklæret at rækkefølgen er særligt 
 >> interessant for netop de her to variabler, ved at erklære dem volatile, så 
 >> lytter compileren naturligvis efter.
 >
 > Jeg mener ikke at man kan finde NOGEN hints i C99 standarden til at volatile 
 > skulle betyde dette.
 
 Som jeg har lært det (uden dog ar have læse standarden) betyder volatile
 at værdien kan ændre sig uden compileren ved det, og derfor ikke må
 gemmes i et register, men skal læses hver gang den bruges.
 
 Der er kun to muligheder for hvordan en værdi kan ændre sig uden
 compileren ved det - software (threads) eller hardware-registre. Og
 rækkefølgen kan netop være vigtig ved hardware-regstre. Så selvom det
 ikke måske direkte står i standarden, så er det underforstået, i og
 med at der hvor man har brug for volatile kan det være relevant. Men
 det er hardwaren der afgør om rækkefølgen har nogen betydning eller
 ej, ikke C-standarden.
 
 Mvh
 Kent
 -- 
 "So there I was surrounded by all these scary creatures
 They were even scarier than what Microsoft call features"
 - C64Mafia: Forbidden Forest (Don't Go Walking Slow).
  
            
             |   |   
            
        
 
            
         
               Ukendt (09-12-2006) 
         
	
            | Kommentar Fra : Ukendt | 
  Dato :  09-12-06 21:15 |  
  |   
            
 > Så selvom det
 > ikke måske direkte står i standarden, så er det underforstået
 
 IAR er så vidt vides de eneste der laver denne warning, ud af de tusinder af 
 C compilere der er blevet lavet i tidens løb. Så at det ligefrem skulle være 
 underforstået synes jeg er at stramme den lidt.
 
 At det så er en god ide alligevel, synes jeg er en anden sag.
 
 tpt
 
 
  
            
             |   |   
            
        
 
            
         
                Kent Friis (09-12-2006) 
         
	
            | Kommentar Fra : Kent Friis | 
  Dato :  09-12-06 21:46 |  
  |   
            Den Sat, 9 Dec 2006 21:14:57 +0100 skrev Troels Thomsen:
 >
 >> Så selvom det
 >> ikke måske direkte står i standarden, så er det underforstået
 >
 > IAR er så vidt vides de eneste der laver denne warning, ud af de tusinder af 
 > C compilere der er blevet lavet i tidens løb. Så at det ligefrem skulle være 
 > underforstået synes jeg er at stramme den lidt.
 
 Det er underforstået at rækkefølgen kan være vigtig. Om compileren så
 laver en warning om det, er op til dem der laver compileren.
 
 Mvh
 Kent
 -- 
 "So there I was surrounded by all these scary creatures
 They were even scarier than what Microsoft call features"
 - C64Mafia: Forbidden Forest (Don't Go Walking Slow).
  
            
             |   |   
            
        
 
            
         
                 Mogens Hansen (10-12-2006) 
         
	
            | Kommentar Fra : Mogens Hansen | 
  Dato :  10-12-06 16:29 |  
  |   
            
 "Kent Friis" <nospam@nospam.invalid> wrote in message 
 news:457b208e$0$49203$14726298@news.sunsite.dk...
 
 [8<8<8<]
 > Det er underforstået at rækkefølgen kan være vigtig.
 
 volatile betyder at variablens værdi kan ændre sig uden at det er 
 specificeret af programmet.
 Derfor skal compileren afstå fra at optimere læsninger væk.
 
 Om rækkefølgen af at læse flere uafhængige volatile variable er 
 betydningsfuldt eller ej kan man ikke sige noget generelt om.
 Man vil kunne finde eksempler hvor det er betydningsfuldt og eksempler hvor 
 det er ligegyldigt.
 
 Venlig hilsen
 
 Mogens Hansen 
 
 
  
            
             |   |   
            
        
 
            
         
                  Kent Friis (10-12-2006) 
         
	
            | Kommentar Fra : Kent Friis | 
  Dato :  10-12-06 17:12 |  
  |   
            Den Sun, 10 Dec 2006 16:29:12 +0100 skrev Mogens Hansen:
 >
 > "Kent Friis" <nospam@nospam.invalid> wrote in message 
 > news:457b208e$0$49203$14726298@news.sunsite.dk...
 >
 > [8<8<8<]
 >> Det er underforstået at rækkefølgen kan være vigtig.
 >
 > volatile betyder at variablens værdi kan ændre sig uden at det er 
 > specificeret af programmet.
 > Derfor skal compileren afstå fra at optimere læsninger væk.
 >
 > Om rækkefølgen af at læse flere uafhængige volatile variable er 
 > betydningsfuldt eller ej kan man ikke sige noget generelt om.
 > Man vil kunne finde eksempler hvor det er betydningsfuldt og eksempler hvor 
 > det er ligegyldigt.
 
 Og dermed *kan* det være vigtigt. Compileren har ingen mulighed for
 at vide hvornår det er vigtigt og hvornår det ikke er. Så dem der
 laver compileren har to muligheder: Give en warning, eller ignorere
 problemet.
 
 Mvh
 Kent
 -- 
 "So there I was surrounded by all these scary creatures
 They were even scarier than what Microsoft call features"
 - C64Mafia: Forbidden Forest (Don't Go Walking Slow).
  
            
             |   |   
            
        
 
            
         
              Anders J. Munch (10-12-2006) 
         
	
            | Kommentar Fra : Anders J. Munch | 
  Dato :  10-12-06 18:29 |  
  |  
 
            Troels Thomsen wrote:
 >> Men når du højt og klart har erklæret at rækkefølgen er særligt 
 >> interessant for netop de her to variabler, ved at erklære dem volatile, så 
 >> lytter compileren naturligvis efter.
 > 
 > Jeg mener ikke at man kan finde NOGEN hints i C99 standarden til at volatile 
 > skulle betyde dette.
 Jeg ved ikke hvordan C99 udtrykker det, men i ISO/IEC 14882:1998(E) 
 1.9/7 står der:
 "Accessing an object designated by a volatile lvalue [med mere] are all 
 side effects [...]. At certain  specified points in the execution 
 sequence called sequence points, all side effects of previous 
 evaluations  shall be complete and no side effects of subsequent 
 evaluations shall have taken place."
 Det er det helt præcise rækkefølgekrav, og det er præcis, hvad IAR 
 compileren leverer. (Det eneste, der kunne være åbent for fortolkning, 
 er hvad der udgør en "access", men i praksis er det klart nok.)
 > Alene fraværet af posts fra nogle af gruppens hårde gutter i denne retning, 
 > er et vægtigt indicie herfor   
Hårde gutter poster ikke me-too-indlæg.
 mvh. Anders
            
              |   |   
            
        
 
            
         
               Kent Friis (10-12-2006) 
         
	
            | Kommentar Fra : Kent Friis | 
  Dato :  10-12-06 18:57 |  
  |   
            Den Sun, 10 Dec 2006 18:28:53 +0100 skrev Anders J. Munch:
 >
 > Jeg ved ikke hvordan C99 udtrykker det, men i ISO/IEC 14882:1998(E) 
 > 1.9/7 står der:
 >
 > "Accessing an object designated by a volatile lvalue [med mere] are all 
 > side effects [...].
 
 Så er det jo ikke engang underforstået at rækkefølgen kan være relevant,
 det fremgår af ordet "side effect", så meget som det nu kan uden at
 beskrive den fysiske hardware direkte i standarden.
 
 Et eksempel på side effects: printf() returnerer antallet af tegn
 der bliver skrevet. Som sideeffekt bliver disse tegn skrevet på
 skærmen.
 
 Der er vel ingen der er i tvivl om at rækkefølgen af sideeffekter
 kan være vigtig - hvis man kalder printf to gange, og compileren bytter
 om på den, kommer der til at stå noget helt andet.
 
 Og så kunne jeg da egentlig godt tænke mig at vide om compileren også
 må bytte om på to funktionskald hvis der står + imellem? Hvis jeg fx
 skriver a=printf("hello ")+printf("world "); må den så skrive
 "world hello "? Eller er funktionskald specielle i denne sammenhæng?
 
 Mvh
 Kent
 -- 
 "So there I was surrounded by all these scary creatures
 They were even scarier than what Microsoft call features"
 - C64Mafia: Forbidden Forest (Don't Go Walking Slow).
  
            
             |   |   
            
        
 
            
         
                Anders J. Munch (11-12-2006) 
         
	
            | Kommentar Fra : Anders J. Munch | 
  Dato :  11-12-06 19:01 |  
  |  
 
            Kent Friis wrote:
 > 
 > Og så kunne jeg da egentlig godt tænke mig at vide om compileren også
 > må bytte om på to funktionskald hvis der står + imellem? Hvis jeg fx
 > skriver a=printf("hello ")+printf("world "); må den så skrive
 > "world hello "? Eller er funktionskald specielle i denne sammenhæng?
 Ja, den må godt skrive "world hello ". Der hvor det sædvanligvis bider 
 folk er ved funktionsargumenter - dvs. når de skriver:
   f(printf("hello "), printf("world "));
 Der er ikke sequence points mellem argumenter, så det kan skrive både 
 det ene og det andet. Og hvad værre er, ikke bare har det lov til at 
 skrive "world hello ", men det sker faktisk ofte i praksis, fordi der er 
 kald-konventionener der foreskriver at argumenterne stakkes fra højre 
 mod venstre.
 Bare så folk ikke skal tro, at det hele flyder, må jeg lige skynde mig 
 at nævne at der udover mellem sætninger er sequence points ved starten 
 og slutningen af funktionskald, og ved &&, || og ?:, af hvad jeg lige 
 kan huske. Så det er ikke _helt_ tilfældigt hvad der foregår   
mvh. Anders
            
              |   |   
            
        
 
            
         
                 Kent Friis (11-12-2006) 
         
	
            | Kommentar Fra : Kent Friis | 
  Dato :  11-12-06 19:16 |  
  |   
            Den Mon, 11 Dec 2006 19:01:00 +0100 skrev Anders J. Munch:
 > Kent Friis wrote:
 >> 
 >> Og så kunne jeg da egentlig godt tænke mig at vide om compileren også
 >> må bytte om på to funktionskald hvis der står + imellem? Hvis jeg fx
 >> skriver a=printf("hello ")+printf("world "); må den så skrive
 >> "world hello "? Eller er funktionskald specielle i denne sammenhæng?
 >
 > Ja, den må godt skrive "world hello ".
 
 Jeg havde nok en mistanke...
 
 > Der hvor det sædvanligvis bider 
 > folk er ved funktionsargumenter - dvs. når de skriver:
 >
 >   f(printf("hello "), printf("world "));
 >
 > Der er ikke sequence points mellem argumenter, så det kan skrive både 
 > det ene og det andet. Og hvad værre er, ikke bare har det lov til at 
 > skrive "world hello ", men det sker faktisk ofte i praksis, fordi der er 
 > kald-konventionener der foreskriver at argumenterne stakkes fra højre 
 > mod venstre.
 >
 > Bare så folk ikke skal tro, at det hele flyder, må jeg lige skynde mig 
 > at nævne at der udover mellem sætninger er sequence points ved starten 
 > og slutningen af funktionskald,
 
 Altså for de ting der står inde i funktionen? Ovenstående er jo netop
 funktionskald (printf).
 
 > og ved &&, || og ?:,
 
 Det er jo nødvendigt at evaluere dem i den rigtige rækkefølge, når
 resultatet af den ene side bestemmer hvorvidt den anden side skal
 evalueres.
 
 Mvh
 Kent
 -- 
 "So there I was surrounded by all these scary creatures
 They were even scarier than what Microsoft call features"
 - C64Mafia: Forbidden Forest (Don't Go Walking Slow).
  
            
             |   |   
            
        
 
            
         
                  Anders J. Munch (11-12-2006) 
         
	
            | Kommentar Fra : Anders J. Munch | 
  Dato :  11-12-06 19:28 |  
  |   
            Kent Friis wrote:
 > Den Mon, 11 Dec 2006 19:01:00 +0100 skrev Anders J. Munch:
 >>
 >>   f(printf("hello "), printf("world "));
 [...]
 >> Bare så folk ikke skal tro, at det hele flyder, må jeg lige skynde mig 
 >> at nævne at der udover mellem sætninger er sequence points ved starten 
 >> og slutningen af funktionskald,
 > 
 > Altså for de ting der står inde i funktionen? Ovenstående er jo netop
 > funktionskald (printf).
 
 Ja. Sagt med andre ord, hvert funktionskald udføres i isolation, så 
 ovenstående må ikke udskrive "hwellrlo d " eller sådan noget.
 
 - Anders
 
  
            
             |   |   
            
        
 
            
         
                  Ukendt (11-12-2006) 
         
	
            | Kommentar Fra : Ukendt | 
  Dato :  11-12-06 19:34 |  
  |   
            >
 >> og ved &&, || og ?:,
 >
 > Det er jo nødvendigt at evaluere dem i den rigtige rækkefølge, når
 > resultatet af den ene side bestemmer hvorvidt den anden side skal
 > evalueres.
 >
 
 Mener du at det er forbudt for compileren at evaluere begge sider, og så 
 and'e resultaterne til sidst ?
 
 Hvis blot sideefekterne af den ene side er afsluttet, må den ifølge citatet 
 gerne evaluere den anden side også !
 
 tpt
 
 
  
            
             |   |   
            
        
 
            
         
                   Kent Friis (11-12-2006) 
         
	
            | Kommentar Fra : Kent Friis | 
  Dato :  11-12-06 19:39 |  
  |   
            Den Mon, 11 Dec 2006 19:34:17 +0100 skrev Troels Thomsen:
 >>
 >>> og ved &&, || og ?:,
 >>
 >> Det er jo nødvendigt at evaluere dem i den rigtige rækkefølge, når
 >> resultatet af den ene side bestemmer hvorvidt den anden side skal
 >> evalueres.
 >>
 >
 > Mener du at det er forbudt for compileren at evaluere begge sider, og så 
 > and'e resultaterne til sidst ?
 
 Ja.
 
 if(x && *x) printf("%s\n",x);
 
 > Hvis blot sideefekterne af den ene side er afsluttet, må den ifølge citatet 
 > gerne evaluere den anden side også !
 
 x == NULL /* false */
 *x == segmentation fault, core dumped.
 
 Mvh
 Kent
 -- 
 "So there I was surrounded by all these scary creatures
 They were even scarier than what Microsoft call features"
 - C64Mafia: Forbidden Forest (Don't Go Walking Slow).
  
            
             |   |   
            
        
 
            
         
                    Ukendt (11-12-2006) 
         
	
            | Kommentar Fra : Ukendt | 
  Dato :  11-12-06 20:09 |  
  |   
            
 > if(x && *x) printf("%s\n",x);
 >
 
 Ok,
 Andet eksempel på det samme, checket på samme IAR compiler.
 
 if ( func1() && 0 )
 Func1 bliver kaldt, optimizeren er slået helt fra iøvrigt.
 
 if ( 0 && func1() )
 Func1 bliver ikke kaldt
 
 tpt
 
 
  
            
             |   |   
            
        
 
            
         
                Ukendt (11-12-2006) 
         
	
            | Kommentar Fra : Ukendt | 
  Dato :  11-12-06 19:17 |  
  |   
            >
 > Og så kunne jeg da egentlig godt tænke mig at vide om compileren også
 > må bytte om på to funktionskald hvis der står + imellem?
 >
 
 Man kunne også spørge, om compileren virkelig er tvunget til at generere 
 funktionskald fra venstre mod højre hvis der står + imellem. Det betyder det 
 samme, men har omvendt bias.
 
 Ja det har jeg altid gået ud fra, og der var ingen der modsagde mig i posten 
 fra 5/12.
 Men nu er min forståelse af sequence points jo til review i en anden post 
 fra d.d.
 
 tpt
 
 
 
  
            
             |   |   
            
        
 
            
         
                 Kent Friis (11-12-2006) 
         
	
            | Kommentar Fra : Kent Friis | 
  Dato :  11-12-06 19:23 |  
  |   
            Den Mon, 11 Dec 2006 19:16:30 +0100 skrev Troels Thomsen:
 >>
 >> Og så kunne jeg da egentlig godt tænke mig at vide om compileren også
 >> må bytte om på to funktionskald hvis der står + imellem?
 >>
 >
 > Man kunne også spørge, om compileren virkelig er tvunget til at generere 
 > funktionskald fra venstre mod højre hvis der står + imellem. Det betyder det 
 > samme, men har omvendt bias.
 
 Min formulering af spørgsmålet indikerede ikke (bevidst) nogen bias. Din
 formulering opfatter jeg derimod som om at det logiske er at compileren
 har frit valg, men at noget i standarden indikerer at det ikke skulle være
 tilfældet.
 
 Før jeg læste citatet fra standarden havde jeg overhovedet ikke tænkt
 på muligheden, og da jeg læste den, var det logiske at det må compileren
 godt. Jeg skulle bare lige høre om det var korrekt opfattet, eller der
 var en undtagelse i et andet afsnit.
 
 Mvh
 Kent
 -- 
 "So there I was surrounded by all these scary creatures
 They were even scarier than what Microsoft call features"
 - C64Mafia: Forbidden Forest (Don't Go Walking Slow).
  
            
             |   |   
            
        
 
            
         
                  Ukendt (11-12-2006) 
         
	
            | Kommentar Fra : Ukendt | 
  Dato :  11-12-06 19:31 |  
  |   
            
 > Min formulering af spørgsmålet indikerede ikke (bevidst) nogen bias.
 
 Det var også bare for at vende tingene på hovedet. Ikke for at være flabet.
 
 tpt
 
 
 
  
            
             |   |   
            
        
 
            
         
                   Kent Friis (11-12-2006) 
         
	
            | Kommentar Fra : Kent Friis | 
  Dato :  11-12-06 19:33 |  
  |   
            Den Mon, 11 Dec 2006 19:30:49 +0100 skrev Troels Thomsen:
 >
 >> Min formulering af spørgsmålet indikerede ikke (bevidst) nogen bias.
 >
 > Det var også bare for at vende tingene på hovedet. Ikke for at være flabet.
 
 Ok. Det gav bare en lidt anden betydning i mine øjne.
 
 Mvh
 Kent
 -- 
 "So there I was surrounded by all these scary creatures
 They were even scarier than what Microsoft call features"
 - C64Mafia: Forbidden Forest (Don't Go Walking Slow).
  
            
             |   |   
            
        
 
            
         
               Ukendt (11-12-2006) 
         
	
            | Kommentar Fra : Ukendt | 
  Dato :  11-12-06 19:05 |  
  |   
            > At certain  specified points in the execution sequence called sequence 
 > points, all side effects of previous evaluations  shall be complete and no 
 > side effects of subsequent evaluations shall have taken place."
 
 Ok, dette læste jeg godt, og forstod det på flg måde :
 
 volatile int a,b,c,d;
 result1 = a + b ; // semikolon'et udgør sequence point A
 result2 = c + d ;
 
 Står der ikke at sideeffekterne af læsningerne af a og b skal være overstået 
 ved sequence point A (previous evaluations), og sideeffekterne af c og d 
 (subsequent evaluations) må endnu ikke være sket ?
 
 tpt
 
 
  
            
             |   |   
            
        
 
            
         
                Anders J. Munch (11-12-2006) 
         
	
            | Kommentar Fra : Anders J. Munch | 
  Dato :  11-12-06 19:17 |  
  |   
            Troels Thomsen wrote:
 >> At certain  specified points in the execution sequence called sequence 
 >> points, all side effects of previous evaluations  shall be complete and no 
 >> side effects of subsequent evaluations shall have taken place."
 > 
 > Ok, dette læste jeg godt, og forstod det på flg måde :
 > 
 > volatile int a,b,c,d;
 > result1 = a + b ; // semikolon'et udgør sequence point A
 > result2 = c + d ;
 > 
 > Står der ikke at sideeffekterne af læsningerne af a og b skal være overstået 
 > ved sequence point A (previous evaluations), og sideeffekterne af c og d 
 > (subsequent evaluations) må endnu ikke være sket ?
 
 Netop, ja.
 
 - Anders
  
            
             |   |   
            
        
 
            
         
                 Ukendt (11-12-2006) 
         
	
            | Kommentar Fra : Ukendt | 
  Dato :  11-12-06 19:33 |  
  |   
            >
 > Netop, ja.
 >
 
 Så hvor er det at volatile betyder at
 "at rækkefølgen er særligt  interessant for netop de her to variabler"
 
 tpt 
 
 
  
            
             |   |   
            
        
 
            
         
                  Kent Friis (11-12-2006) 
         
	
            | Kommentar Fra : Kent Friis | 
  Dato :  11-12-06 19:35 |  
  |   
            Den Mon, 11 Dec 2006 19:32:35 +0100 skrev Troels Thomsen:
 >>
 >> Netop, ja.
 >>
 >
 > Så hvor er det at volatile betyder at
 > "at rækkefølgen er særligt  interessant for netop de her to variabler"
 
 Volatile betyder i sig selv at der kan være sideeffekter. Compileren
 gør bare opmærksom på at den ikke garanterer rækkefølgen af disse.
 
 Mvh
 Kent
 -- 
 "So there I was surrounded by all these scary creatures
 They were even scarier than what Microsoft call features"
 - C64Mafia: Forbidden Forest (Don't Go Walking Slow).
  
            
             |   |   
            
        
 
            
         
                   Ukendt (11-12-2006) 
         
	
            | Kommentar Fra : Ukendt | 
  Dato :  11-12-06 19:40 |  
  |   
            
 >
 > Volatile betyder i sig selv at der kan være sideeffekter. Compileren
 > gør bare opmærksom på at den ikke garanterer rækkefølgen af disse.
 >
 
 Og hvorfor er det at den ikke skal gøre det ved funktionskald så ?
 
 tpt
 
 
  
            
             |   |   
            
        
 
            
         
                    Kent Friis (11-12-2006) 
         
	
            | Kommentar Fra : Kent Friis | 
  Dato :  11-12-06 19:58 |  
  |   
            Den Mon, 11 Dec 2006 19:40:09 +0100 skrev Troels Thomsen:
 >
 >>
 >> Volatile betyder i sig selv at der kan være sideeffekter. Compileren
 >> gør bare opmærksom på at den ikke garanterer rækkefølgen af disse.
 >>
 >
 > Og hvorfor er det at den ikke skal gøre det ved funktionskald så ?
 
 "Skal gøre"? Der er ingen der siger at compileren *skal* give en
 warning, kun at der er grund til at gøre det.
 
 Det er der for så vidt også ved funktionskald, det kommer an på
 funktionen. De fleste funktioner er enten eller - dem der har
 sideeffekter bruges normalt ikke i en beregning (som mit eksempel
 med printf()+printf(), hvor tit ser man lige det?), og dem der
 bruges i beregninger har ingen sideeffekter.
 
 Compileren kan ikke se forskel, og da langt de fleste funktionskald
 ikke giver problemet, er der ingen grund til at give en warning. At
 gøre det ville give 100-vis af uinteressante warnings, og selv hvis
 der var en enkelt imellem hvor det er et problem, ville man ikke
 opdage det fordi den er gemt imellem de andre.
 
 Med variable kan compileren derimod se forskel på variable med
 sideeffekter (volatile) og uden (ikke volatile).
 
 Mvh
 Kent
 -- 
 "So there I was surrounded by all these scary creatures
 They were even scarier than what Microsoft call features"
 - C64Mafia: Forbidden Forest (Don't Go Walking Slow).
  
            
             |   |   
            
        
 
            
         
                     Ukendt (11-12-2006) 
         
	
            | Kommentar Fra : Ukendt | 
  Dato :  11-12-06 20:32 |  
  |   
            >>
 >> Og hvorfor er det at den ikke skal gøre det ved funktionskald så ?
 >
 > "Skal gøre"? Der er ingen der siger at compileren *skal* give en
 > warning, kun at der er grund til at gøre det.
 >
 
 Nu skal vi heller ikke koge ret meget mere suppe på den ged. Vi er vel 99% 
 enige, den sidste procent bunder måske i graden af hvor indlysende 
 referencerrne til standarden er.
 
 Ikke om det er en god ide eller ej, for det synes jeg også det er.
 
 tpt 
 
 
  
            
             |   |   
            
        
 
            
         
                  Anders J. Munch (11-12-2006) 
         
	
            | Kommentar Fra : Anders J. Munch | 
  Dato :  11-12-06 19:37 |  
  |   
            Troels Thomsen wrote:
 >> Netop, ja.
 >>
 > 
 > Så hvor er det at volatile betyder at
 > "at rækkefølgen er særligt  interessant for netop de her to variabler"
 
 Det er en fortolkning. Hvis du fortolker det anderledes, så skal du være 
 velkommen til det.
 
 - Anders
  
            
             |   |   
            
        
 
    
 
					
					 
			 | 
			
				
        
			 |