C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: グローバル変数を使いたくない


(過去ログ 59 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■33747 / inTopicNo.1)  グローバル変数を使いたくない
  
□投稿者/ ナナメセン (1回)-(2009/03/09(Mon) 10:47:12)

分類:[VB.NET/VB2005 以降] 

2009/03/09(Mon) 10:48:26 編集(投稿者)
Visual Basic 2005 Express Edition を利用しています。
「Visual Basic 2008 に移行すれば簡単になる」なら、
そのような回答も歓迎いたします。

ファイル内容とともにこれへのレスとして書き込むコード (*1) 
において "...?" の位置で以下の操作 (*2) を行いたいのですが
・ 大量の変数を渡しあう
・ グローバル変数を使う
方法しか思いつきませんでした。どのようにすればこれらを回避できるでしょうか。

(操作)
a_s のすべての要素 a_s(i) に対し、
    a_s(i).E のすべての要素 a_s(i).E(j) に対し、
        もし、b_s(k).Index = a_s(i).E(j) となるような k が存在していれば
            b_s(k).E の最後に a_s(i).Index を追加
        さもなければ
            b_s の最後に b_s(m).Index = a_s(i).E(j) かつ b_s(m).E = {a_s(i).Index} となるような b_s(m) を作成して追加

(*1) 実際のコードでは他の変数やらメソッドやらをいろいろと持っていますし、
     名前も変更してありますが、必要な部分だけ抜き出して抽象化しました。
(*2) 実生活に例えるとこれは
    「オリンピックの参加国がそれぞれどの競技に選手を派遣しているか」
     のデータから
    「オリンピックの各競技はそれぞれどの国からの選手で競われるか」
     を割り出すようなものです。

引用返信 編集キー/
■33748 / inTopicNo.2)  Re[1]: グローバル変数を使いたくない
□投稿者/ ナナメセン (2回)-(2009/03/09(Mon) 10:49:10)
Sub Main
  Dim a_s() As A
  ...入力ファイルから読み込んだ結果を a_s に格納...
  Dim b_s() As B
  ...?
  ...結果ファイルを出力...
End Sub

Class A
  Dim Index As Integer
  Dim E() As Integer
  ...
End Class

Class B
  Dim Index As Integer
  Dim E() As Integer
  ...
End Class


入力ファイル:
A.Index	A.E の要素
1	1, 4, 5, 7, 9
2	2, 4
3	3, 8, 9
8	1, 6


結果ファイル:
B.Index	B.E の要素
1	1, 8
2	2
3	3
4	1, 2
5	1
6	8
7	1
8	3
9	1, 3

引用返信 編集キー/
■33749 / inTopicNo.3)  Re[1]: グローバル変数を使いたくない
□投稿者/ はつね (959回)-(2009/03/09(Mon) 11:22:05)
はつね さんの Web サイト
No33747 (ナナメセン さん) に返信
> において "...?" の位置で以下の操作 (*2) を行いたいのですが
> ・ 大量の変数を渡しあう
> ・ グローバル変数を使う
> 方法しか思いつきませんでした。どのようにすればこれらを回避できるでしょうか。

「大量の変数を渡しあう」というのは、大量の変数値を渡しあうと言うことでしょうか。
もしそうだとしたら、配列や構造体を参照渡しのパラメタとして渡せばいいじゃないで
しょうか。もしくはクラスをつくって、そのクラスを参照渡してとか。


引用返信 編集キー/
■33752 / inTopicNo.4)  Re[2]: グローバル変数を使いたくない
□投稿者/ こあら (50回)-(2009/03/09(Mon) 12:09:20)
結局全件読み込まないと出力要素を決められないので、
処理方法を変えたら簡単なロジックになったりしませんか?

例えば。

1.入力ファイルを全件読み込んで、縦持ちに変換する。

index E
1 1
1 4
1 5
1 7
1 9
2 2
2 4
3 3
3 8
3 9
8 1
8 6

2.変換したリストをE(もしくはEとindex)でソートする。

index E
1 1
8 1
2 2
3 3
1 4
2 4
1 5
8 6
1 7
3 8
1 9
3 9


3.ソートしたリストをEをキーとして、横持ちに変換する。
> 結果ファイル:

引用返信 編集キー/
■33753 / inTopicNo.5)  Re[1]: グローバル変数を使いたくない
□投稿者/ επιστημη (1808回)-(2009/03/09(Mon) 12:13:05)
επιστημη さんの Web サイト
2009/03/09(Mon) 13:45:13 編集(投稿者)

えー...要は「逆引き可能なデカい辞書」を実現したいってことですか?
それとグローバル云々とがどうしても結びつかんのです。
デカい辞書のコピーを作るのはおおごとでしょうけど、
デカい辞書の在り処だけを引き渡せばいいよねぇ。

> もしくはクラスをつくって、そのクラスを参照渡してとか。

ほい → http://blogs.wankuma.com/episteme/archive/2009/03/09/169367.aspx
※ C#でごめんねー

引用返信 編集キー/
■33793 / inTopicNo.6)  Re[2]: グローバル変数を使いたくない
□投稿者/ ナナメセン (3回)-(2009/03/10(Tue) 10:19:44)
皆様ありがとうございます。一括返信で失礼します。

クラスのうち当該処理に関係ない部分が少し大きかったので、丸ごと取り込んだりするようなクラスを作ったりはしたくなかったのですが、こあら氏 No33752 の方法で行うことにしました。

# 入力ファイルと結果ファイルは、実際に使うものとは全然違う形なのですが、これを経由しようと思えば、この方法は思いつくべき方法でした…。
解決済み
引用返信 編集キー/
■33795 / inTopicNo.7)  Re[3]: グローバル変数を使いたくない
□投稿者/ こあら (51回)-(2009/03/10(Tue) 10:43:53)
NameValueCollectionクラスを使うと、
「1.入力ファイルを全件読み込んで、縦持ちに変換する。」のところで
コレクションにaddしていくだけで、結果ファイルの形式に変換できそうです。

.NET TIPS
1つのキー文字列に対して複数の文字列値を保持するには?
http://www.atmarkit.co.jp/fdotnet/dotnettips/305namevalues/namevalues.html

解決済み
引用返信 編集キー/
■33838 / inTopicNo.8)  Re[4]: グローバル変数を使いたくない
□投稿者/ ナナメセン (4回)-(2009/03/10(Tue) 23:43:25)
解決済みになっていても参考情報を寄せていただき、ありがとうございます。まさに今から実装しようと思っていた部分で、渡りに舟でした。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -