ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年3月29日(金) 17:20

全ての表示時間は UTC+09:00 です




新しいトピックを投稿する  トピックへ返信する  [ 12 件の記事 ] 
作成者 メッセージ
 記事の件名: String型の使用頻度。
投稿記事Posted: 2006年5月02日(火) 21:26 
オフライン

登録日時: 2005年5月31日(火) 18:51
記事: 473
お住まい: 新潟県
皆さん、標準データ型である String ってどのくらい使ってますか?
また、どういった時に使いますか?

自分は皆無と言っていい程String型を使ったことがなくて、String型の使用目的が分かりません...。
むしろ、「String型って要らなくね?要らねぇろ?」、の域です。

String型のメリットって...?


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2006年5月02日(火) 21:45 
オフライン

登録日時: 2005年5月31日(火) 17:14
記事: 231
お住まい: 茨城県
ヘルプファイルにはこう書かれてますね。
引用:
String型は従来のBasic言語との互換性をとるために存在します。文字列 / バイナリデータを扱う場合は、特に理由がない限り、プログラマーが任意的にメモリ確保、解放を行い、BytePtr型として文字列データを管理する手法を推奨します。
メリットといえば、確保、解放が自動というあたりでしょうか。あまり神経質にならずに文字列を扱えます。ですから、WinAPI関連ではなく、文字列自体を操作したいときに使いますね。

私は最初に扱った言語が、このActiveBasicなので、Basic以外のときもよく使用します。しかし、String型の仕様って凄く曖昧なんですよね。長い間String型を扱っていないと、なかなかうまく扱えないと思います。
ヘルプファイルに書かれているように、無理に使う必要もないでしょう。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2006年5月02日(火) 23:36 
オフライン

登録日時: 2005年5月31日(火) 17:59
記事: 899
お住まい: 東京都
 私はその文を完全無視するつもりでいます。時代に逆行しているとしか思えないからです。
今時文字列を単なるByte配列(に相当するもの)として扱う言語と言えばCとアセンブリ言語くらいです。
うっかりメモリ確保で誤ってしまったり解放し忘れていたりバッファオーバーフローを起こしそうになったり、何と面倒です。
 というのは私が文字列型のある言語に慣れてしまったからでしょうか。
しかしそんなことに頭を振り回している暇があったら、プログラムのアルゴリズムや見た目(UI)を凝りたいです。

 API関数については、GetWindowTextで言えばGetWindowTextLengthのような存在がある、
つまり事前に文字数がわかる場合にはまず間違いなくString型でAPI関数を包み込んでいます。
そうでない場合はByte配列を使うことも止むを得ませんが。

> しかし、String型の仕様って凄く曖昧なんですよね。
 これがABのかなり痛い点の1つだと思っています。
直接VoidPtrへ変換したときの妙な挙動、配列で要素数の制限、New[]も使えないetc……。
事ある度に言ってきましたが、これに対する私の案は「演算子多重定義をできるようにしてStringを単なるクラスにする」というものです。
特別扱いをやめてしまえば少しは素直になってくれないかというわけです。

 勿論バイナリデータにはStringを使う気は毛頭ありません。
上記は全て文字列に対しての話です。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2006年5月03日(水) 12:00 
自分はBytePtr型は使わずString型ばかり使っています。
(確保・解放を気にせず使えるからです。)


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2006年5月03日(水) 14:32 
オフライン

登録日時: 2005年5月31日(火) 18:51
記事: 473
お住まい: 新潟県
引用:
メリットといえば、確保、解放が自動というあたりでしょうか。あまり神経質にならずに文字列を扱えます。ですから、WinAPI関連ではなく、文字列自体を操作したいときに使いますね。
なるほど。文字列自体を操作したい時ですか。確かに「str = str + "aiueo"」なんて処理はString型だと簡単にできますね。
BytePtr型だとサイズが小さい場合、メモリの再確保をしなくちゃいけないなど、ちょっと煩わしいですね。
引用:
 API関数については、GetWindowTextで言えばGetWindowTextLengthのような存在がある、
つまり事前に文字数がわかる場合にはまず間違いなくString型でAPI関数を包み込んでいます。
そうでない場合はByte配列を使うことも止むを得ませんが。
自分は逆で、GetWindowTextLength()関数のような事前に文字数が分かる場合には間違いなくBytePtr型で処理しています。
そういえば、事前に文字数が分からないっていう状況になったことがないですね。
文字数を把握できないっていう状況になってないからString型の利便性が分からないんでしょうか...?
引用:
> しかし、String型の仕様って凄く曖昧なんですよね。
 これがABのかなり痛い点の1つだと思っています。
直接VoidPtrへ変換したときの妙な挙動、配列で要素数の制限、New[]も使えないetc……。
事ある度に言ってきましたが、これに対する私の案は「演算子多重定義をできるようにしてStringを単なるクラスにする」というものです。
特別扱いをやめてしまえば少しは素直になってくれないかというわけです。
クリティカルセクションの処理だとかどういうことをやってるかほとんど分からないんですけど、HeapAlloc()関数とかmemcpy()関数を使ってるみたいなのでBytePtr型をクラスにしちゃえばよさそうですよね。 弄くりだしたら結構面白くてクラスが継承し始めました...。
引用:
自分はBytePtr型は使わずString型ばかり使っています。
(確保・解放を気にせず使えるからです。)
確保・解放を気にせず使えるのは便利ですよね。
でも、自分はBytePtr(バイタープターと呼んでます)に慣れすぎちゃって、確保・解放を自分で管理してないと不安になります...(笑


最後に編集したユーザー 7 [ 2006年5月03日(水) 16:38 ], 累計 3 回

通報する
ページトップ
 記事の件名:
投稿記事Posted: 2006年5月03日(水) 15:07 
オフライン

登録日時: 2005年7月25日(月) 13:27
記事: 893
お住まい: 埼玉県東松山市
僕はString型は使いまくってます。
理由は確保とか解放とかする必要性がなくなりますからね。
しかし、イグトランスさんが言ったようにCやアセンブリだと配列を使っているわけで、現在アセンブリ言語を勉強している僕にとってString型を含む関数は移植が面倒なだけです。
やっぱりBytePtr(個人的にバイトプターと読んでる。)に慣れていたほうがいいのでしょうか?

_________________
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2006年5月04日(木) 00:10 
オフライン

登録日時: 2005年5月31日(火) 17:59
記事: 899
お住まい: 東京都
私はスクリプティング言語や関数型言語など専ら高級言語路線を歩んでいます。
そういうわけでABでもString型を多用したくなるのは当然の事なのです。

> そういえば、事前に文字数が分からないっていう状況になったことがないですね。
これはたとえばGetOpenFileNameの場合です。
フックプロシージャを使えば文字数もわかるらしいのですが、
そこまで手間をかけるつもりはありませんから、このようにByte配列を率直に使うという程度のことです。
コード:
Dim file[ELM(MAX_PATH)] As Byte
Dim ofn As OPENFILENAME
With ofn
    .lpstrFile = file
    .nMaxFile = MAX_PATH
    'その他は省略
Wnd With
ちなみに私のStringクラスの構想はString(書換不可)とStringBuilder(書換可)という2本立てというJava/C#的にするというものです。
Stringは参照カウント式にして、現Stringで頻繁に行われる値渡しでも速度低下を抑えられるようにし、
StringBuilderはAPIからの文字列受け取りや数値型変数の書式化もできるようにするという具合です。
実現できるかどうかはともかくですが。

#ところでSingleのほうで山本様が好意的な回答を寄せていただけました。
#ありがとうございます。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2006年5月04日(木) 06:17 
オフライン

登録日時: 2005年5月31日(火) 07:49
記事: 162
> 私はスクリプティング言語や関数型言語など専ら高級言語路線を歩んでいます。
> そういうわけでABでもString型を多用したくなるのは当然の事なのです。

僕は主に x86 のアセンブリ言語を扱うことが多いため、低い次元で手軽に扱えてC言語との親和性も高い BytePtr 文字列に偏りがちになっています。
イグトランスさんとの対比で、おもわず「なるほど」と頷いてしまいました (^^;


> ちなみに私のStringクラスの構想はString(書換不可)とStringBuilder(書換可)という2本立てというJava/C#的にするというものです。
> Stringは参照カウント式にして、現Stringで頻繁に行われる値渡しでも速度低下を抑えられるようにし、
> StringBuilderはAPIからの文字列受け取りや数値型変数の書式化もできるようにするという具合です。

僕がイマイチ C# に馴染めないのはそこなんですよね。頭の中で「文字列=バイトの列」という固定観念が完成してしまっているので、わざわざ2種類の文字列型を準備することに抵抗を感じるのです。うーん…

おなじプログラミングの世界、さらには言語すら同じなのに、自分と対称的な立場に立って、対称的に考える人がいるということを改めて実感し、感動を覚えつつ。。。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2006年5月04日(木) 16:28 
オフライン

登録日時: 2005年5月31日(火) 18:51
記事: 473
お住まい: 新潟県
> > そういえば、事前に文字数が分からないっていう状況になったことがないですね。
> これはたとえばGetOpenFileNameの場合です。
> フックプロシージャを使えば文字数もわかるらしいのですが、
> そこまで手間をかけるつもりはありませんから、このようにByte配列を率直に使うという程度のことです。
>
コード:
Dim file[ELM(MAX_PATH)] As Byte
> Dim ofn As OPENFILENAME
> With ofn
>     .lpstrFile = file
>     .nMaxFile = MAX_PATH
>     'その他は省略
> Wnd With
言われてみたら確かな文字数は分からないですね。でも、MAX_PATHよりも小さいだろうってことで自分もByte配列を使います。

> #ところでSingleのほうで山本様が好意的な回答を寄せていただけました。
楽しみですね!


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2006年6月07日(水) 19:26 
オフライン

登録日時: 2006年5月07日(日) 17:16
記事: 185
お住まい: 宮城県
最近は自分もまともにAPIなどを使うのでBytePtrを使い始めました。BytePtr型は文字列判定などもしっかりできるのでけっこう使いやすいですね。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2006年6月07日(水) 19:57 
オフライン

登録日時: 2005年5月31日(火) 18:51
記事: 473
お住まい: 新潟県
引用:
最近は自分もまともにAPIなどを使うのでBytePtrを使い始めました。BytePtr型は文字列判定などもしっかりできるのでけっこう使いやすいですね。
memcpy()関数も覚えておくと便利ですよ。
よく分からない場合、Left$, Right$, Mid$関数の定義を覗いてみると勉強になります。

String型でもできるのかもしれませんけど、以下のように書けるのがなんとなく嬉しいです。
コード:
Dim lpStr As LPSTR
Dim cc As Long

	lpStr=calloc(26)

	' "ABCDEFG..."という文字列を作る
	For cc=0 To 25
		lpStr[cc]=Asc("A")+cc
	Next

	MessageBox(0,lpStr,"英大文字",MB_OK)
	free(lpStr)
BytePtr型って面倒なのかもしれませんけど、加工するのは簡単だと、思います。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2006年6月11日(日) 00:53 
オフライン

登録日時: 2005年7月25日(月) 13:27
記事: 893
お住まい: 埼玉県東松山市
String型でも
コード:
 
Dim Str As String
Dim cc As Long

    Str=ZeroString(26)

    ' "ABCDEFG..."という文字列を作る
    For cc=0 To 25
        Str[cc]=Asc("A")+cc
    Next

    MessageBox(0,Str,"英大文字",MB_OK)
とすれば同等の事が出来ますよ。
メモリの開放が必要ありませんし。

_________________
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。


通報する
ページトップ
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 12 件の記事 ] 

全ての表示時間は UTC+09:00 です


オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[13人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
cron
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean