[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 05/09 09:01 / Filesize : 272 KB / Number-of Response : 983
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Pascal の初心者用の質問・相談所



1 名前:デフォルトの名無しさん [02/01/02 01:46]
Pascal の初心者用の質問・相談所
コンソールのみ。GUI は扱いません。
「Cをやったけど難しいので、やっぱりPascalからぼちぼちやるぅ」という人向け。

コンパイラダウンロード
www.vector.co.jp/vpack/filearea/win95/prog/pascal/index.html

ちなみにDelphiは
「モナーの *やさしい* Delphi質問スレ」
pc.2ch.net/test/read.cgi/tech/1003113413/

756 名前:デフォルトの名無しさん mailto:sage [03/11/19 11:37]
>pascalでは配列を関数には渡せないよね?

いや…渡せるけど
procedure A(B: array[C..D] of Integer); みたいな。
Delphiならprocedure A(B: array of Integer); で範囲はLow/Highで取る。

757 名前:デフォルトの名無しさん mailto:sage [03/11/19 12:46]
いや、勘違いだったら失礼。

>>756
そのC..Dが変数でもできたっけ?
>>755
ポインタで渡すのが確実か。確かに。


758 名前:デフォルトの名無しさん mailto:sage [03/11/19 18:31]
>>754
渡せるぞ。ちゃんと宣言すれば。以下参照。

Type
  TIntArray = array[LO..HI] of integer;
var
  A : TSomeArray;
procedure DoSomething(B : TIntArray);

として(LOとHIは定数で適当に宣言されているとする)、
  DoSomething(A);
とすればちゃんと呼び出せるぞ。


>>756
手続き宣言の場所で直接配列を宣言すると、処理系に
よっては「違う型と見なされて配列を渡せない」事態にな
る可能性があるぞ。これは実装依存らしいから、絶対大
丈夫だとか絶対ダメだとか言えないのが面倒。


>>757
変数はダメです(処理系によっては大丈夫かも)。標準で
は定数しか受け付けません(というか実行時に大きさが
決まる配列自体が使えないはず)。

759 名前:756 mailto:sage [03/11/20 07:38]
>>758
いや、私が言いたかったのはオープン配列。
規格はよく知らないけど、ものの教科書では
procedure A(B: array[C..D] of Integer);
で、任意の長さの配列を渡せるらしい。C..Dには実引数の添え字範囲が入る、らしい。
(もっとも、対応しているコンパイラは知らないけどね)
追記しているようにTP系(FreePascal/Delphi)では同じ機能はあっても構文が違う。

760 名前:デフォルトの名無しさん mailto:sage [03/11/20 08:44]
たぶん、環境に依存しないやり方としては、>758が
正しいと思う。見て、おぼろに思い出した。
だけど、わざわざ型を指定するのって、面倒なんだよね。


761 名前:デフォルトの名無しさん mailto:sage [03/11/20 18:20]
>>759
あー、オープン配列は使ったことがなかったので、完全に
忘れていました。書かれて初めて「そういうのがあったっけ
なぁ」という感じ。

私はオープン配列を使うような場面ではTListを使うので使っ
たことがありません。オープン配列を使わなきゃならないよ
うな手続きなんかも書かないし。

762 名前:デフォルトの名無しさん [03/11/20 22:44]
Why Pascal is Not My Favorite Programming Language
www.lysator.liu.se/c/bwk-on-pascal.html
誰か Why Pascal is My Favorite Programming Language を書いてください。

763 名前:デフォルトの名無しさん mailto:sage [03/11/21 00:07]
>>762
いいじゃん、放っておけば。大体用途の違う言語を
比較して「こっちが好きだ」って書いているような人
にろくなのはいないから。

分かっている人は「その言語はそういう用途には向
かない」とか「そういうことを目的として設計された言
語ではない」と書くと思う。

764 名前:デフォルトの名無しさん mailto:sage [03/11/21 11:38]
俺はタイプ量が多くなっても
if (hoge)と括弧を書くよりは
if hoge thenと書くほうが好きだ。

好きなところってそこしか思い浮かばなかった。
嫌いなところばっかり浮かんで来る・・・。



765 名前:デフォルトの名無しさん mailto:sage [03/11/21 12:19]
部分範囲型、集合型、配列の関係が好きだ…
C系の言語でこれらの概念を持ってるのがサッパリ無いのはどういうことか

766 名前:デフォルトの名無しさん mailto:sage [03/11/21 14:40]
ビットで済ましているんだろ。

767 名前:デフォルトの名無しさん [03/11/22 11:26]
お願いします

英単語を入力して、そのつづりを逆順にした文字列を作りなさい。
実行例
    英単語は?  beautiful
    逆順にしたつづりは  lufituaeb

できそうだと思ったんだけど挫折・・・

768 名前:デフォルトの名無しさん mailto:sage [03/11/22 13:48]
function ReverseString( S : String ) : string;
var
I, J : Integer;
begin
J:=Length(S);
SetLength( Result, J);
for I:=1 to J do
Result[i]:=S[J+1-I];
end;

実行してないんで動くかどうかはシラネ

769 名前:デフォルトの名無しさん mailto:sage [03/11/22 15:47]
program rev;
var st : string; i : integer;

procedure swap(var a, b : char);
var t : char;
begin
  t := a; a := b; b := t;
end;

begin
  readln(st);
  for i := 1 to length(st) div 2 do
    swap(st[i], st[length(st) - i + 1]);
  writeln(st);
end.

こんな感じ?

770 名前:デフォルトの名無しさん [03/11/22 17:51]
回すのは、半分くらいでいいのでは?

771 名前:デフォルトの名無しさん mailto:sage [03/11/22 17:52]
あっ、半分になってるよね。スレ汚しすまん。

772 名前:デフォルトの名無しさん mailto:sage [03/11/22 18:20]
■フォーマット

xx xx xx xx
-- -- -----
A B C

A... アイテムコード
B... 強化パラメータ ( 9C < 0 < 64 )
C... 使用回数 ( 00 01 < E8 03 < 00 00 )
※00 00 : 無制限
これどういういみでつか??

773 名前:デフォルトの名無しさん mailto:sage [03/11/22 19:12]
>>768
funciton ReverseString(S : String) : string;
var i : integer;
begin
  for i := length(S) downto 1 do
    result := concat(result, S[i]);
end;

これで良い気がする。

774 名前:768 mailto:sage [03/11/23 23:25]
ほぉ。concat関数ですか。知りませんでした。
でも
>function Concat(s1 [, s2,..., sn]: string): string;
>説明
>Concat 関数を使うと,任意の数の文字列を結合できます。各パラメータは文字列型の式です。結果はすべての文字列型パラメータ>の結合です。
>次に示すように,正符号演算子(+)を使っても Concat 関数と同じ結果が得られます。
>S := 'ABC' + 'DEF';
>参考正符号演算子の方が Concat よりも処理が速くなります。
正符号演算子では文字列の加算の「度に」文字列分のメモリの確保と開放が行われてる(と思う)ので
前もってメモリを確保してある>>768のほうが速いと思われます。
(文字列が長くなるに従って差は大きくなると思います。
つまり、
速度を求めるなら>>773氏の方法より>>768のほうがよろしいかと。

実際に試してないんで知らないけど。
添字の計算部分の差で負けたりして(w



775 名前:デフォルトの名無しさん mailto:sage [03/11/24 00:19]
>>774
うーん、確かに速度的には遅くなるかもしれないけど、
この関数をそんなに頻繁に使うとは思わないので、な
るべく単純な形の方が分かりやすいような気がする。

あと、以下の形にすると、日本語に対応するのも楽。

function ReverseString(S : string) : string;
var


776 名前:775 mailto:sage [03/11/24 00:23]
途中で書き込んでしまった。

function ReverseString(S : string) : string;
var i : integer;
begin
  for i := 1 to length(S) do
    result := concat(S[i], result);
end;

777 名前:デフォルトの名無しさん mailto:sage [03/11/24 17:04]
再帰バージョン

 function reverseString (a: string): string;
 begin
  if length(a) <= 1 then
   reverseString := a
  else
   reverseString := concat(reverseString(omit(a, 1, 1)), a[1]);
 end;

omitは omit(文字列,位置,文字数) で指定した部分を削除した文字列を返す,
THINK Pascal の組み込み関数。

778 名前:デフォルトの名無しさん mailto:sage [03/11/24 18:09]
>>775
単純さを求めるとなると手っ取り早い日本語対応は
function ReverseString(S : widestring) : widestring;
では?(w
>>776
>result := concat(S[i], result);
result := S[i] + result;
むしろこちらのほうが単純(直感的)かと。
ただconcat関数に慣れてないだけかも知れんが…

779 名前:デフォルトの名無しさん mailto:sage [03/11/24 18:34]
>ただconcat関数に慣れてないだけかも知れんが…

文字列連結に「+」が使える事にかえって驚く。
resultというのもDelphi独自の規格だよね。

780 名前:デフォルトの名無しさん mailto:sage [03/11/24 23:12]
>>778
widestringを使うのは環境にだいぶ依存しそう
ですけど(確かに単純と言えば単純だけど)。

concatを使うのはあくまで私のやり方ですので、
+の方が分かりやすければそちらで問題ありま
せん。

781 名前:デフォルトの名無しさん [03/11/25 00:22]
>>779
Turbo Pascalからの仕様ですね。

782 名前:デフォルトの名無しさん [03/11/25 08:07]
おながいします


正の整数を読み込み、30桁の数になるまでそれを2倍、2倍にしていき、
30桁の数になったら出力する。

桁数ってどうだっけ・・・

783 名前:デフォルトの名無しさん mailto:sage [03/11/25 09:34]
program Hoge;
{$APPTYPE CONSOLE}
var bignum : array [1..30] of Integer;
function keta: Integer; var i : Integer; begin
i := 30; while (bignum[i] = 0) and (i > 1) do i := i - 1;
keta := i; end; { keta }
procedure nibai; var i : Integer; begin
for i := 1 to 30 do bignum[i] := bignum[i] * 2;
for i := 1 to 29 do begin
bignum[i+1] := bignum[i+1] + bignum[i] div 10;
bignum[i] := bignum[i] mod 10; end;end; { nibai }
procedure print; var i : Integer; begin
for i := 30 downto 1 do Write(bignum[i]);end; { print }
procedure init; var i : Integer; begin
for i := 2 to 30 do bignum[i] := 0; bignum[1] := 1;end; { init }
begin init; while keta < 30 do nibai; print; end.

784 名前:デフォルトの名無しさん mailto:sage [03/11/25 09:49]
procedure init;
var i : Integer;
begin
Read(i);
bignum[1] := i;
for i := 1 to 29 do begin
bignum[i+1] := bignum[i] div 10;
bignum[i] := bignum[i] mod 10;
end;
end; { init }



785 名前:デフォルトの名無しさん [03/11/25 11:46]
>>767

program ensyu(input,output);
const msg ='英単語の綴りを逆順にします。';
var engword,downword:string[30];
Len,i :integer;
begin
writeln(msg);
write('英単語は?');
readln(engword);
Len:=length(engword);
for i:=Len downto 1 do
begin
downword:=downword+engword[i];
end;
writeln('逆順にした綴りは',downword,'です。');
readln;
end.





786 名前:デフォルトの名無しさん mailto:sage [03/11/25 12:41]
function ReverseString(S: String): String;
var
i, j : integer;
c : char;
begin
i := 1;
j := Length(S);
while i < j do begin
c := S[i];
S[i] := S[j];
S[j] := c;
i := i + 1;
j := j - 1;
end;
ReverseString := S;
end; { ReverseString }

787 名前:デフォルトの名無しさん mailto:sage [03/11/25 13:54]
激遅
function ketaketa(e : extended):integer;
begin
while true do begin
e:=e*2;
if log10(e)>=30 then break;
end;
ShowMessage(FloatToStr(e));
end;

788 名前:デフォルトの名無しさん mailto:sage [03/11/25 14:16]
procedure ketaketa(e : extended);
begin
while log10(e) < 30-1 do
e:=e*2;
ShowMessage(FloatToStr(e));
end;

789 名前:デフォルトの名無しさん mailto:sage [03/11/25 14:39]
procedure ketaketa(e : extended);
var
i : Integer;
begin
for i := 1 to Ceil((30-1 - log10(e)) / log10(2)) do
e := e * 2;
ShowMessage(FloatToStr(e));
end;

790 名前:デフォルトの名無しさん mailto:sage [03/11/25 14:52]
procedure ketaketa(e : extended);
begin
ShowMessage(FloatToStr(e * power(2, Ceil((30 - 1 - log10(e)) / log10(2)))));
end;

791 名前:デフォルトの名無しさん mailto:sage [03/11/25 15:14]
procedure ketaketa(e : extended);
begin
ShowMessage(FloatToStr(e * power(2, Ceil((30-1)*log2(10) - log2(e)))));
end;

792 名前:デフォルトの名無しさん mailto:sage [03/11/25 16:28]
function keta(e : Extended): Integer;
var
n : Integer;
begin
n := 1;
while e >= 10 do begin
n := n + 1;
e := e / 10;
end;
keta := n;
end;

procedure ketaketa(e : extended);
begin
while keta(e) < 30 do
e := e * 2;
ShowMessage(FloatToStr(e));
end;

793 名前:デフォルトの名無しさん mailto:sage [03/11/25 23:30]
>>787-792
extendedって30桁まであるのか?

794 名前:782 mailto:sage [03/11/26 03:27]
いろいろカキコ有難うございます。今日の授業で>>782を以下の.........の部分を埋めて作れと言われました。

program enshu(input,output);
const K=30;
var i,j,m,v, :integer
n :array[1..K]of integer;
begin
write('出発の値は?');
readln(m);
if m >0 then
begin
.............
while m<>0 do
begin
.............
end;
J:=J+1;
・・。



795 名前:782 mailto:age [03/11/26 03:28]
while j > 1 do
begin
for i:=K downto J do
n[i]:= 2*n[i];
for i:=K downto J do
begin
...............
end;
if n[i-1]<>0 then j:=j-1
end;
for i:=1 1 to K do
write(chr(n[i]+Ord('0')));
writeln
end;
readln
end.

スマソ全然わかんないです・

796 名前:デフォルトの名無しさん mailto:sage [03/11/26 09:14]
program enshu(input,output);
const K= 30;
var i,j,m : integer; {var i,j,m,v, : integer}
n : array[1..K]of integer;
begin
write('出発の値は?');
readln(m);
if m >0 then
begin
j := K;
while m<>0 do
begin
n[j] := m mod 10;
m := m div 10;
j := j - 1;
end;
J:=J+1;

797 名前:デフォルトの名無しさん mailto:sage [03/11/26 09:15]
while j > 1 do
begin
for i:=K downto J do
n[i]:= 2*n[i];
for i:=K downto J do
begin
n[i-1] := n[i-1] + n[i] div 10;
n[i] := n[i] mod 10;
end;
if n[j-1]<>0 then j:=j-1 { if n[i-1]<>0 then j:=j-1 }
end;
for i:= 1 to K do { for i:=1 1 to K do }
write(chr(n[i]+Ord('0')));
writeln
end;
readln
end.

798 名前:デフォルトの名無しさん mailto:sage [03/11/26 18:12]
do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1064150088&res=8
前にあったブラックジャックを作ってみた。
つくりかけだけど。

799 名前:デフォルトの名無しさん [03/11/27 20:00]
お願いします。
「・・・」の部分を埋めて作るように言われましたが、全然・・・。

氏名(全角7文字)、数学、英語の得点(100点満点)からなる個人データが保存されているファイルからデータを入力してそれぞれの合計点を計算し、合計点の大きい順に整列して表示するプログラムを作りなさい。

実行例 得点データを合計点順に整列します
データファイル名は? SEISEKI.DAT
氏 名 数学 英語 合計
あああああああ 100 59 159
いいいいいいい 80 80 160
・・・
program seiretu(input,output);
const nmax=100;
type index=1..nmax;
Person=record
name:string[14]
math,eng:0..100;
total:0..200;
end;


800 名前:799 [03/11/27 20:01]
続きです
Personarray=array[index] of person;
procedure sort(n:index;var x:personarray);
procedure exchangeperson(var A,B:person);

var temp:person;
begin
・・・
end;

var i,j:index;
begin
for i:=1 to N-1 do
for j:=N-1 downto 1 do
・・・
end;

var num:o..nmax;
i:index;
Student:personarray;
Infile:text;
Filename:string[80];
begin
・・・
end.

801 名前:デフォルトの名無しさん mailto:sage [03/11/27 20:25]
あのー、少しは自分でやった方がいいと思うよ?
せめて、自分が考えたものを書くとかしたほうが。

802 名前:デフォルトの名無しさん mailto:sage [03/11/27 22:18]
コンパイル通しただけだから、バグ取りは自分で
program seiretu(input,output);
const nmax = 100;
type index = 1..nmax;
Person = record
name : string[14];
math,eng : 0..100;
total : 0..200;
end;
Personarray = array[index] of person;
procedure sort(n : index; var x:personarray);
procedure exchangeperson(var A,B : person);
var temp : person;
begin
temp := A; A := B; B := temp;
end;
var i,j: index;
begin
for i:=1 to N-1 do
for j:=N-1 downto i do
if x[j+1].total < x[j].total then
exchangeperson(x[j+1], x[j]);
end;

803 名前:デフォルトの名無しさん mailto:sage [03/11/27 22:19]
var num : 0..nmax;
i : index;
Student : personarray;
Infile : text;
Filename : string[80];
begin
Write('データファイル名は?');
Readln(Filename);
i := 1;
Assign(Infile, Filename);
while not eof(Infile) do begin
Readln(Infile, Student[i].name, Student[i].math, Student[i].eng);
i := i + 1;
end;
num := i - 1;
sort(num, Student);
for i := 1 to num do
Writeln(Student[i].name, Student[i].math, Student[i].eng,
Student[i].total);
end.

804 名前:782 mailto:sage [03/11/28 11:52]
>>796-797
ありがとうございます



805 名前:デフォルトの名無しさん mailto:sage [03/11/28 19:49]
>>801
うん、私もそう思う。課題をそのまま丸写ししたのは、無視するか
どこが分からないか聞き直すのが良いと思う。

806 名前:801 mailto:sage [03/11/28 23:22]
>>805
無視は冷酷なんで。ヒントくらいかな、最初は。

807 名前:デフォルトの名無しさん mailto:sage [03/11/29 09:35]
THINK Pascalに詳しい方がおられるようなので、
ちょっとスレ違いだけど、質問。

THINK Pascalで、「アプリケーションはそのままで、
ライブラリで機能拡張するもの」は作れますか?
具体的には、「HyperCardとXCMD/XFCN」や
「フォトショップとプラグイン」
「MacOSと機能拡張やコントロールパネル」
みたいな関係のもの。

できるとしたら、大雑把に言って、どうやるんですか?

808 名前:デフォルトの名無しさん mailto:sage [03/12/01 17:08]
>>805
いや、別に何も考えずに教えてくださいといってるわけではないんですよ。
クラスみんなですごく悩みながらやってて、どうしても分からん問題だけ聞いてるんです。
ただ、これからは途中のわかるとこまで書き込むように心がけます。
これは言い訳なんですけど、授業では何もパスカルのこと教えないのにやたら難しい問題ばかり出す先生なので・・・

809 名前:デフォルトの名無しさん mailto:sage [03/12/02 21:44]
>>807
出来ないかも。

やり方は多分『(1)コードリソースを作って(2)それをメモリ上に読み込み、(3)それを呼び出す』
という手順でやっているのだと思う。(68Kの場合)

で、3番目の“呼び出し”はC言語なら出来るんだけど
THINK Pascalだとハンドルを関数/手続き扱いしなければならないのでかなり難しいと思う。
(コードリソースの作成はTHINK Pascalでも出来る。)


色々やってみた結果CodeWarrior Pascalで

 fPtr = function (a,b:integer):integer;

こんな感じで関数を型定義してやったらできた。
しかし、これをTHINK Pascalに持ってくると文法違反でコンパイルが通らなかった。

810 名前:809 mailto:sage [03/12/02 21:45]
CodeWarrior Pascalで実行できたソースコードの例
プラグイン側の関数は2数の和を返す関数。

 type
  fPtr = function (a,b:integer):integer; {←ここがTHINKでNG。型は必要に応じて変える}
  fHdl = ^fPtr;

 var
  plugHdl: fHdl;
  plugin: fPtr;
  c: integer;

 procedure loadPlugin; {とりあえずファイル名、リソースタイプ、IDは決め打ち}
  var
   iFileRef, iErr: integer;
 begin
  iFileRef := OpenResFile('pl1'); {プラグインファイルを開く}
  plugHdl := fHdl(Get1Resource('MyPL', 128)); {メモリ上に読み込み}
  iErr := FSClose(iFileRef);
 end;

begin
   loadPlugin;       {プラグインをファイルから読み込む}
   hlock(handle(plugHdl)); {ハンドルロック}
   plugin := plugHdl^; {一旦ポインタに移し替えないとダメっぽい}
   c := plugin(3,6);  {関数呼び出し。プラグインは2数の和を返す関数}

811 名前:デフォルトの名無しさん mailto:sage [03/12/02 23:03]
>>808
どうしても分からん問題だけ聞くのは良いんだけど、こっちは
どうしても分からなん問題かどうかなんて判断付かないし、問
題だけ書かれたら「ただ丸投げしている」と思われても仕方が
ないだろう。

あと、「分かるところまで書き込む」んじゃなくて、「分からない
ところだけ抜き出す」事をしてくれ。元の問題も分からず、ここ
まで分かりましたと書かれても答えようがないし、問題と分かっ
たところを書かれると「こっちが分からないところを探し出す作
業」をしなければならん。

分からないところを抜き出す作業が面倒と言うことはないと思
うが、「分からないところを抜き出す作業をミス」したり、間違っ
て解釈したりするかもしれん。それでお互い時間と数レスを費
やすかもしれないと思うと面倒くさい。

812 名前:デフォルトの名無しさん [03/12/02 23:26]
10進法で表現された数を
2進法、8進法、16進法の表現に変換するプログラムを書いてください。
ただし、入力する10進法の数は(16^4)-1=65535までです。
また、実際の実行例もお願いします。

813 名前:デフォルトの名無しさん mailto:sage [03/12/03 00:15]
IntToHex
といって見るだけ

814 名前:デフォルトの名無しさん mailto:sage [03/12/03 01:06]
>>812
**進法というのは分かっているのか? 分かっているとしたら
どこが分からないんだ? 分からないところだけを聞き直して
くれ。

あと、実行例くらい自分で実行して作ってもいいだろ。おん
ぶにだっこじゃ身につかんぞ。



815 名前:807 mailto:sage [03/12/03 08:39]
>>809,810
いろいろ試していただいたようで、ありがとうございます。
ハンドルを関数型で確保するのが無理、って事ですね。
仕方ないですね。型にうるさいのは仕様ですから。

型を指定しないで、普通のハンドルなりポインターで確保
して、いきなりそのアドレスをinlineでコールしたら・・・
って思ったけど、それだと変数の受け渡しが出来ませんね。


816 名前:デフォルトの名無しさん mailto:sage [03/12/03 08:41]
>>812
今までの課題よりも簡単に思えるけど。


817 名前:デフォルトの名無しさん [03/12/03 12:11]
function hoge(n, base: integer): string;
var
x: integer;
s: string;
begin
if (base <> 2) and (base <> 8) and (base <> 16) then
base := 16;
s := '';
repeat
x := n mod base;
if x < 10 then
s := chr(ord('0') + x) + s
else
s := chr(ord('A') + x - 10) + s;
n := n div base;
until n <= 0;
hoge := s;
end;

818 名前:デフォルトの名無しさん mailto:sage [03/12/03 15:25]
>実際の実行例もお願いします。
萎え

819 名前:デフォルトの名無しさん mailto:sage [03/12/03 18:13]
>>812
またおまえか

820 名前:809 mailto:sage [03/12/03 18:39]
>>815 (807)
できました!

最初、引数・返り値を同じにしたダミーの関数を作って
その関数を実行時に機械語の絶対ジャンプで上書きするというのをやってみたんですが
デバッガ(Lights Bug)で追うと、きちんと上書きされているにも関わらず
平然と元の関数を実行してるんですね。(失敗)


で、動作をMacs Bugで追ってみたところ、
どうやら関数のアドレスを取得すると
ジャンプテーブルのアドレスが帰ってくるみたいです。
で、普通に関数コールするとジャンプテーブルをショートカットして
元の関数がダイレクトに呼び出されているようです。

そこで関数を引数にした手続きを別に作成し、
そこから関数を呼び出してみたところ、
うまいこと、プラグインの関数が呼び出されました。

[通常の関数コール]→[目的の関数]
[関数、手続きを引数とした関数コール]→[ジャンプテーブル]→[目的の関数]

なお、inline関数の場合、関数のアドレス取得自体が出来ませんでした。(コンパイル時にエラー)
どこかにひとつ、その関数が作られるわけではなく
コードの随所にそのバイト列が単純に埋め込まれるようになっているからだろうと思います。

821 名前:809 mailto:sage [03/12/03 18:39]
THINK Pascalで出来るコードリソース呼び出し
 type
  funcOverWriteT = record {関数書換用の型}
    opCode: integer;   {JMP命令オペコード用領域}
    operand: longint;  {JMP先絶対アドレス用領域}
   end;
  funcOWPtr = ^funcOverWriteT;
 var
  fp: funcOWPtr; {ダミー関数アドレス保持}
  h: handle;   {プラグインアドレス保持}
  c: integer;

 function dummy_Func (a, b: integer): integer; {ダミー関数。形式はプラグインと合わせる}
 begin
  dummy_Func := 1 + a + b - 3 + 4;
 end;

 procedure Plugin_Caller (function f (a, b: integer): integer); {Plug-in呼び出し用手続き}
 begin
  c := f(3, 6);
 end;

begin
 h := loadPluginManual; {プラグインアドレス取得。>>810の手続きを関数にしたもの}
 hlock(handle(h));    {プラグインのハンドルロック}
 fp := funcOWPtr(@dummy_Func); {ダミー関数のアドレス取得}
 fp^.opCode := $4ef9;   {68KのJMP命令を上書き}
 fp^.operand := ord4(h^); {プラグインの絶対アドレスを上書き。ハンドル→ポインタを忘れずに}
 c := dummy_Func(3, 6); writeln(c); {失敗。ジャンプテーブルを経由しないので元の関数が呼ばれる。}
 Plugin_Caller(dummy_Func); writeln(c); {プラグイン呼び出し成功!!}

822 名前:デフォルトの名無しさん mailto:sage [03/12/03 21:17]
>>820,821
なんと!!できましたか!!すばらしい。小生の
知識不足からまだ理解も、再現も出来ていませんが、
希望が持てました。がんばってみます。

823 名前:812 [03/12/03 23:29]
>>817
ありがとうございました。
実行例もお願いします。

824 名前:デフォルトの名無しさん mailto:sage [03/12/03 23:39]
>>823
自分の所で実行してみなよ。
それが実行例。



825 名前:807,815,822 mailto:sage [03/12/04 13:10]
>>809,810
>>820,821
動きました。
Plugin_Callerを書き換えて変数を渡せるように
しても、ちゃんと動きました。
ありがとうございました。

826 名前:812 [03/12/04 18:26]
>>817
のプログラムの意味解説をお願いします。

827 名前:デフォルトの名無しさん mailto:sage [03/12/04 18:39]
>>826
お前やる気あんの?
全部分からない訳じゃないだろ?
分からないとこを聞けよ。
漠然とした要求をするな

828 名前:デフォルトの名無しさん mailto:sage [03/12/04 19:11]
>>817
これでも良さそう

const
  STR16='0123456789ABCDEF';
・・・略
  repeat
    x := n mod base;
    s := concat(STR16[x + 1], s);
    n := n div base;
  until n <= 0;
・・・略

829 名前:デフォルトの名無しさん mailto:sage [03/12/04 19:11]
>>826
解説するまでもない明解なプログラムだぞ。>817は。


830 名前:デフォルトの名無しさん mailto:sage [03/12/04 19:12]
>>826
意味って>>812のことじゃないの?

831 名前:デフォルトの名無しさん mailto:sage [03/12/04 20:24]
10÷2=5...0
5÷2=2...1
2÷2=1...0
1÷2=0...1

10=1010

この意味が分からなければ、
調べ直した方がいい。

832 名前:812 [03/12/04 21:38]
わからないのは以下の部分です。

>hoge(n, base: ): string;
>s: string;
hoge,n,base,string はどういう意味ですか??

>(base <> 2) and (base <> 8) and (base <> 16)
これはどういう意味ですか。

>base := 16;
>s := '';
>n mod base;
n mod baseとはどういう意味ですか。

>s := chr(ord('0') + x) + s
>s := chr(ord('A') + x - 10) + s;
chr,ordはどういう意味ですか。

>n div base;
これはどういう意味ですか。

>until n <= 0;
>hoge
ここもまるでわかりません

お願いします

833 名前:デフォルトの名無しさん mailto:sage [03/12/04 21:50]
>>832
ちっとは、Pascalの教科書を読んでおいでよ。
さすがにそれは、不勉強すぎです。

834 名前:デフォルトの名無しさん [03/12/04 21:51]
>>832
ちょいと812さん、mod divが分からないなんて…
ぶっちゃけpascalなんにも知らないと違います?(;´▽`A``



835 名前:812 [03/12/04 21:56]
>>834
そうなんです。
私は数学科で、pascalは何も知らないんです。
コンピュータの教科書に詳細な説明はないんです。
わかるのは
function,var,integer,if,then,elseといったものぐらいです。
そこであらためて
817の意味解説をお願いします。

836 名前:デフォルトの名無しさん mailto:sage [03/12/04 22:08]
>>835
Pascalの教科書を図書館で借りて読め。「分からないから
教えてくれ」というのは先生にしか言っちゃいけない言葉だぞ。

837 名前:デフォルトの名無しさん mailto:sage [03/12/04 22:22]
>>835
directory.google.com/Top/Computers/Programming/Languages/Pascal/Tutorials/

838 名前:817 mailto:sage [03/12/04 22:35]
hogeは関数名、nは変換する数値、baseは変換の基底、stringは文字列
baseが2,8,16以外だったらbaseを16にしてる。
n mod baseで一の位が分かる。
数値から文字への変換。'0'の次が'1'、'A'の次が'B'
n div baseは整数の割り算。base進数で一の位を削る
0になったら終了。関数の返り値をsにする。

839 名前:デフォルトの名無しさん mailto:sage [03/12/04 22:44]
>817さんが親切に>838のような解説を書いても、
>812にはさっぱり意味不明だろう。
pascalの教科書を探して読んで来ない限り、
どこまでいっても全く無駄。

教科書じゃなくても、pascalの初歩のページでも
せめて探して読んできなよ。


840 名前:デフォルトの名無しさん mailto:sage [03/12/04 22:49]
たとえば
ttp://grape.c.u-tokyo.ac.jp/~makino/kougi/jousho/pascal_memo.html

841 名前:805 mailto:sage [03/12/04 23:30]
やっぱり「何も考えずに教えてください」って言っているのと
変わらんな。やっぱり無視した方が良いかも。>>801

842 名前:809 mailto:sage [03/12/05 01:03]
>825
あ、できましたか。よかったですね。

843 名前:デフォルトの名無しさん [03/12/05 01:20]
6ケタの数を入力し、N個右にずらす(たとえばN=2だとすると123456を
を561234)にするにはどのようなプログラムにすればいいですか?

844 名前:デフォルトの名無しさん mailto:sage [03/12/05 01:40]
x := x div 10 + (x mod 10) * 100000 をN回繰り返せばいーんでないの



845 名前:デフォルトの名無しさん mailto:sage [03/12/05 04:00]
こいつ、課題を全部ここで訊いて済まそうとしているのか?
そんなやつに答える事はないと思うけど。>>ALL

846 名前:デフォルトの名無しさん mailto:sage [03/12/05 10:43]
10のN乗を使ってもいいね。

847 名前:デフォルトの名無しさん mailto:sage [03/12/05 10:56]
10のn乗だと、桁、大丈夫?

848 名前:デフォルトの名無しさん mailto:sage [03/12/05 12:59]
6乗までだから大丈夫でしょう。
function hoge(x, n: integer): integer;
const
k = 1000000;
var
i, j: integer;
begin
x := x mod k;
j := 1;
for i := 1 to n mod 6 do
j := j * 10;
hoge := (x mod j) * (k div j) + x div j
end;

849 名前:デフォルトの名無しさん mailto:sage [03/12/05 19:50]
>function,var,integer,if,then,elseといったものぐらいです。
えっ、?
>>hoge(n, base: ): string;
>>s: string;
>hoge,n,base,string はどういう意味ですか??
function分かってるんじゃなかったの?
しかも抜き出し方がおかしすぎだろう
>function hoge(n, base: integer): string;
これで何で分かる「単語」だけを消すかなぁ
>hoge(n, base: ): string;
ここでintegerを抜いて意味が分からないとは・・・レベル高杉(藁
ほんと基本から学んできてね?
というより、分からない単語があったら
まず
せめて
最低限
ヘルプで調べてね?



あかん、、突っ込みどころ大杉
根負けするわ

850 名前:デフォルトの名無しさん mailto:sage [03/12/05 20:03]
ひょっとして、質問してる>812は
自分の実行環境を持ってないのか?


851 名前:デフォルトの名無しさん mailto:sage [03/12/05 20:40]
winならDelphi
DOSならturbo pascal
macならTHINK Pascal
debianならgpc
linuxならKylix
ぜ〜んぶ無料


852 名前:デフォルトの名無しさん mailto:sage [03/12/05 20:48]
空いてる時間は大学のコンピュータにかじりついてでも
コードを書いてコンパイルしてとにかく試せ。

処理系が見つからなくてCへのコンバータ使ってたころもあったなあ。

853 名前:デフォルトの名無しさん mailto:sage [03/12/05 23:19]
Pascal入門
ttp://www.ics.kagoshima-u.ac.jp/edu/proen1/index.html

854 名前:デフォルトの名無しさん [03/12/12 00:28]
ほしゅすしゅしゅ(´・ω・`)ショボーン



855 名前:デフォルトの名無しさん mailto:sage [03/12/12 01:48]
では、保守ついでに、またもTHINK Pascalの質問。

コードリソースからToolBoxのルーチンを使うには、
コードリソースのプロジェクトに何を入れれば良い?


856 名前:デフォルトの名無しさん mailto:sage [03/12/13 01:05]
>>855
・Runtime.libを外してかわりにRSRCRuntime.Libを入れる。
・Interface.libはそのまま。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<272KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef