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

695

    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. Kiva kun SDP alkaa hallitsemaan Suomea

      Vanhat hyvät ajat taas palaavat ja kansa vaurastuu. Muistatteko vielä Sorsan aikakauden? Silloin Suomessa tehtiin jopa
      Maailman menoa
      263
      6527
    2. SDP:n lyhyt selviytymisopas

      1. Komitea on vastaus, oli kysymys mikä tahansa Jos maailma on muuttumassa tai jossain palaa, demari ei hätiköi. Ensin p
      Maailman menoa
      79
      5168
    3. Keskisen kyläkaupassa Temun vaatteita myynnissä?

      Siis mitä? Miksi siis ei itse tilaisi Temusta samoja.
      Maailman menoa
      96
      4087
    4. SÄHKÖLASKU 1600 EUROA Ei tässä ole mitään järkeä

      https://www.is.fi/taloussanomat/art-2000011804443.html Kyllä täysin huijausta nämä sähkömarkkinat. Varsinkin pörssisähk
      Maailman menoa
      268
      3562
    5. Säästäminen on typerää, muistakaa äänestää demareita

      Säästäminen on typerää, koska aiheuttaa vain talouden taantumista ja lopulta tappaa potilaan. Demareiden tapa on satsat
      Maailman menoa
      63
      3334
    6. Toivoisitko

      Toivoisitko, että kaivattusi olisi introvertimpi tai extrovertimpi? Itsenäinen tai tarvitsisi enemmän apua/sinua? Osoit
      Ikävä
      146
      3109
    7. Olli Rehn: Eläkkeistä pitää leikata. Nyt tuli Lindtmanille kauhun paikka

      jos johtaa seuraavaa hallitusta. Purra: eläkkeisiin ei kosketa. Eikä tällä hallituskaudella varmasti kosketa, mutta seur
      Maailman menoa
      235
      2694
    8. Venäläiset varkaudessa

      Ja venäjä mieliset. Teitä kiinnostaa toisinajattelijat ja trafikista päätellen aika paljonkin. Kunhan aika koitaa tulee
      Varkaus
      273
      2032
    9. SDP:n budjetin peruskivi: "Rahaa nimittäin on!"

      Demarien talouspolitiikan ydin on usein tiivistetty klassiseen meemiin: rahaa on, kunhan se on jonkun muun rahaa. Vuoden
      Maailman menoa
      43
      1568
    10. Lupajaoston esityslista

      Ilmoitus rakennusvalvonntaan luvattomasta rakentamisesta. esityslistan 6pykälä Kyse on kulttuuritalon rakentamisesta jo
      Pyhäjärvi
      49
      1455
    Aihe