Kääntäjän bugiko?

ihmettelevä_testailija

Eli minulla on seuraavanlainen metodi:

procedure TForm1.Test(ASrc : Integer; ASrc2 : Integer);
var
P : PByte;
begin
P := @ASrc; // P = 0x12F5BC
ShowMessage(IntToStr(Integer((P^))));

Dec(P, 4); // P = 0x12F5B8

//P := @ASrc2; // P = 0x12F5B8

// Näyttää väärän arvon kun Dec käytössä vaikka
// Osoite on sama kuin suoralla sijoituksella, miksi, eli kun käytän suoraa sijoitusta (kommentoitu) tuo näyttää oikein?
ShowMessage(IntToStr(Integer((P^))));
end;

En ymmärrä miksi tuo näyttää tuon viimeisen arvon päin mäntyä, kutsu on seuraavanlainen:
Test(5,8);

Delphi on CodeGear™ Delphi® 2007 for Win32® R2 Version 11.0.2804.9245

5

834

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • hemmoit

      Jäi vähän epäselväksi mikä on ko koodin tarkoitus...

      Mutta miksi PByte (Osoitin 8 bittiseen arvoon) 32 bittiselle integerille ? eikö PInteger ole olemassa...

      Haluatko nyt lisätä ASrc arvoon 4, vai yritätkö saada selville ASrc2:sen osoiteen pinossa (joka olisi kikkaillua) ?

      • Ihmettelevä_testailija

        Joo, tosiaan tarkoitus oli saada selville tuon pinon logiikka/arvot, aloittelija kun olen, osaatko siis kertoa tarkemmin kuinka tuon teen, teoria on kyllä hallussa, mutta eipä tuo käytäntö oikein. Eikö tavu pointteri tuossa ole ihan ok?


      • öty-
        Ihmettelevä_testailija kirjoitti:

        Joo, tosiaan tarkoitus oli saada selville tuon pinon logiikka/arvot, aloittelija kun olen, osaatko siis kertoa tarkemmin kuinka tuon teen, teoria on kyllä hallussa, mutta eipä tuo käytäntö oikein. Eikö tavu pointteri tuossa ole ihan ok?

        Dec(P, 8) ... Taitaa olla 64 bittinen voit tietenkin käyttää tavupointteria mutta jos laitat 255 suuremman luvun niin huomaat mitä tapahtuu, jos taas "P:Pinteger" niin pitää olla Dec(P,2) eli vähennetään 2 integeriä Kokeile myös "pointer" ja "PWord"


    • Anonyymi00004

      On hieman epäselvää, MITÄ haluat tuolla ShowMessagella näyttää.

      Mutta:

      ShowMessage(IntToStr(Integer((P^))));

      Koska tuon sisimmäinen osa on Integer((P^)), niin tuo näyttää ARVOn, johon P osoittaa.

      Jos haluaisit näyttää muistiosoitteen, johon P osoittaa, niin:

      1) Silloin tuon pitäisi sensijaan olla Integer((P)) - tosin sillä saisit tulostettua tuon muistiosoitteen 10-järjestelmän numerona.

      Siksi:

      2) Jos haluat muistiosoitteen heksadesmiaalimuodossa, tuo pitäisi muuttaa näin:

      ShowMessage( '$' + IntToHex(Integer(P), 8) );


      Lisäksi: Ylläoleva on oikein, kun kyseessä on 32 -Bittinen ohjelma.

      Jos olisi 64 -Bittinen ohjelma, niin vaatisi muutamia muutoksia, koska silloin myös muistiosoitteet olisivat 64 -Bittisiä sen sijaan että ne ovat 32 -Bittisiä 32 -Bittisisissä ohjelmissa.

      Debuggerilla (Delphi 7) nuo osoitteet saa näkyviin:

      View / Debug Windows / CPU

      CPU -rekisterien alapuolella näkyy pinomuistialue, ja sitä voi vierittää rullauspalkilla.

      • Anonyymi00005

        Onnea vaan yritykselle tavoittaa aloittaja 17 vuoden jälkeen..


    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Riikka ei suostu laskemaan bensan hintaa

      Sanna laski esimerkiksi sähkön arvonlisäveron 10 prosenttiin, jonka Riiikka anosti 25,5 prosenttiin. Sannan aikaan bens
      Maailman menoa
      11
      2754
    2. Vain vasemmistohallitus saa minut menemään töihin

      Änkyräkapitalistien sortaessa kansaa en laita rikkaakaan ristiin. Elän mielummin Kelan tuilla, ja jos niitä leikataan, n
      Maailman menoa
      109
      2580
    3. Mitä kirjainta kaipaat?

      Pitkästä aikaa tämmöistä. Onko kirjain muuttunut edellisestä. ☺️
      Ikävä
      178
      2452
    4. EK: Suomi tarvitsee vuosittain 45 000 maahanmuuttajaa

      Senpä takia Riikkakin laulaa sen lauluja kenen leipää syö. Viime vuonnahan Suomeen muutti 50 tuhatta ulkomaalaista. htt
      Maailman menoa
      158
      2092
    5. Oliko se oikeasti epäselvää

      sinulle että olin ihastunut sinuun? (Ymmärrän että siitä on aikaa, eikä voi olettaa että kaikkea muistaisi tai että men
      Ikävä
      124
      1664
    6. Kristityt kastoiva alunperin upottamalla - upotuskaste annettiin vain uskoon tulleille aikuisille

      Raamatussa on käännösvirhe. Kaste tulisi olla upottaa veteen, jota kreikan sana baptizo tarkoittaa. Aluseurakunta kast
      Kaste
      458
      1119
    7. Nyt mä vihaan sua kyllä

      Jos sä oot oikeasti tämä takana! En ois ikinä susta uskonut! 😠☹️
      Ikävä
      84
      868
    8. Mitä tekisit ensimmäiseksi??

      Jos hänet näkisit kahden kesken!!
      Ikävä
      45
      787
    9. Kievarin pöydät

      Minkä helvetin takia kievarissa on laitettu pöytä laulajan taakse. Siellä huutavat nuoret niin että et omaa ääntäsi kuul
      Suomussalmi
      15
      732
    10. Muslimiyhteisö jyrähti - Kova vaatimus Orpolle ILtalehti

      Eiköhän se ala olla aika pistää stoppi noille muslimien vaatimuksille Suomessa ? Ei Suomessa ole pakko oll
      Maailman menoa
      151
      723
    Aihe