Delphi Can

Orjinalini görmek için tıklayınız: Pascal / Fpc ascii write
Şu anda (Arşiv) modunu görüntülemektesiniz. Orjinal Sürümü Görüntüle internal link
Merhaba,
Lisede ki bilgisayar öğretmenimizin turbo pascal 7 ile yazmış olduğu snake oyunu vardı eski dosyaları karıştırırken buldum turbo pascal 7 16 bit olduğu ve windows 10 da çalışmadığı için freepascal ile compile etim hata vermedi ama çalıştırdığımda karakterler bozuk görünüyordu örnek çerçeve procedurunde ascii karakterleri yanlış geliyordu devpascal kurdum onunla compile etim çalıştırdım karakterler v.s her şey düzgün yılan çok yavaş hareket ediyordu delay değerlerini düşürdüğümde hızlandı normale döndü.

Aşağıdaki kodu windows xp üzerinde turbo pascal 7 ile çalıştırdığımda düzgün, windows 10 devpascal düzgün , windows 10 free pascalda bozuk

write(#187);
olan kısımları
write(chr(187));
olarak ta değiştirdim bir şey değişmedi.
uses crt;
var
i: integer;
s: string;
x1,
x2,
y1,
y2,
renk:integer;
procedure cerceve(x1,x2,y1,y2,renk:integer );(* procedure lerin  bulundugu  yerin  basi *)
var
k,i:integer;
begin
    For i:=y1+1 to y2-1 do begin (*dikey ‡izgilerin  baŸlangc*)
        gotoxy(x1,i);textBackground(renk);textcolor(white);write(#186);
        gotoxy(x2,i);textBackground(renk);textcolor(white);write(#186);
    end;                         (*dikey ‡izgilerin  sonu*)
    for i:=x1 to x2 do  begin (*yatay ‡iz§ilerin  baŸlangc*)
        if i=x1 then begin
           gotoxy(i,y1);textBackground(renk);textcolor(white);write(#201);
           gotoxy(i,y2);textBackground(renk);textcolor(white);write(#200);
            end else begin
            if i=x2 then begin
               gotoxy(i,y1);textBackground(renk);textcolor(white);write(#187);
               gotoxy(i,y2);textBackground(renk);textcolor(white);write(#188);
               end else begin
               gotoxy(i,y1);textBackground(renk);textcolor(white);write(#205);
               gotoxy(i,y2);textBackground(renk);textcolor(white);write(#205);
            end;
        end;
    end; (*yatay ciz§ilerin sonu*)
for i:=y1+1 to y2-1 do  begin(*cercevenin  i‡ini boyar*)
     for k:=x1+1 to x2-1 do  begin
        gotoxy(k,i);textBackground(renk);textcolor(renk);write(#32);
         end;
     end;
end;(* procedure lerin  bulundugu  yerin  sonu*)

begin
clrscr;
x1:=25;x2:=55;y1:=8;y2:=17;renk:=13;
cerceve(x1,x2,y1,y2,renk);
readln;

end.
şunu farketim
klavyeden Alt + 186 tuşuna basınca ║ işareti geliyor ama Alt + 0186 tuşuna basınca º geliyor bende ki durumda benim istediğim ║ gelmesi.
ilginç olanı
var
i: integer;
s: string;
begin
for i := 0 to 255 do
   begin
   s:='a';
   case (i) of
   32..47,
   58..64,
   91..96,
   123..255 : s:='Ozel : ';
   48..57  : s:='Sayi  : ';
   65..90,97..122: s:='Harf : ';
   end;

    if s<>'' then
    writeln(s,' ',i,' ',chr(i));
   end;

end.
bu kodu çalıştırdığımda i değişkeni 186 olduğunda ekrana ║ yazıyor ama aynı mantıkta yeni dosyada
uses crt;
var
i: Integer;
begin
i:= 186;
writeln(Chr(i));
readln;
end.
kodlarını çalıştırdığımda º sonucunu veriyor. farkı nedir anlamadım.
Bence Codepage ile alakalı. Deneme şansım yok ama şuraya bakabilir misiniz(Özellikle Console encoding'in değiştirildiği bölüme):
http://wiki.freepascal.org/Lazarus_with_...UTF-8_mode
Kesin olmamakla birlikte denemelerimde;

ALT + XXX şeklinde vuruş seçili karakter seti (2^8) için , başına sıfır ekleyip ALT + 0XXX şeklinde vuruş unicode (2^16) karakter bastırıyor.

Bunu sağlamalısın.
free pascal da karakterleri http://www.fileformat.info/info/unicode/.../index.htm sayfasında ki UTF-16 hex değerleri ile
örnek write(#$2551); şeklinde yazdırdığımda oluyor ama bir tuhaf oluyor :Smile solda resimde devpascal ve turbo pascal daki ascii kod ile yazdırdığım sonuç sağda aynı karakterleri free pascal ile utf16-hex değerleri ile yazdırdığım sonuç.
kbR7Py.png
crt uniti işi karıştırıyor
crt unitini kullanmazsam writeln(chr(186)); çıkış olarak ║ veriyor
uses crt; dediğimde writeln(chr(186)); çıkış olarak º veriyor.
https://github.com/newpascal/freepascal/...win/crt.pp
crt unitinde unicode ile ilgili bir tanım göremedim orada uses windows; var onu inceleyeğim yine de malumatı olan yazarsa müteşekkir olurum.
(22-04-2017, Saat: 12:48)masteryoda Adlı Kullanıcıdan Alıntı: [ -> ]crt uniti işi karıştırıyor
crt unitini kullanmazsam writeln(chr(186)); çıkış olarak ║ veriyor
uses crt; dediğimde writeln(chr(186)); çıkış olarak º veriyor.
https://github.com/newpascal/freepascal/...win/crt.pp
crt unitinde unicode ile ilgili bir tanım göremedim orada uses windows; var onu inceleyeğim yine de malumatı olan yazarsa müteşekkir olurum.

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}


uses
  System.SysUtils;

type
  TrString = type Ansistring(775); // codepage de latin-7 olarak geçer


function GetTrString(const Input: array of Byte): TrString;
begin
  SetLength(Result, Length(Input));
  if Length(Result)>0 then
    Move(Input[0], Result[1], Length(Input));
end;

begin
  try
    { TODO -oUser -cConsole Main : Insert code here }
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;


  writeln(GetTrString([186,187]));

end.

Ayrıca codepage listesi; https://en.wikipedia.org/wiki/Code_page
DOS kısmını baz alın
(22-04-2017, Saat: 13:11)esistem Adlı Kullanıcıdan Alıntı: [ -> ]Ayrıca codepage listesi;  https://en.wikipedia.org/wiki/Code_page
DOS kısmını baz alın
 http://www.fileformat.info/info/unicode/.../index.htm sayfasından write(#$2551); şeklinde kullanımda da sonuca ulaşabildim fakat resimde sağda olduğu gibi birşeylerin değiştiği belli sizin örnekteki kodla da write(#$2551); aynı yere çıkıyor.