• 締切済み

文字演算の動作不良

作成中のソフトで文字演算が機能しなくなりました。 対策をお教えせください。 プログラム CtrlFile3$ = ODir$ + Me.Name + ".txt" Debug.Print ODir$; Me.Name; ".txt" Debug.Print ODir$ + Me.Name + ".txt" Debug.Print CtrlFile3$ 表示結果 D:\Bas\BookMark\Cont\MkHtm03.txt cornflowerblueMkHtm03.txt dingMkHtm02 言語等 Visual Basic 6.0 (SP5) Windows 2000 SP2 ペンテ4 1.6GHz, 785424KB メモリー データHDD 120GB(空き28GB) システムHDD 9.75GB(空き6.4GB) なお以上の内容は 教えて!goo > コンピューター [技術者向け] > プログラミング > Web Page Design に数日前に質問した内容とほぼ同一内容です。

みんなの回答

noname#79209
noname#79209
回答No.5

読み落としていましたが、 > htmlファイルをヘルプメッセージとして使うように変わりました > テキストファイル(旧プログラムが自動作成する)をhtmlファイルに書き換える > ルーチンとその初期設定と資源管理を非常駐とする書き換えの作業中です。 とのことですので、HTML関連で「cornflowerblue」と変換されてしまっているのでは? それと、ODir$は「Dim」ステートメントで文字型変数として明示的に宣言なさっていますでしょうか。 変数名の最後に「$」がついているから「自動的に文字型となる」と考えておられるかもしれませんが、 プログラミングを効率よく行いたいなら、面倒でもあまり「自動的」を信用せずに、今回の場合 ・変数は型も含め、明示的に宣言する ・文字列結合には本来の演算子である「&」使用する ことを強くお勧めします。 そうでないと、原因の切り分けあるいはバグ回避の方法が見つからず、いつまでも実りのないデバッグに時間を費やされてしまいます。 また、あとで別の人が修正等を行う際、一般的な記述をしていないと、 「ん?なぜこうしているんだろう。何か意味があってこうしているのかな」 と、深読みされ作業を遅らせることにもなりかねません。

aramananto
質問者

お礼

その後 A$ = A$ + A$ → A$ = A$ & A$ のような文字演算子 + を & への書き換え Dim A$ →Dim strA as string のような書き換え を自動で行うソフトを作成し(ソースの分量から手作業部は不可能)、昨日でご指摘のような変更をすべての宣言文と変数について行いました。 結果、Me.Name に関する障害とload, unload に関する障害は改善しました。 そこで元ファイルを実行してみました。障害は出なくなっていました。 考えられることは for IB&=1 to 10 List1(IB).Width = IE& next IB& のように倍精度整数として使用していた変数名「IB」(4バイト)をバリアント様に参照する場合に、言語がバリアント型の変数(5バイトでしたか、極力使用を避けているのでよく覚えていません)として記憶域を操作していると考えるのであれば考えられる障害です。 エラーチェックに引っかからないから整数として取り扱っているとしていました。

aramananto
質問者

補足

Dim TDir$(5), Udev$(3), CDir$, InDir$, OutDir$, ODir$ Dim FormLoadFig&, CmdTypeFig& Dim CtrlFile3$, KeyName1$, KeyName2$, KeyName3$, KeyName4$ Dim ControlSecName$, WidthKeyName$, HeightKeyName$, CmdTypeKeyName$, InitiateKeyName$ Dim CH09$, CH22$, NameHed$, HttpHead$, LinkHead1$, LinkHead2$, HedChr1$, HedChr2$, HedChr3$, BotChr$ Private Sub Form_Load() FormLoadFig& = 1 CmdTypeFig& = 0 Debug.Print "Loading"; Me.Name Call CommonStringSet Call CommonDataInitial FormLoadFig& = 2 End Sub Private Sub CommonStringSet() Call taraintLoad(TDir$(), Udev$(), CDir$, InDir$, OutDir$, ODir$) CtrlFile3A$ = ODir$ & Me.Name & ".txt": '← この行 CtrlFile3$ = ODir$ + Me.Name + ".txt" 'CtrlFile3$ = ODir$ + "MkHtm03.txt" Debug.Print ODir$; Me.Name; ".txt" Debug.Print ODir$ + Me.Name + ".txt" Debug.Print CtrlFile3$ Debug.Print ODir$ & Me.Name & ".txt" Stop CH22$ = Chr$(&H22): CH09$ = Chr$(&H9) NameHed$ = "<meta name=" + CH22$ HttpHead$ = "<meta http-equiv=" + CH22$ 結果A(「この行」の先頭に'を指定した場合で CommonStringSet 2回目の参照の場合) D:\Bas\0BookMark\Cont\MkHtm03.txt D:\Bas\0BookMark\Cont\MkHtm03.txt <meta http-equiv="MkHtm03.txt D:\Bas\0BookMark\Cont\MkHtm03.txt 結果A(「この行」が生きている場合、又は CommonStringSet の1回目の参照の場合) D:\Bas\0BookMark\Cont\MkHtm03.txt D:\Bas\0BookMark\Cont\MkHtm03.txt D:\Bas\0BookMark\Cont\MkHtm03.txt D:\Bas\0BookMark\Cont\MkHtm03.txt 動作試験用に別プロジェクトにしたので一部結果が変わっています。 動作試験用に書き入れたCtrlFile3A$を除くとすべて大域変数ですから先頭で宣言を入れています。 HttpHead$ の内容が参照されていますからビット演算は関係ないでしょう。 Sub taraintLoad はスタートアップFromが設定した資源情報を一括して読み取るルーチンです。 一見正常動作のように見えるのですが実際にはより重大な障害が存在します。 MkHtm01.frm から Mkhtm06.frm を起動する tara03.bas 内 Sub MkHtmLoadControl(ActionType&) で IB& = 0 If (MkHtmLoadFig&(IA&) = 0) Then '常駐指示がないのであれは MkHtmLoadFig&(IA&) = 1&: '常駐指示フラグをセット(UnLoadの禁止)して If (MkHtmLoadFig2&(IA&) = 0) Then Load MkHtm01: DoEvents: IB& = 1  '常駐していないのであれは MkHtm01 をロードし、MkHtm01内各種処理を行う End If If (IB& <> 0) Then For IB& = 0 To 100: DoEvents: Next IB& はずが、Sub Form_Load() 又は DoEvent 中に処理がほとんど行われません。フォームモジュールがMDIフォームモジュールとして動作してしまいます。 MkHtm01.Show vbModal 実行中に 401(400かも)が発生してしまいます。 手動で MkHtm01.Show vbModal をコメント行にして継続すると exit sub実行後に LoadingMkHtm01 なんてメッセージが表示されます。 MkHtmLoadControl を使わないでスタートアップFromから起動すれば動くのですが、子From からCallしたMkHtmLoadControlではうまく動きません >の演算子である「&」使用する >読みされ作業を遅らせることにもなりかねません。 これは狙っています。ソースリストの公開はしていません。もししていたら不正なものです。

noname#79209
noname#79209
回答No.4

やはり「+」を使っているのがマズイのでは? Debug.Print ODir$ + Me.Name + ".txt"の表示結果にある「cornflowerblue」は色番号「#6495ed」を示すカラー名です。 やはり文字コードがビット単位で演算されてしまっているのでは? やはり、素直にここは「&」を使うべきではないでしょうか。 プログラミングでは、 「原因は解らなくても、不安定だったり検証されていないものは避けて通る」が鉄則だと思います。

aramananto
質問者

お礼

システムが変わったのでうまく書きこめるかどうか。 原因は以前書いたように暗黙の了解の変数 IB&を参照(IB&=1等)後、バリアント型IBとして参照(A$(IB)等)した場合に隣の変数の領域を操作してしまうことのようです。 宣言をしていればバリアント型での参照が発生しませんので上記障害も発生しないでしょう。 バリアント型変数ですと+と&の使い分けが必要でしょう。

  • don_go
  • ベストアンサー率31% (336/1059)
回答No.3

回答ではありませんが... VBでの文字列演算に "+" を使用するとCaptionやTextプロ パティの値が共に数値の場合などに、足し算をしてしまう ので "&" を使用する様にした方が良いです。

aramananto
質問者

補足

なぜか IE5.00でこのサイトが見られなくなっていたで応答が遅れました。 >共に数値の場合などに、足し算をしてしまう 私の能力では足し算をするルーチンを作ることができませんでした。 ハングアップとかエラーで止まるルーチンは作れるのですが。 どのようにすれば足し算をしてくれるのでしょうか。

noname#22222
noname#22222
回答No.2

問題は、別にあると思います。 例えば、プロシージャを並び替えたとか・・・。 例えば、プロシージャをコピーしたとか・・・。 全体に誤動作が始まっているのであれば、全てのプロシージャの再作成が必要かと・・・。 全体をテキスト保存して、プロシージャの中のコードはコピーしても構いません。 *予想が当たってればいいのですが...

aramananto
質問者

補足

コピーは日常的に行っています。 現在MK**.frm が6つ合計で856KB, 共通ライブラリーのtara**.bas が14個で435KB, その他frmが164KB, その他*.bas が60KB, 起動時のfrmが30KBです。 もともとtara03.bas 系統(tara03a.bas - tara03d.bas) が巨大になりすぎたので MK**.frm に分割して非常駐部に保存。frmで入出力も可能だから動作チェック(手動実行)と対話型設定ルーチンをいれたらば106KBのtara03*.basが40KB+856KBになったのです。 MS-BASICで作ったソフトのヘルプメッセージ関係が約200KBのソースプログラム(文字情報は別ファイルに約2MB, 本来の処理プログラムが800KBあります)です。V.B.ではhtmlファイルをヘルプメッセージとして使うように変わりました(テキストファイルのESCシーケンス非サポート)のでテキストファイル(旧プログラムが自動作成する)をhtmlファイルに書き換えるルーチン(40KBくらい)とその初期設定と資源管理を非常駐とする書き換えの作業中です。 再作成は実質的に実行不可能です。 実際問題として手をつけていない本来のプログラムの資源管理以外の部分だけでも500KB(CardC.bas-CardP.bas, A-Bが資源管理, Hがヘルブなので除いて)くらいありますから。 >全体に誤動作が始まっているのであれば 現在は1箇所 Me.name の関係する文字演算だけです。

noname#79209
noname#79209
回答No.1

VBで文字列結合の演算子は「+」ではなく「&」じゃないですか? JavaScriptなら「+」ですけど... > 作成中のソフトで文字演算が機能しなくなりました。 以前はこれで(演算子「+」で)正しく動いていたんですか?

aramananto
質問者

補足

>く「&」じゃないですか? 両方ともに使えます。ただMS-Basic(GW-Basicを含めて)の頃の習慣で相変わらず「+」を使っています。 CtrlFile3$ = ODir$ + "MkHtm03.txt" と直接定数で指定すれば正常に動くのですが、Me.Name の関係する演算が動きません。

関連するQ&A

  • 内部処理形式が日付型 (Date) の Variant

    文字変数として保存されている日付の演算を組込み関数で行おうと debug.print DateDiff("yyyy", DateValue("2001.1.1"), DateValue("2001.10.16")) debug.print DateDiff("yyyy", "2001.1.1", "2001.10.16") 等やってみたのですが、 実行時エラー13 型が一致しません となり実行できません。 DateDiff 関数の引数になる「内部処理形式が日付型のVariant」型変数への代入方法をお知らせください。 実行環境 Visual Basic 6.0 SP5 Windows 98 256MB + 32GB-HDD(空き10GB)

  • PowerShellの replace演算子で

    PowerShellの replace演算子で、キャプチャーしたものと、変数をくっ付けた時、うまく表示できません。これはどうしたらよいのでしょう。 例 21AA-N1-M01.txt 21AB-N2-M02.txt などのファイルがあるとして、先頭から2文字と1番目のハイフンの隣の文字とNの隣の数字に1を加えたものと2番目のハイフン以降をくっ付ける。 21AA-N1-M01.txt → AAN2M01.txt dir *.txt | % {$a = [regex]::Matches($_.Name,'\d+') ; $b = 1 + $a.Value[1] ; $_.Name -replace '..(..)-N(\d)-(.*)',"`$1$b`$3"} $12M01.txt となってしまいます。 "`$1 $b`$3" という風に $1 と $b の間にスペースを入れるか、何か文字を入れると正常な表示にはなりますが、間に余計なものは入れたくないです。 $1 と $b の間に何かエスケープ文字とか入れるのでしょうか?

  • 文字の置換がうまくいかない

    ********** test.txt ************* $first = "abc"; $last = "xyz"; ********************************* ********** change.txt *********** $first $firstaaa $last ********************************* という2つのテキストファイルがあったとして、 open(IN,"test.txt"); @data = IN; close IN; open(A,"change.txt"); while(<A>){$a_data .= $_} close A; foreach (@data) { if(/(\$[a-zA-Z_]+)[\t\s]*=[\t\s]*"(.+)"[\t\s]*;/){ my $name = $1; my $value = $2; print "$name<br>"; #$nameに何が入っているか表示 $a_data =~ s/$name/$value/g; } } としても、change.txtの$firstや$lastがabcや、xyzに置換されないのですが、なにがいけないのでしょうか?print "$name<br>";のところではちゃんと$firstと$lastという風に出力されています。$a_data =~ s/$name/$value/g;を$a_data =~ s/\$first/$value/g; と変えると、ちゃんと$firstだけ置換されました。 なにか心当たりがある方、よろしくお願いします。

    • ベストアンサー
    • Perl
  • 現在アクティブなフォーム名を取得するには

    アクセスの標準モジュールでのプロシージャーで、現在アクティブなフォーム名を取得したいです。 フォームモジュールなら、Me.Nameでイケますが、すべてのフォームから使えるように、 標準モジュールで作りたいのですが、どうすればいいでしょう? Debug.Print ActiveForm.Name とすると、コンパイルエラーになります。 Debug.Print ActiveForms.Nameでも同じです。ご回答よろしくお願いします。

  • cgi出力での文字コードについて

    下記のソースをsjisで作っていて、出力するdata.txtをuft-8で保存したいです。 どのようにすればよいでしょうか? 下記ソースでは、data.txtはsjisになっています。 尚、htmlはsjisなのでそのまま使用したいです。 どなたか教えてください。 宜しくお願いします。 ############################# #!/usr/local/bin/perl require 'jcode.pl'; require 'cgi-lib.pl'; &ReadParse; $datafile='data.txt'; ←これの保存のみutf-8にしたい open(FH,">$datafile"); print FH "$in{'name'}"; close(FH); rint "Content-type:text/html\n\n"; print "<meta http-equiv='Content-Type' content='text/html; charset=Shift_JIS'>"; print "<html><head></head><title>テスト</title><body>\n"; print "<center>入力完了しました。</center><hr /><br>\n"; print "<b>名前:</b>$in{'name'}<br>\n"; print "<hr />\n"; print "</body></html>";

    • 締切済み
    • CGI
  • PHPバージョン4.3.10で動作しない

    はじめのページでチェックボックスにチェックしてもらい、 次のページでそのチェックしたものを表示したいです。 しかし、下記のコードではPHPバージョン4.3.10ではうまく動作しませんでした。 PHPバージョン4.3.10で動作させるには、どうすればよいか教えていただけませんか? <form action="mail.php" method="post"> <input name="member[]" type="checkbox" value="AAA" checked>AAA <input name="member[]" type="checkbox" value="BBB" checked>BBB <input name="member[]" type="checkbox" value="CCC" checked>CCC <input type="submit" value="send"> </form> mail.php <?PHP if(is_array($member)){ $txt ="あなたの選んだのは"; foreach ($member as $key=>$val){ if ($key==0){ $txt .=$val; }else{ $txt .="、".$val; } } $txt.="です"; }else{ $txt="あなたは誰も選んでません"; } print $txt; ?>

    • ベストアンサー
    • PHP
  • Excel VBA テキストボックスの値の取得

    テキストボックスの値が必要となり参照しようと思い、検索したところdebug.printにある3つの方法がヒットし、試して見ましたが、エラーになります。 テキストボックスの名前にはどれもtxtの文字を含んでいます。 Sub ShapeValue() Dim Shp As Shape For Each Shp In ActiveSheet.Shapes If InStr(Shp.Name, "txt") <> 0 Then Debug.Print Shp.TextFrame.Characters.Text 'オブジェクトは、このプロパティまたはメソッドをサポートしていません。 Debug.Print Shp.TextFrame2.TextRange.Text '指定された値は境界を超えています。 Debug.Print Shp.ShapeRange.TextFrame.Characters.Text 'オブジェクトは、このプロパティまたはメソッドをサポートしていません End If Next Shp End Sub どうすれば取得できるでしょうか?

  • 動作の軽さに関するメモリとHDDについて

    ふと疑問に思って、独自で調べたのだが規定事実というか知ってて当たり前という感じで詳しくはわからないこと。 原理がいまいちよくわからない っていう事柄ってありますよね。 例で言うならば、電子レンジで物は温まるけど、どういう原理で温まるのかは詳しく知らないみたいな。 今回、そういうのが「動作の軽さに関するメモリとHDD」です 本当に大雑把で勘違い満載な質問内容だと思いますが、できるだけ意図を汲み取って頂ければ幸いです。 まずメモリってのは、イメージ的に演算処理的な物でGBが大きければ大きいほど処理能力は高いから動作が軽くなるってのはだいたいわかります。 しかしHDDって・・・ 保存のためだけのものなんじゃないんですか? 確かに出力もしますし入力もします だけど、アプリとかインターネットで使う分には演算処理が動作の有無に関しての決め手で、HDDは関係ないのではないかと思っています。 だけど、動作が重いなら外付けHDD! とかって情報を何度も見て、まったくわからなくなりました。 それに数年前から同じパソコンでイラストを書いてるのですが、確かに動作が重くなりました。 パソコンの性能が低下したかもしれませんが、メモリの増設はしてませんので、やっぱりHDDの容量が少なくなってきたのが原因なのかなぁ? と思い始めました。 だけど原理がわからないから、納得したくても納得できない!! 助けてこのジレンマ・・・ 一応スペック?を書いておきます。 メモリ4GB  内蔵HDD ドライブC 252GB中156GB使用          ドライブD 25,4GB中1,8GB使用  それと・・・ドライブCとドライブDの違いってなんですか?  調べればすぐ出てきそうですが、ついでにお願いします。 もし動作を軽くするために外付けHDDが有効であるならば、500GBのを買おうかなと思ってるのですが、USBでつなげれば勝手に動作が軽くなるのか、それともパソコン内部のデータを移して、内部HDDの容量を少なくすれば軽くなるのどちらなんでしょうか?

  • URL名を取得するには?

    アクセスのフォームに Web Browserを設置して、 Me.WebBrowser1.Navigate "http://www.yahoo.co.jp/" としました。 その時、サイト名(名前)を、タブに表示したいのですが、まず名前の取得ができません。 http://www.yahoo.co.jp/の名前は「Yahoo! JAPAN」です。 Sub a() Debug.Print Form_フォーム1.WebBrowser1.Navigate.Name Debug.Print Form_フォーム1.WebBrowser1.url.Name End Sub どちらもエラーになってしまいます。 ご教授よろしくお願いします。

  • 最近動作が遅くて、度々固まって動かなくなる。

    PCは、4年位前に買った富士通BIBLO NB7/750Rで、OSは、MEからXP-SP2にしてます。外付けHDD 80GBで使用していますが、最近メモリー不足なのか、動作が重く最悪固まってしまいます。買い換えるほど今は資金がないので、安くメモリー交換出来ればと思いお尋ねしたいのですが、ちょっと心配なのはこの機種でメモリー交換出来るかどうかなんですが、もし可能であれば、お薦めのショップ(通販可)があったら教えて下さい。 よろしくお願いします。

専門家に質問してみよう