Delphiの文字列型stringについて

このQ&Aのポイント
  • Delphiの文字列型stringについての質問です。buf: array[1..16] of Char;をbuf :string[16];と宣言しては意図通りに動きません。なぜでしょう?
  • Delphiの文字列型stringについての質問です。TPerson = record Age : Integer; Name: string[30]; end; TPersonArray = array of TPerson; buf: array[1..16] of Char; ではダメ!の問題が発生します。
  • Delphiの文字列型stringについての質問です。動的配列の添え字は常に0から始まるため、buf :string[16]; では buf[j] が'文字'にならない問題があります。
回答を見る
  • ベストアンサー

Delphi の文字列型stringについて

 以下のコードで string は AnsiString、Char は AnsiChar です。  buf: array[1..16] of Char; を  buf :string[16]; と宣言しては意図通りに動きません。なぜでしょう?  TPerson = record   Age : Integer;   Name: string[30];  end;  TPersonArray = array of TPerson; procedure TForm1.Nantoka; var  i,j: Integer;  buf: array[1..16] of Char; //buf :string[16]; ではダメ!  Fs : TFileStream;  R : TPersonArray; begin  SetLength(R, 100); //配列のサイズを決定  for i := 0 to 99 do //動的配列の添え字は常に0から始まる  begin   R[i].Age := Random(100);   for j := 1 to 16 do buf[j] := Chr( Random(26)+97 );   //buf :string[16]; では buf[j] が'文字'にならない!   R[i].Name := 'Stream '+buf;  end; end;

質問者が選んだベストアンサー

  • ベストアンサー
  • maywindow
  • ベストアンサー率100% (1/1)
回答No.1

Delphi の String 型 (文字列型) は、文字列を代入すればその文字列がセットされて、文字列の長さが決まります。 buf : string[16]; は格納可能な文字の領域をバイト数で確保するだけです。 各要素に「文字」を代入しても「文字列」としての長さは設定されません。つまり、String 型の「文字列」としては認識してくれません。 どうしてもというのであれば、 Byte(buf[0]) := 16; とすれば、実際の「文字列」としての長さ(バイト単位)を設定できます。 > buf[j] が'文字'にならない! 文字列としての長さは buf に設定されませんが、「文字」としては代入されています。 余計なお世話かも知れませんが、Delphi 関係のコミュニティの場で質問された方がレスが期待できると思いますよ。

musume12
質問者

お礼

お礼が遅れました。丁寧な回答まことにありがとうございます。

関連するQ&A

  • 直線検出のハフ変換プログラム(delphi)

    ただいまdelphiで直線検出のハフ変換のプログラムを書いているのですが、コンパイルし、実行しようとするとスタックオーバーフローになってしまいます。 おそらく2次元配列のcounterの部分だと思うのですが、どなたか回避の仕方お分かりになるでしょうか? ご存じの方いらっしゃいましたら教えて下さい。 下記にハフ変換の部分のコードを載せます。 他にも何か気付いた点ありましたらご指摘お願いいたします。 ○直線検出のハフ変換○ var i, j, k, n: Integer; rx, ry: Integer; clr: tcolor; R: longint; counter_max: Integer; THETA_RESOLUTION, RHO_RESOLUTION, LNUMBER_MAX: Integer; pai: Double; theta, rho: Integer; theta_max, rho_max, count: Integer; theta_cut, rho_cut: Integer; counter:array[0..1023,0..1999] of Integer; //直線検出のためのカウンタ sn:array[0..1023] of Double; //sin cs:array[0..1023] of Double; //cos begin THETA_RESOLUTION:=1024; //thetaの範囲は0から1023まで RHO_RESOLUTION:=2000; //rhoの範囲は-1000から999まで LNUMBER_MAX:=15; //検索する電線の数は15まで pai:=PI / THETA_RESOLUTION; //π÷THETA_RESOLUTION for i:=0 to 1023 do //sinとcosのテーブルを用意 begin sn[i]:=Sin(pai*i); cs[i]:=Cos(pai*i); end; //ハフ変換の実行// for rx:=0 to 639 do begin for ry:=0 to 479 do begin clr:=image1.Canvas.Pixels[rx,ry]; R:=colortorgb(clr); if(getrvalue(R)=0)and(getgvalue(R)=0)and(getbvalue(R)=0) then //黒である for theta:=0 to 1023 do begin rho:=Trunc(rx*cs[theta]+ry*sn[theta]+0.5); counter[theta,rho+1000]:=counter[theta,rho+1000]+1; end; end; end; //ハフ逆変換の実行// for n:=0 to 14 do begin //counterが最大になるtheta_maxとrho_maxを求める// counter_max:=0; for theta:=0 to 1023 do begin for rho:=-RHO_RESOLUTION div 2 to RHO_RESOLUTION div 2-1 do begin if(counter[theta,rho+RHO_RESOLUTION div 2] > counter_max) then begin counter_max:=counter[theta,rho+RHO_RESOLUTION div 2]; theta_max:=theta; rho_max:=rho; count:=counter_max; end; end; end; //counter[theta_max,rho_max]の近傍を0にする// for i:=-20 to 20 do begin for j:=-10 to 10 do begin theta_cut:=theta_max+i; rho_cut:=rho_max+j; if(theta_cut < 0) then begin theta_cut:=theta_cut+THETA_RESOLUTION; rho_cut:=-rho_cut; end else if(theta_cut > THETA_RESOLUTION-1) then begin theta_cut:=theta_cut-THETA_RESOLUTION; rho_cut:=-rho_cut; end; counter[theta_cut,rho_cut+RHO_RESOLUTION div 2]:=0; //削除する end; end; //ハフ逆変換した結果の表示// if(theta_max<>0) then //垂線の線を描く begin for rx:=0 to 639 do begin ry:=Trunc((rho_max-rx*cs[theta_max])/sn[theta_max]+0.5); if(ry>=480)or(ry<0) then continue; image1.Canvas.Pixels[rx,ry]:=RGB(255,0,0); end; end; if(theta_max<>THETA_RESOLUTION div 2) then //水平の線を描く begin for ry:=0 to 479 do begin rx:=Trunc((rho_max-ry*sn[theta_max])/cs[theta_max]+0.5); if(rx>=640)or(rx<0) then continue; image1.Canvas.Pixels[rx,ry]:=RGB(255,0,0); end; end; //直線を形成するピクセルが60個未満になったら表示しない// if count<60 then break; end; end;

  • Delphi6で、実行後、一時停止をしたい。

    Delphi6を使ってPascalを勉強しています。 Delphi6でプログラムを記述し実行すると、MS-DOSが出てきて実行します。 しかし、実行した後すぐに終了してしまうので困っています。 合っているのか確認できません。 そのために一時停止用に型宣言のときに、 x:string;  end.の前に  readln(x)  を付けて止めるようにしているのですが、 プログラムによって止まるのと止まらないのがあります。 どうしてなのでしょうか。 ↓は止まりません。どうしたら止まってくれますか? 配列にデータを追加するプログラムです。 program ng; {$AppType Console} uses SysUtils; var  i, j, n, dat : integer;  a : array[1..100] of integer;  {一時停止のため変数名}  x:string; begin {配列にデータを入力する}  n := 6;  a[1] := 20; a[2] := 30; a[3] := 60;  a[4] := 70; a[5] := 80; a[6] := 90;  writeln('(1)現在の配列の内容');  for i := 1 to n do write(a[i]:3);  writeln;  writeln('(2)挿入するデータ?');  read(dat);  repeat    writeln('(3)挿入する位置?');    read(i);  until(i < n) and (i > 0); {配列への挿入}  for j := n downto i do a[j+1] := a[j];  a[i] := dat;  n := n+1; {挿入後の配列を表示}  writeln('(4)挿入後の配列の内容');  for i := 1 to n do write(a[i]:3);  {一時停止のためのread文}  readln(x) end.

  • Pascalでの選択ソート

    program sort(input, output); const numofdata =100 ; var d: array [1..numofdata] of integer; i,j,k: integer; tmp: integer; begin for i:=1 to numofdata do begin read(d[i]); end; for i:=1 to numofdata-1 do begin j:=i; for k:=i+1 to numofdata do begin if d[j]>d[k] then j:=k; end; tmp:=d[j]; d[j]:=d[i]; d[i]:=tmp; end; for i:=1 to numofdata do begin writeln(d[i]) end end. このプログラムを、データ数(1個から最大10000個まで)を最初に入力できるように変更するには、どうすればよいのでしょうか。教えてください。

  • クイックソート後の出力(pascal)

    20個の整数データをクイックソートして出力せよ、という課題が出ました。クイックソートまでは出来た(コンパイルできたのでおそらく)のですが、その順に出力する方法がわかりません。どなたかお教えください。 program sort(input,output); const n = 20; type index = 1..n; var A : array[1..n] of integer; i,x,a : integer; p,j,k : index; function PIVOT(i,j : index):integer; var k:index; begin k:=i+1; while (A[i]=A[k]) and (k<=j) do k:=k+1; if k>j then PIVOT:=0 else if A[i]>=A[k] then PIVOT:=i else PIVOT:=k end; procedure SWAP(var x,y:integer); var temp:integer; begin temp:=x; x:=y; y:=temp end; procedure PARTITION(i,j:index; a:integer; var k:index); var l,r:index; begin l:=i; r:=j; while A[l]<a do l:=l+1; while A[r]>=a do r:=r-1; while l<=r do begin SWAP(A[l],A[r]); l:=l+1; r:=r-1; while A[l]<a do l:=l+1; while A[r]>=a do r:=r-1; end; k:=l end; procedure QUICKSORT(i,j:index); var a:integer; p:index; k:index; begin p:=PIVOT(i,j); if p<>0 then begin a:=A[p]; PARTITION(i,j,a,k); QUICKSORT(i,k-1); QUICKSORT(k,j) end end; begin i:=0; i:=1+1; for i:= 1 to n do begin A[i]:=0; end; i:=0; i:=i+1; for i:= 1 to n do begin readln(x); A[i]:=x end; a:=PIVOT(p,j); PARTITION(p,j,A[a],k); QUICKSORT(p,j) end. QUICKSORT(p,j)とend. の間に出力方法を書き込みたいのです。

  • delphi6を使っています。

    今、functionの勉強中なのですが ちょっと応用になるとわかりません、、、。 30,28,58,12,45,25,を 12,25,28,30,45,58にしたいのです。 (functionを使って。。。) 答えではなくどなたかヒントをください。 type TPoints = array[1..10] of integer; //メイン begin lvPoints[1] := 12; lvPoints[2] := 25; readln; end; メインとtypeの間がちょっと難しい。。。 どなたかいいヒントを!!

  • 文字列と文字列をつなげるには

    下記のようにプログラムを作りました。 簡略しているのでわかりづらいと思いますが、 文字の配列と文字の配列を文字の配列に格納したいので、 下記のように$arrayに”.=”として文字列を加えて いますが、うまくいきません。 どのようにしたらいいのでしょうか? ご教授お願いいたします。 while($text[$i] != ""){ if($i==1){ $array[$j] = $feild[$j]; $array[$j] .= " "; $array[$j] .= substr($text[$i], $no, $pos); } }

    • ベストアンサー
    • PHP
  • Delphiの型変換

    わけあって、Array of charとStringを相互に変換したいのですが、方法はありますでしょうか。 stringは1文字なのですが、charとの変換がどうしても上手くいきません。 よろしくお願いします。 x : string; y : array [0..79] of char; x := 'A'; y[0] := x; みたいなコトをしたいのですが・・・。

  • VB2008: 文字列を逆順にする関数が判らない!

    Sub Main()   Debug.Print(Reverse("ABC") End Sub Function Reverse(ByVal aChars As String) As String   Dim C As Char   Dim I As Integer   Dim J As Integer   Dim L As Integer = aChars.Length - 1   J = L   Do While I < J     C = aChars.Chars(I)     aChars.Remove(I, 1)     aChars.Insert(I, aChars.Chars(J))     aChars.Insert(J, C)     aChars.Remove(J + 1, 1)     J -= 1     I += 1   Loop   Return aChars End Function 1、"ABC"の"A"を変数 C に保存。 2、"ABC"の"A"を削除。 3、"BC" の先頭に"C"を挿入。 4、"CBAC" の3番目(J=2)に変数Cを挿入。 5、"CBAC" の4番(J+1=3)を削除 6、"CBA" を戻り値にセット。 という Reverse 関数ですが動作しません。 一体、どこでどのように考え違いをしているのでしょうか? 全くわかりません。 宜しくお願いします。

  • [Delphi] StrToInt64がしたい

    16バイトの文字列を8バイトのint64型に変換したいです 下記コードのようにやってみたのですが上手く動きません 何か間違っている、他に方法などがありましたら教えてください。 function HexToInt64(const S: string): Int64; const hexstr : string = '0123456789abcdefABCDEF'; var I,L,h,m: Integer; j: Int64; p: PByteArray; test: string; begin result:=-1; p := @j; L:=Length(s); test:= ''; if L <> 16 then Exit; for i:=1 to L do if Pos(s[i], hexstr)<=0 then Exit; h:= strtoint('$' + Copy(S,0,8)); CopyMemory(@p[0], @h, 8); m:= strtoint('$' + Copy(S,9,8)); CopyMemory(@p[8], @m, 8); CopyMemory(@j, @p, 16); result:=j; end;

  • String型をchar型配列にしたい

     VC++2005ExpressEdition + PlatformSDKを使用しています.  String型をchar型配列に変換したいと思っています.  自分なりに調べてみたのですが, > String^ str = gcnew String("test"); > char chr[5]; > chr = str->ToCharArray(); などとしても次のようなエラーが出ます. > error C2440: '=' : 'cli::array<Type,dimension> ^' から 'char [5]' に変換できません。  String型からchar型配列への変換はどのようにすればいいのでしょうか.

専門家に質問してみよう