数列の・・・・・


ぺんね。  2008-08-27 05:28:45  No: 31665

先日以下の方法でHDDのシリアルを取得しました。
このシリアルに任意の計算をさせていです。

ソース##################################################
var
  VolumeSerialNumber,
 MaximumComponentLength,
 FileSystemFlags: Cardinal;
 VolumeName: array[0..260] of char;
 FileSystemName: array[0..260] of char;
begin
 GetVolumeInformation(
  'C:\', // ドライブ
  VolumeName, // ボリュームネームが入る
  260, // ボリュームネームを格納するバッファのサイズ
  @VolumeSerialNumber, // ボリュームシリアルナンバーが入る
  MaximumComponentLength, // ファイル名は何文字までか、が入る
  FileSystemFlags, // ファイルシステムの情報が入る
  FileSystemName, // ファイルシステムの名前が入る
  260 // ファイルシステムの名前を格納するバッファのサイズ
 );

  showMessage(inttostr(VolumeSerialNumber));
ソース##################################################

inttostr(VolumeSerialNumber)は9桁10桁の数列です
例えば、123456789として一つ一つをarrayに格納したいのですが。

よろしくお願いします。


monaa  2008-08-27 05:37:48  No: 31666

アルゴリズムの基本なのであえてソースは載せません。
i:integer;
i:=123;
この整数iの百の位、十の位、一の位の取得方法は?
単純に十進数なら百の位は100で割った値ですよね。


igy  2008-08-27 05:43:39  No: 31667

inttostr(VolumeSerialNumber) は文字列なので、
StrPCopy 関数とか使うのも、よいかもしれませんね。


ヒント  2008-08-27 06:29:17  No: 31668

ほれ
var
  hogehoge: string;
  hogechar:Char;
begin

  hogechar := hogehoge[65535];


ぺんね。  2008-08-27 06:58:42  No: 31669

だめです、、、アドバイスください。


igy  2008-08-27 07:40:14  No: 31670

だめというのは、何がどのようにだめなのですか?


ぺんね。  2008-08-27 07:58:10  No: 31671

StrPCopyというのが良くわからないのです。

inttostr(VolumeSerialNumber) は文字列なので

例えば、
i:integer;
i:=inttostr(VolumeSerialNumber);
では無理ですよね。

ということは、、、、


igy  2008-08-27 08:06:47  No: 31672

>StrPCopyというのが良くわからないのです。

inttostr(VolumeSerialNumber) は文字列なので、
StrPCopy関数を使って、配列にコピーすればよいのではないでしょうか?

>i:=inttostr(VolumeSerialNumber);

あと、
IntToStr関数やStrPCopy 関数など、意味は理解してます?
(分からなかった場合、ヘルプなどで調べました?)


七誌  2008-08-27 08:09:09  No: 31673

以下の単語の組み合わせでGoogle検索すれば、やりたいことはすぐできるはず。

(1)delphi 変数 型

(2)delphi 文字列 操作 関数

(3)delphi 数値 文字列 変換


ぺんね。  2008-08-27 08:30:50  No: 31674

ためしてみたのですが

kazu : integer;
moji : string;

moji:= inttostr(VolumeSerialNumber);//  文字列のmojiに代入
kazu:= StrToInt(moji);              //  文字列mojiを整数型にしてkazuに代入
kazu:= kazu - kazu;                 //  整数型  −  整数型  =  0
Label1.Caption :=kazu;              //  ←エラー


ぺんね。  2008-08-27 08:30:56  No: 31675

ためしてみたのですが

kazu : integer;
moji : string;

moji:= inttostr(VolumeSerialNumber);//  文字列のmojiに代入
kazu:= StrToInt(moji);              //  文字列mojiを整数型にしてkazuに代入
kazu:= kazu - kazu;                 //  整数型  −  整数型  =  0
Label1.Caption :=kazu;              //  ←エラー


ぺんね。  2008-08-27 08:36:26  No: 31676

inttostr(VolumeSerialNumber)  この時点でinttostrしないとラベルに表示できなかったのですが。

もともとintの形だったということでしょうか?
intではなぜラベルに出せないのでしょうか?


  2008-08-27 09:04:41  No: 31677

StrPCopyがなぜ出てきたのかよくわからないんですが、
文字列のn文字目を取り出したいなら文字列[n]でできますよね?
すでにヒントさんが書いてますけど。

一応確認しときますけど、たとえばVolumeSerialNumberが1234567890だったら
1, 2, 3, 4, 5, 6, 7, 8, 9, 0 をそれぞれ「数値として」取り出して
整数の配列に格納したい、で合ってますよね?
だったらいずれにしても1文字ずつ取り出して数値化していく必要があります。
あるいは一番最初の回答にあるように、数値のまま10で割っていくか。

元の質問者さんに対して、厳しいことを言うようですが
せっかく回答してもらっても、中身を理解していなくて
空振りに終わっていることが多すぎませんか?
最低限の基本概念は身につけて、簡単なエラーくらいは
自力で対処してくれないと
回答者の皆さんの時間を無駄に使うだけですよ。


igy  2008-08-27 09:28:26  No: 31678

>一応確認しときますけど、たとえばVolumeSerialNumberが1234567890だったら
>1, 2, 3, 4, 5, 6, 7, 8, 9, 0 をそれぞれ「数値として」取り出して
>整数の配列に格納したい、で合ってますよね?

>StrPCopyがなぜ出てきたのかよくわからないんですが、

あ、すみません。元の質問、「Charの配列」と思って、StrPCopy関数を
挙げてました・・・

「整数の配列」に格納したいってことなら、

・StrPCopy関数を使って、まず「Charの配列」に格納。
・次にその「Charの配列」の各内容を「整数の配列」に入れなおす

っていう方法もできますね。


igy  2008-08-27 09:35:40  No: 31679

>intではなぜラベルに出せないのでしょうか?

TLabelのCaption プロパティは、TCaption型で、
TCaption型は、string
なので、TLabelのCaptionに格納したい場合は、文字列にする必要があります。


igy  2008-08-27 09:42:38  No: 31680

>・StrPCopy関数を使って、まず「Charの配列」に格納
>・次にその「Charの配列」の各内容を「整数の配列」に入れなおす

と書きましたが、

…さんが書かれた、

>文字列のn文字目を取り出したいなら文字列[n]でできますよね?
>すでにヒントさんが書いてますけど。

>だったらいずれにしても1文字ずつ取り出して数値化していく必要があります。

この結果を「整数の配列」に格納していく方法が、簡単ですね。


まずは  2008-08-27 17:21:15  No: 31681

1)数値型(Integer, Extended)と文字列型(String)の区別をはっきりさせる
2)数値型と文字列型では、「=」や「:=」で等号判定、代入できない
3)お互いの型変換は IntToStr, StrToInt等を使う必要がある

このへん理解してる?
そうじゃなければ、プログラム以前の問題だから、そこから初めてください。


monaa  2008-08-28 05:33:21  No: 31682

もちろん文字列変換して取得する方法もありますが、
私ならこうします。

//n桁目の値を取得
function Getdigitvalue(value:Integer; digit:Byte):Byte;
// value:Integer; 元になる数値
// digit:Byte     知りたい桁 1は1の位 2は10の位...
//例  123456の100の位を知りたければ
//    123456 / 100 = 1234 余り 56
//      1234 /  10 =  123 余り (4)←これが求めたい値
var
  p,q:Integer;
begin
  q:=1;
  for p:= 2 to digit do
    q:=q*10;
  p := value div q;
  Result := p mod 10;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i,p:Integer;
begin
  i := 123456;
  for p := 1 to 7 do
    ShowMessage(IntToStr(i) + 'の' + IntToStr(p) + '桁目の数字は = ' + IntToStr(Getdigitvalue(i,p)));
end;


KHE00221  2008-08-28 10:17:03  No: 31683

procedure TForm7.Button1Click(Sender: TObject);
var
    C: Cardinal;
    I: Integer;
    S: String;
    B: array[1..10] of Byte; //格納先の配列
begin

    C := 123456789;   //元のシリアル番号
    S := IntToStr(C); //文字列に変換
    
    for I:=1 to Length(S) do
    begin
      B[I] := Ord(S[I])-48;     
    end;

end;


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

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






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