Results 1 to 12 of 12

Thread: SDL: probleem bij porten Delphi code naar FPC

  1. #1

    SDL: probleem bij porten Delphi code naar FPC

    Van http://www.savagesoftware.com.au/Del...listmodes.html
    Code:
    var
      modes: PPSDL_Rect;
      i: integer;
    begin
      modes := SDL_ListModes(nil,SDL_FULLSCREEN or SDL_HWSURFACE);
    ...
      WriteLn( 'Available Modes' );
      for i := 0 to modes[i] - 1 do
        WriteLn( Format( ' %d x %d', [ modes[i].w, modes[i].h ] ) );
    Het is gelukt om de laatste regel te porten maar de tweede laatste lukt niet. Hoe kan modes[i] - 1 ooit een integer uitkomen? Ik heb al length(modes) geprobeerd maar dat lukt ook niet.

  2. #2
    Dit lijkt me een bug in de docs. Ook in Delphi zal dit niet werken.

    Je moet maar hopen dat die lijst met nodes eindigt met een nil-pointer en dan ipv For i:=0 ... doen
    Code:
      i:=0;
      while modes[i] <> Nil do
      begin
        WriteLn( Format( ' %d x %d', [ modes[i].w, modes[i].h ] ) );
        inc(i);
      end;
    edit:
    als ik de C-code bekijk voor listmodes blijkt dit inderdaad het geval, daar doen ze
    Code:
      for(i=0;modes[i];++i)
        printf("  %d x %d\n", modes[i]->w, modes[i]->h);
    Last edited by MieRoels; 05-Nov-04 at 16:19.

  3. #3
    Dat werkt. Bedankt.

  4. #4
    Sorry dat ik deze post weer naar boven haal. In de ObjFpc mode werkte de volgende regel:

    Code:
    comboBox1.addElement(intToStr(modes[i]^).w) + 'x' + intToStr((modes[i]^).h));
    Maar ik heb de mode veranderd naar Delphi omdat ik een fout kreeg over een Override procedure en nu krijg ik de foutmelding "Array type required". Iemand een suggestie voor een oplossing? Als ik de [i] weg haal compileert het wel maar dan krijg ik maar één van de mogelijke modes. Dit is de definitie in de header:

    Code:
      PPSDL_Rect = ^PSDL_Rect;
      PSDL_Rect = ^TSDL_Rect;
      TSDL_Rect = record
        x, y: SInt16;
        w, h: UInt16;
      end;
    Last edited by gnome; 08-Sep-05 at 19:56.

  5. #5
    In Delphi gebruik je dan:
    Code:
      modesarray= array[0..eenOfAndereBovengrens] of PPSDL_Rect;
      modesarrayptr = ^modesarray;
    en je zorgt er voor dat modesarrayptr naar je modes wijst.
    Last edited by StephanEggermon; 09-Sep-05 at 10:31. Reason: foutje verbeterd

  6. #6
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    (reden is dat FPC toestaant p^[x] te noteren als p[x]. Delphi staat dat alleen toe voor bepaalde "speciale" types, zoals pchar.


    Edit2: de delphi notatie is dus modes^[i]^ maar dan moet modes inderdaad eer array type worden
    Last edited by marcov; 09-Sep-05 at 10:34.

  7. #7
    Ik heb het volgende veranderd:

    Code:
      modesarray = array of PPSDL_Rect;
      modesarrayptr = ^modesarray;
    En ik heb "modes: PPSDL_Rect;" veranderd door "modes: modesarrayptr;". Ik krijg de volgende foutmelding: 'Incompatible types: got "PPSDL_Rect" expected "modesarrayptr"'.

    Ik neem aan dat ^arr ^modesarray moet zijn?

  8. #8
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Ja en nee. Normaal wel, maar je maakt het zaakje nu nog onderzichter door dynamische arrays te gebruiken, die al pointers zijn. Die kan je denk ik gewoon casten.... als je durft.

  9. #9
    array of PPSDL_Rect gaat niet werken. Dynamische arrays zijn reference counted, hebben een verborgen lengte en mag je niet ^-en. Gewoon casten

  10. #10
    Dat compileert wel maar geeft verder geen uitput (alle elementen van de array zijn nil). Een mogelijkheid is dat ik de code verplaats naar een ander unit met mode ObjFpc of dat ik de mogelijke video modes opvraag via X11 en de Win32 api. Waarschijnlijk wordt het dat laatste omdat ik het liefst in elke unit dezelfde mode gebruik. Bedankt voor de hulp alleszins.

  11. #11
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Het type wordt in delphi mode zoiets:

    Code:
    const y =10;  // weet niet meer welke compprecies hoeveel.
    
    type TPsdl_rectarray = array[0..(maxint div SIZEOF(PSDL_RECT))-y] of PSDLRECT;
            ptpsdlrectarray = ^TPsdl_rectarray;

  12. #12
    Dat werkt wel, bedankt!

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Similar Threads

  1. Replies: 5
    Last Post: 10-Feb-04, 11:58
  2. Van Delphi TColor naar HTML kleuren
    By Marcel in forum Tiphoek
    Replies: 0
    Last Post: 25-Jul-02, 00:29

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •