Ord()関数を作るには?

解決


As  2012-05-07 23:08:17  No: 42129  IP: 192.*.*.*

XE2を使って、2009で作ったプログラムを実行させると、Ord()関数のところでエラーになります。

n:integer;
s:string;

n:=ord(s[2]);

Int64では使えないようですが、作れないでしょうか。
使い方が悪いのかもとも思いますが、ご存知の方、ご教授願います。

編集 削除
Mr.XRAY  2012-05-08 00:07:34  No: 42130  IP: 192.*.*.*

こんにちは,Mr.XRAYです.

>Int64では使えないようですが、

何がInt64で使えないのですか?

>Ord()関数のところでエラーになります。

どんなエラーが出るのですか?

編集 削除
Mr.XRAY  2012-05-08 00:15:40  No: 42131  IP: 192.*.*.*

もしかして,

Int64では使えない ---> 「Int64が使えない」の間違い?

とすると,どこでInt64が使えないのでしょうか?

編集 削除
けど  2012-05-08 22:03:25  No: 42132  IP: 192.*.*.*

http://docwiki.embarcadero.com/Libraries/ja/System.Ord
Ord は Int64 値では動作できません。

だそーです

編集 削除
As  2012-05-08 22:21:42  No: 42133  IP: 192.*.*.*

今晩は。

皆さん、ありがとうございます。

コンパイルはできます。
しかし、実行すると、エラーになります。
特定するのに、時間がかかりました。

で、helpで調べると、Int64では動作できないと書いてありますが、
対処法が示されていません。

作るしかないかなと思うんですが、作成方法が分かりません。

よろしくお願いします。

編集 削除
tor  2012-05-08 23:06:35  No: 42134  IP: 192.*.*.*

Ordは引数として、Int64以外の任意の順序型を取ります(Charも順序型の一種です)
そのヘルプの説明は「Int64以外の順序型」ということを言っているだけで、問題とはまったく関係ありません。

XE2ということだとAnsiString⇔UnicodeStringの関係かとも思いましたが
WideCharの範囲は16ビット(#$0000〜#$FFFF)だから別に問題ないですよね。
同じコードでテストしてみましたが(もちろんsには 'テスト' みたいな文字列を入れて)コンパイルも実行も正常にできましたよ。

> コンパイルはできます。
> しかし、実行すると、エラーになります。
具体的なエラーメッセージを書いてくれませんか? エラーメッセージは問題を特定するための非常に重要な情報です。
上にも書いたようにそのコードだけでは問題が再現しないので、実際に再現する最小限のコードも示してもらえると有り難いです。

編集 削除
Nov  2012-05-08 23:09:26  No: 42135  IP: 192.*.*.*

こんばんわ。

使い方は  Ord(列挙型)  だと思いますが、Int64の順序値を持つ列挙型なんて
どうっやって作ってるんでしょう?(自分は作れません...)

ちなみに、順序値は、キャストでも値は得られますので、Ord64(?)は作る必要はないかと。
以下の3つの例は同じ結果が得られました。
 n := Ord(X);
 n := Integer(X);
 n := Int64(X);         // 意味があるか分かりませんが...

編集 削除
Mr.XRAY  2012-05-08 23:30:52  No: 42136  IP: 192.*.*.*

いや,その,あの,スミマセン.
その前に,質問された方の文章には,Int64っていうのが
どこにも,ないような気がするんですけど,

編集 削除
Mr.XRAY  2012-05-08 23:39:32  No: 42137  IP: 192.*.*.*

>文章には

失礼しました.「コードには」の間違いです.

編集 削除
tor  2012-05-08 23:41:16  No: 42138  IP: 192.*.*.*

そう、Int64はまったく関係ありません。
ヘルプに「Int64は使えない」と書いてあるので、質問者さんが「エラーになるのはこのせいだ」と早合点しているだけだと思います。

上にも書いたように、関数の使い方自体に問題は見受けられませんし、テストしてもエラーは再現しません。
どこか別の所に原因があると思うのですが、後は詳細な情報待ちですね。

編集 削除
Nov  2012-05-09 00:25:25  No: 42139  IP: 192.*.*.*

失礼しました...おととい出直します。

編集 削除
As  2012-05-10 15:11:24  No: 42140  IP: 192.*.*.*

皆さん、こんにちは。
昨日は、家にいませんでしたので、返事できませんでした。
早速、下記のように変えて、実行しましたが、
「charとintegerには互換性がありません」というエラー表示が出て、コンパイルできません。

var
  S: string;     { 変換する文字列 }
  n: widechar;   
begin
  s:=edit1,text;
  n:=Ord(S[2]);

もとに反して実行した時のエラーは、
「アドレス000000000○○○○で、アドレス000000000000****に対する読み取り違反が起きました。」
です。もちろん、2009でコンパイルするとこのようなエラーは起きません。

また、どうぞよろしくお願いします。

編集 削除
As  2012-05-10 15:17:42  No: 42141  IP: 192.*.*.*

失礼しました。
n:=ord(widechar(s[2]));
とするんでしたね。

ありがとうございました。
早速試してみます。

編集 削除
As  2012-05-10 16:12:38  No: 42142  IP: 192.*.*.*

ありがとうございました。

無事に実行できるようになりました。

今までの経験では、まだまだいろいろと問題が出てくると思われます。

その節は、またお願いします。

編集 削除