• ベストアンサー

変数のタイプ

Active Basicを使ってプログラムを書いています。 そのときに、変数というものがいまいち理解できなく、感覚で適当にしてしまいます。 たとえば、ファイルをを開くのダイアログボックスでファイルパスを取得するとき、Active Basicの本では、その文字列を格納するのに、 『Byte』を使っていました。 Dim buffer[MAX_PATH-1] As Byte といった風です。 しかし、本には、 バイト数:1 値の範囲:0~255 と書いてあります。 文字列を取得する場合はStringを使うのではないでしょうか? Byteでも、文字列を格納できるのでしょうか? 他にも、LongやDWordやIntegerやSingle、Dobleといったものがありますが、どう使い分けていいのかがわかりません。 すみませんが、分かる方、いらっしゃいましたらご教授願えませんでしょうか?

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

『ファイルを開く』のダイアログには OPENFILENAME構造体を使うと思います この構造体に初期設定を施して GetOpenFileNameを使い 関数から戻った際に 引数の構造体のメンバからファイル名などを取り出す といった流れになります このとき GetOpenFileNameでは あらかじめファイル名用に用意された受け皿が必要になります ... 他にも設定するのはありますが このファイル名用に与えられたメンバーの型がBytePtrになっています これは Byte型のデータを格納する先頭の(メモリー)番地という型です Byte型の配列であれば その変数名を直接記述すればOKです dim ofn as OPENFILENAME dim buf[256] as byte ofn.lpstrFileTitle = buf String型の場合は ZeroStringで領域を確保、StrPtr関数の返り値を代入 dim ofn as OPENFILENAME dim buf2 as String buf2 = ZeroString(256) ofn.lpstrFileTitle = StrPtr(buf2) といった具合になります Byte型の配列から文字列への変換には MakeStr関数で行います dim sFname as String sFname = MakeStr( ofn.lpstrFileTitle ) String型の変数を StrPtr関数でポインタにした場合は GetOpenFileNameから戻った時点で 代入されています Byte配列の場合は APIを使う前には変換不要、APIから戻った時点で文字列への変換が必要 String型の場合 APIを使う前に ZeroStringなどであらかじめデータの格納領域を確保して StrPtrで変換が必要、APIから戻った時点では変換不要 といった違いがあります Long、DWord、Integer、Single、Doubleなどは扱えるデータの範囲などによって選択すればいいでしょう 単純な整数ならInteger、32767(-32768)を超える整数ならLong 符号なしの整数なら WordやDWord 少数を扱うなら Single、有効桁数が8桁以上必要ならDoubleといった具合です 3.14159265358979323846 を扱いたい場合 3.1415926 で良ければ Single 3.14159265358 までの精度が必要なら Double といった具合に選択します

その他の回答 (2)

  • gonbee774
  • ベストアンサー率38% (198/511)
回答No.2

>Dim buffer[MAX_PATH-1] As Byte ANo.1さんもおっしゃっていますが、これはBYTEの配列(要素がMAX_PATH+1)になります。 よって、MAX_PATH文字までの文字列を扱うことができます。 文字列の後ろには終端文字がつくため、要素はひとつ多く確保します。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

ファイルパスの取得にWindowsAPIを使ってませんか? WindowsAPIのレベルでは文字列はバイトが並んだものになります(バイトの配列)。 多分 ActiveBASICでいうところの「文字列」にするためには 何か一アクションはいると思うのですが。

関連するQ&A

  • EditBoxの内容を取得する方法

    Active Basicを使ってプログラムを作成しています。 まだまだはじめたばかりの初心者なので、電卓プログラムを作ってみようと決めて、作り始めました。 しかし、EditBoxから文字列を数字として取得する部分がどうしても出来ません。 Dim Buffer As BytePtr Dim Length As Long Length = GetWindowTextLength(hEditBox) Buffer = calloc(Length+1) GetWindowText(hEditBox,Buffer,Length+1) MessageBox(hEditBox,Buffer,NULL,MB_OK) free(Buffer) こういったコードを指定してみました。 文字列としては取得できますが、数字としての取得が出来ず、 取得した後、足したり引いたりすると、文字化けが生じます。 EditBox内の数字をそのまま変数にコピーする方法を御願いします。 分かりにくくてすみません・・・

  • 変数タイプについて

    ABでプログラムを書いています。 その中で、疑問に思ったのですが、 LongとかDWordなど、たくさんの変数が用意されていますが、 使い分けが分かりません。 たとえば、『小数点を扱うならば、Doubleを使う』と言う程度なら分かるのですが、 前に質問させていただいた、EditBoxの内容を取得する時に使う変数は、 BytePtrを使っていました。 文字列を取得するのに、なんで”String”型を使わないのでしょうか? また、Doubleと、DoublePtrなどの、『Ptr』が有るものと無いものとでは、何が違うのでしょうか? 分かるかた、ご教授くださいです...

  • バッファの要素を消去する

    recv_bufferというバッファの要素を消去して、繰り返しrecv_bufferを 使用したいのですが。 [tcp_active500000byte]という文字列をrecv_bufferに詰め込んで使用した後、もう一度recv_bufferに違う文字列を入れて使用したいです。 1回目に書き込んだ文字列を消去するにはどうすればよいのでしょうか? byte[] recv_buffer = new byte[40]; in.read(recv_buffer); 送信された文字列をrecv_bufferに格納して、プログラム内で使用します。 このプログラムは半永久的に動作させたいので、recv_bufferを何度も使いまわしたいのですが、 前に書き込んだ文字列が残っているせいでプログラムがうまく動かなくなります。 どなたかアドバイスをお願いします。

    • ベストアンサー
    • Java
  • TcpClientとWebbrowser

    TcpClientでストリームからバイトでhttpデータを取得しましたが、 EUC-JPの文字コードのサイトだけがhtml内に本来入るはずのない数値が沢山現れます。 いっそのことWebBrowserコントロールを使ってサイトにアクセスし、DocumentTextを参照した方が手っ取り早いでしょうか? バイトから文字列の変換はわかりましたが、文字列から文字列へ文字コードを変換する方法がわからず困っています。ご存知の方教えていただけますか? 以下、EUC-JPの時に数値が混入するサンプルです。 '--------------------------------------------------------------------------------------------------- ' httpファイルを読み込む '--------------------------------------------------------------------------------------------------- Private Sub GetHttp(ByVal host As String, ByVal port As Integer, ByVal cmd As String, ByRef retcode As Integer, ByRef http_data As String) 'TCP/IP接続を行う Dim client As New TcpClient() Try client.Connect(host, port) 'ストリームを取得する Dim stream As NetworkStream = client.GetStream() Dim param As String = cmd + " HTTP/1.0" + ControlChars.CrLf+ControlChars.CrLf Dim buffer() As Byte = System.Text.Encoding.ASCII.GetBytes(param) stream.Write(buffer, 0, buffer.Length) Dim sb As New System.Text.StringBuilder() Dim len As Integer http_data = "" Dim bytData() As Byte = New Byte(1048576) {} '1MB Dim strCharset As String = "" 'すべて受信する Dim cnt As Integer For cnt = 1 To 1000 '受信 len = stream.Read(bytData, 0, bytData.Length) 'バッファサイズを与えて、受信サイズを得る sb.Append(Encoding.GetEncoding("utf-8").GetString(bytData, 0, len)) 'utf-8 If Not stream.DataAvailable Then '受信キューにデータがある場合はTrue Exit For End If Next '正常に受信できた場合 http_data = sb.ToString retcode = 0 Catch ex As Exception retcode = -1 http_data = "" Finally client.Close() End Try End Sub '----- Dim host As String = "ホスト名" Dim port As Integer = 80 Dim cmd As String = "GET /index.html" '戻り値 Dim retcode As Integer Dim http_data As String = "" Dim charset As String = "" Try GetHttp(host, port, cmd, retcode, http_data) Catch ex As Exception MessageBox.Show(ex.Message, "エラーです。") End Try

  • ストリング文字列をDocumentオブジェクトに格納したい

    文字列として受け取ったxmlをDocumentオブジェクトに格納したいと考えて DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(ファイルパス); とすればファイルを取得してDocumentオブジェクトに入れることはできたのですが、ファイルパスではなくString文字列としてxmlを受け取った場合、どのようにすればDocumentオブジェクトに格納できるのかわかりません。 どのようにすればよろしいのでしょうか?

    • ベストアンサー
    • Java
  • Active Basic フォルダの絶対パスの取得

    ファイルまでの絶対パスの取得のように、自分のフォルダまでのパスを取得するにはどうしたらいいのでしょうか? D:\aaaa\bbbb\cccc\dddd\abcd.exe があって、 D:\aaaa\bbbb\cccc\dddd\ を取得したいのですが・・・ 実験してみたのですが、上手くいきませんでした。 すみませんが、やり方をご教授ください。お願いします。 ↓頑張った証 '自分自身のファイルパスを取得する Dim path[MAX_PATH] As Byte Dim FileName As BytePtr Dim MaxFilePath As Long Dim MyFileName As Long Dim AllByte As Long Dim MidAns As String GetModuleFileName(NULL,path,MAX_PATH) 'ファイルパスからファイル名を抜き出し、その大きさを取得して、引く FileName=malloc(Len(path)+1) GetFileTitle(path,FileName,Len(path)+1) MaxFilePath=Len(path) MyFileName=Len(FileName)+1 AllByte=MaxFilePath-MyFileName 'フォルダまでのパスを抜き出す MidAns=Mid$(path,1,54) free(FileName)

  • 動的な変数名のつけ方について

    ■環境 OS:XP 言語:C++ コンパイラ:Visual C++ 2008 char*やstd::string等で格納された文字列を使用して 変数を宣言することは可能でしょうか。 用途として、テキストファイル等から文字列を取得し その文字列を変数名としてプログラミング内で使用するという方法を考えています。 よろしくお願い致します。

  • ファイルを読み込んで変数へ

    VB初心者です。 ファイルの文字列を読み込んで、変数に格納し、SQL文のテーブル名に指定したいのですが、どうすればよいのでしょうか? テキストから文字列を取得するところまではできたのですが、変数にもって、SQL文に組み込むことができません。実行すると「テーブル名が無効です。」とエラーになります。 どうか、皆様ご教授ください。

  • VB6で配列を文字列に変換する方法?

    VisualBasic6を使っております。 Dim ary() As Byte Dim s as String 配列を文字列に変換したり、文字列を配列にしたいのですが どのようにすれば良いのでしょうか?

  • Stringクラスの変数の格納アドレスを知りたい

    いつもお世話になります。 Javaの文字列クラスのStringは参照型ですが、この変数の値が格納されたアドレスを知るためにはどうすればよいのでしょうか。eclipse上で、文字列の変数に対してtoString()を試してみたところ、格納されている文字列が出力されました。 ※自作したクラス、たとえばtest.MyClassだとすれば、toString()を用いれば「test.MyClass@01234」というような表記で出力されますが、このような情報を取得するにはどうすればよいでしょうか。 宜しくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう