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

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

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

Re[10]: C言語でグローバル変数をなくしたい


(過去ログ 74 を表示中)

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

■43218 / inTopicNo.1)  C言語でグローバル変数をなくしたい
  
□投稿者/ snow (1回)-(2009/11/02(Mon) 14:37:11)

分類:[C/C++] 

開発環境:cint-5.16.19-win32
使用言語:C

C言語で、グローバル変数をなくして関数化したいです。
下のように考えましたが、read と write で変数を
共有化する方法が思いつきません。
何とかグローバル変数を使わずに、できないものでしょうか。
enum
global_variable
{
  VAR1 = 0,
  VAR2
};
int global_read(int name)
{
  static int var1 = 1;
  static int var2 = 2;
  switch(name)
    {
    case VAR1:return var1;
    case VAR2:return var2;
    default: return 0;
    }
}
void global_write(int name, int value)
{
  static int var1 = 1;
  static int var2 = 2;
  switch(name)
    {
    case VAR1:var1 = value;break;
    case VAR2:var2 = value;break;
    default: return;
    }
}
int main(void)
{
  int a = 0;
  int b = 0;
  a = global_read(VAR1);
  b = global_read(VAR2);
  global_write(VAR1, 3);
  global_write(VAR2, 4);
  return 0;
}

引用返信 編集キー/
■43220 / inTopicNo.2)  Re[1]: C言語でグローバル変数をなくしたい
□投稿者/ やんち (4回)-(2009/11/02(Mon) 15:06:02)
やんち さんの Web サイト
構造体を使用して、OOP風に書くか。
管理用の関数を作成して、管理するとよいんじゃないでしょうか。

引用返信 編集キー/
■43221 / inTopicNo.3)  Re[2]: C言語でグローバル変数をなくしたい
□投稿者/ επιστημη (2242回)-(2009/11/02(Mon) 16:30:08)
επιστημη さんの Web サイト
うーん...どぉしよっかなー...

typedef struct {
  int iVal;
  long lVal;
} global_t;

global_t* get_global() {
  static global_t* instance = NULL;
  if ( instance == NULL ) instance = malloc(sizeof(global_t));
  return instance;
}

// 最後に一回、必ず呼ぶべしっ!
void destroy_global() {
  free(get_gloval());
}

// つかいかた
int main() {
  long n = get_global()->lVal; // read;
  get_global()->iVal = (int)n; // write;
  destroy_global(); // 忘れんなやゴルァ!
  return 0;
}

引用返信 編集キー/
■43225 / inTopicNo.4)  Re[3]: C言語でグローバル変数をなくしたい
□投稿者/ snow (3回)-(2009/11/02(Mon) 18:21:40)
なるほどー、mallocを使って動的に領域を割り当てて、
そのポインタを返す関数を作れば、
static のような振る舞いが期待できるのですね。
そして、構造体ポインタ演算子を使えばアクセスもすっきり、と。

プログラムの見通しが良くなりそうです。
ありがとうございました!

解決済み
引用返信 編集キー/
■43226 / inTopicNo.5)  Re[4]: C言語でグローバル変数をなくしたい
□投稿者/ επιστημη (2243回)-(2009/11/02(Mon) 19:38:26)
επιστημη さんの Web サイト
コレ↓でも構わんですけどね。

typedef struct {
  int iVal;
  long lVal;
} global_t;

global_t* get_global() {
  static global_t instance;
  return &instance;
}

// つかいかた
int main() {
  long n = get_global()->lVal; // read;
  get_global()->iVal = (int)n; // write;
  return 0;
}


引用返信 編集キー/
■43254 / inTopicNo.6)  Re[5]: C言語でグローバル変数をなくしたい
□投稿者/ snow (4回)-(2009/11/04(Wed) 08:46:25)
あ、malloc を使う必要はないと。
こっちの方がすっきりしていていいですね。
ありがとうございました。
解決済み
引用返信 編集キー/
■43255 / inTopicNo.7)  Re[6]: C言語でグローバル変数をなくしたい
□投稿者/ επιστημη (2245回)-(2009/11/04(Wed) 08:58:05)
επιστημη さんの Web サイト
2009/11/04(Wed) 09:00:09 編集(投稿者)
> あ、malloc を使う必要はないと。
> こっちの方がすっきりしていていいですね。

そう断じるのは早計かと。case-by-caseでしょう。
初期値を与えたいなら malloc の方が楽だったりします。

global_t* get_global() {
  static global_t* instance = NULL;
  if ( instance == NULL ) {
    instance = malloc(sizeof(global_t));
    instance->iVal = 123;
    instance->lVal =456;
  }
  return instance;
}


解決済み
引用返信 編集キー/
■43259 / inTopicNo.8)  Re[7]: C言語でグローバル変数をなくしたい
□投稿者/ 774RR (417回)-(2009/11/04(Wed) 11:01:55)
全体的になにをやりたいのかよくわからんけど、俺なら素直にグローバル変数にするだろう、と思う・・・
カプセル化もなにもないので、誤使用に対する安全性が増しているとは思えないし
性能的にただ無駄なことやっているだけと思われるし
全体的に見通しがよくなったか?と問われるとそうは思えないし

C++ でいうところの悪例
class getset_bad_example {
  int value;
public:
  void set(int v) { value=v; }
  int get() const { return value; }
};
と何一つ変わらんわけで・・・

C で終了時処理が必要なら atexit が使えるよん。

引用返信 編集キー/
■43261 / inTopicNo.9)  Re[8]: C言語でグローバル変数をなくしたい
□投稿者/ 中博俊 (1338回)-(2009/11/04(Wed) 11:32:24)
テスト可能性はあがっているので、これはこれでありだとは思いますけどねー
引用返信 編集キー/
■43266 / inTopicNo.10)  Re[9]: C言語でグローバル変数をなくしたい
□投稿者/ とっちゃん (431回)-(2009/11/04(Wed) 12:10:10)
とっちゃん さんの Web サイト
static 修飾子付けたまま外部変数にして、global_read と global_write を1ソースに収めてしまえば?

グローバル変数にはならないですよ?

引用返信 編集キー/
■43270 / inTopicNo.11)  Re[10]: C言語でグローバル変数をなくしたい
□投稿者/ επιστημη (2247回)-(2009/11/04(Wed) 12:39:03)
επιστημη さんの Web サイト
C++なら名前空間 global で囲むだけかも。
namespace global {
  int iVal;
  long lVal;
}
※ ただし糸色文寸に using namespace global 書いちゃダメ!

その前にグローバル変数をできる限り減らすよう努力しますが。

引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -