Ord()関数を作るには?

解決


As  2012-05-08 08:08:17  No: 42129

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

n:integer;
s:string;

n:=ord(s[2]);

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


Mr.XRAY  2012-05-08 09:07:34  No: 42130

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

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

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

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

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


Mr.XRAY  2012-05-08 09:15:40  No: 42131

もしかして,

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

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


けど  2012-05-09 07:03:25  No: 42132

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

だそーです


As  2012-05-09 07:21:42  No: 42133

今晩は。

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

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

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

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

よろしくお願いします。


tor  2012-05-09 08:06:35  No: 42134

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

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

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


Nov  2012-05-09 08:09:26  No: 42135

こんばんわ。

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

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


Mr.XRAY  2012-05-09 08:30:52  No: 42136

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


Mr.XRAY  2012-05-09 08:39:32  No: 42137

>文章には

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


tor  2012-05-09 08:41:16  No: 42138

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

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


Nov  2012-05-09 09:25:25  No: 42139

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


As  2012-05-11 00:11:24  No: 42140

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

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

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

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


As  2012-05-11 00:17:42  No: 42141

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

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


As  2012-05-11 01:12:38  No: 42142

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

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

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

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加