CH3COOH(酢酸)のさくっと393

VB.NET(VS2003)でお仕事中.Windows Mobile大好きです。

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  413  : 記事  0  : コメント  7776  : トラックバック  93

ニュース

CH3COOH(酢酸)の実験室 or SOFTBUILD

書庫

日記カテゴリ

お仕事中の雑談でのお話です。
Twitterでもこんな事出来るの?って相談していた件ですw

 

先輩「C言語ってこんな感じで、ループを使って(memsetを使ってもいいんだけど)
最終的にstr1とstr2は”cccc”を指すような書き方出来るやん?」

 char str1[] = "aaaa";
 char str2[] = "bbbb";

 char** array[] = {&str1, &str2};
 for (int i=0; i<2; i++)
 {
  *array[i] = "cccc";
 }

 printf("%s", str1);  // "cccc"が表示される事を期待
 printf("%s", str2);  // "cccc"が表示される事を期待

先輩「↑みたいなイメージでVBでもコード書けるん?」

 Dim str1 As String = "aaaa"
 Dim str2 As String = "bbbb"

 Dim array() As XXXXX = {str1, str2}
 For i As Integer = 0 to array.Length - 1
  ' なんらかしらの処理
  array(i) = "cccc"
 Next i

 Console.WriteLine(str1) ' "cccc"が表示される事を期待
 Console.WriteLine(str2) ' "cccc"が表示される事を期待 

僕「出来ると思いますけど・・・・うーん?」

 

……ってな感じで、
配列に変数を突っ込んでその変数を配列から取り出すことなく
目的の"ccccc"を表示出来るのかなぁ……と悶々としてましたww

やっぱりTwitterだとイメージを伝えにくいですね。

投稿日時 : 2009年1月14日 1:27

コメント

# re: [日常][C/C++][VB]VBでこんな書き方出来るの? 2009/01/14 7:09 インドリ
基本的に.NETでの文字列は不変ピヨ。

# re: [日常][C/C++][VB]VBでこんな書き方出来るの? 2009/01/14 9:25 επιστημη
> 基本的に.NETでの文字列は不変ピヨ。

そんな話してないよ。
参照先を差し替えてるだけ(C版も)。


# re: [日常][C/C++][VB]VBでこんな書き方出来るの? 2009/01/14 9:31 インドリ
あれ?ごめん。ボクの認識が間違っていました。

# re: [日常][C/C++][VB]VBでこんな書き方出来るの? 2009/01/14 9:32 中博俊
ただその後がちょっと違うよね。

# re: [日常][C/C++][VB]VBでこんな書き方出来るの? 2009/01/14 10:01 επιστημη
違いますねぇ ^^;


# re: [日常][C/C++][VB]VBでこんな書き方出来るの? 2009/01/14 11:02 επιστημη
> Dim array() As XXXXX = {str1, str2}
ここんとこで "ByRef な文字列" の配列が作れにゃならんのか、んーむ...
単に Dim array() As String だと array(n) の参照先が差し替わるだけなのよね。


# re: [日常][C/C++][VB]VBでこんな書き方出来るの? 2009/01/14 11:05 出水
Cのstr1の値ってconstな値じゃないんです?
普通ならエラーが出るはずだけど、強引なキャストで無理やり書き換えているっぽい
ほめられたコーディングじゃないのは確か

VBでもC#でも追跡参照をもってないから、
str1の単語を出さずにこの変数の値を書き換えるのは不可能でしょう
強いて言えば、関数の引数にしてoutかrefで書き換えるぐらいかな

# re: [日常][C/C++][VB]VBでこんな書き方出来るの? 2009/01/14 11:40 774RR
"aaaa" は const だけど str1 は char [] だから const ぢゃないっすよ
"aaaa" から str1 へ複写が行われて str1 は変更可能。

ダメダメコードであることには御意。
> str1とstr2は”cccc”を指すような
str1 も str2 も配列(=文字列)だからポインタぢゃない。「指すように変更」できないよね
中身を書き換えるならできるけど strcpy/memcpy が必要

C++ にして string にすれば「指すように変更」はやはりできないけど
「strcpy を明示せず operator= で中身を書き換え」ならできるわね
なんか考えるだけ無駄コードに見えてきた・・・

うん、C/C++ に慣れてる俺ってやっぱり「参照型」はソースコード上にそう明示したいな
VB系の参照型って使いこなせる自信がないや

# re: [日常][C/C++][VB]VBでこんな書き方出来るの? 2009/01/14 11:41 επιστημη
> Cのstr1の値ってconstな値じゃないんです?
ですねー

char* str1 = "aaaa";
char* str2 = "bbbb";
ならば str1,str2 を書き換えられますです。


# re: [日常][C/C++][VB]VBでこんな書き方出来るの? 2009/01/14 11:53 επιστημη
> "aaaa" は const だけど str1 は char [] だから const ぢゃないっすよ

本来なら char str1[] は char const * const str1 として扱わにゃいかんのですけどねー


# re: [日常][C/C++][VB]VBでこんな書き方出来るの? 2009/01/14 11:57 出水
>"aaaa" は const だけど str1 は char [] だから const ぢゃないっすよ
str1は"aaaa"のアドレスをさす「定数」ですよね?
str1の指すバッファ(*str1)は書き換え可能ですけど、str1そのものまで書き換えていいんですか?

# re: [日常][C/C++][VB]VBでこんな書き方出来るの? 2009/01/14 12:09 επιστημη
> char** array[] = {&str1, &str2};
char**  と char*[5] は参照レベルが異なるので怒られます。
# けどもおそらく warning どまり。

char* str1 = "aaaa";
char* str2 = "bbbb";

char** array[] = {&str1, &str2};

ならおっけぃかな。


# re: [日常][C/C++][VB]VBでこんな書き方出来るの? 2009/01/14 12:14 774RR
ああ C ソースと VB ソースと、どっちを主眼に読むかで立場が違うんだ・・・
俺はこの記事の読み方として
C ソースのほうを最初に読んで str1 の char[] の中身を書き換える、の解釈にとったんだけど
そーぢゃなくて
str1 はあたかもポインタ=VBでいう参照型のように見えるから、その指す先を入れ替えたい
と読むべきなんだすな?

> str1は"aaaa"のアドレスをさす「定数」ですよね?
というか多分それは他読者に誤解を招く表現だと思うぞ。
C/C++ では "aaaa" が2つ存在するわけで、「指す」という文言がどっちを指しているかを明示しないとまずい。
複写元である "aaaa" は名前が無い const char [5] なわけだ。
一方 str1 は複写後の char [5] なわけだ。これは const ではない。
そしてさらに配列名が配列の先頭アドレスを指すポインタに暗黙変換される規則があって
それによって余計に誤解を生みかねない、と。

# re: [日常][C/C++][VB]VBでこんな書き方出来るの? 2009/01/14 18:56 インドリ
息抜きになると思うから豆知識を囀るピヨ♪
こんな時はManaged C++の事を思い出してあげて下さいw
.NETの参照型にはボックス化の概念があるからVBではこの記事に書いてある事は実現し辛いんだけど、Managed C++ではボックス/アンボックス化を自在に操れるピヨ。
だからManaged C++だったらこの記事の例の様なCプログラムも.NETで可能なんだ。
※C++/CLIの機能ではボックス化は操れないから注意してね

# [C#].Netの器 2009/01/14 20:47 Garbage Collection
[C#].Netの器

# [C#].Netの器 2009/01/14 21:01 Garbage Collection
[C#].Netの器

Post Feedback

タイトル
名前
Url:
コメント