痔になりやすい生活習慣とは?

配列を使わずに、変数名を動的にループで回したい

大学の課題をやっている途中に思ったことなのですが……。
プログラム中に同じ型の変数p1,p2,p3があり、それぞれの変数にループで同じ処理を施したいと思っています。
しかし、「p(i)」や「("p" + i)」などと、変数どうしを別のものとして認識させようとしても、コンパイラから警告が出て上手くいきません。

配列を使えば、このような処理が出来ることはわかるのですが、使う変数名を指定されてしまっているために、今回は配列を使えません。
出来るか出来ないか、出来る場合は方法を知りたいです。

後、今回はC言語のプログラムで利用出来るかが自分にとっての問題なのですが、C言語以外のこのプログラミング言語なら出来る、とかの情報もこの機会に知りたいです。
お答え出来る範囲でいいので、もしよければ回答お願いします。

A 回答 (4件)

変数名を動的に変更するのは難しいでしょう


ポインタ配列を使って 実際に操作される変数と コード上で使用している変数を偽装することは可能ですよ

たとえば
int p1, p2, p3 , i;
int* pp[] = { &1p, &p2, &p3 };
としておけば
*pp[0] で p1を操作可能ですよ

for( i = 0; i < 3; i** ) {
  *pp[i] = i * 3;
}
などと操作すれば
p1,p2,p3に 0,3,6が代入されます
    • good
    • 1
この回答へのお礼

なるほど。ポインタ配列を使う方法がありましたか。全然思いつかなかったです。ああ確かに。
参考にします。

お礼日時:2010/06/26 22:24

ポインタの配列を用意しておくとか。



int main(void)
{
 int p0 = 1, p1 = 3, p2= 5;
 int *ptr_array[] = { &p0, &p1, &p2 };
 int i;
 
 for(i=0; i<3; i++){
  printf("p%d = %d \n", i, **(ptr_array + i));
 }

 return 0;
}

ちょっと強引ですが、これで動きますよ。
    • good
    • 0
この回答へのお礼

変数を使って、変数名を動的に変更するには、やっぱりポインタ配列か関数で実装するのが良さそうですね。
回答ありがとうございました。

お礼日時:2010/06/26 22:28

同じ処理なら関数にするのが一般的です。

    • good
    • 1
この回答へのお礼

そうかもですね。これからは関数利用の方法も考えてプログラミングしたいと思います。

お礼日時:2010/06/26 22:26

Cでは無理でしょう


一般にコンパイル言語では無理だと思います
インタープリタのPHPなら可能です
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

……そうですか。それでは諦めるしかないですね。
でもPHPだと出来るんですね。将来使うときのために参考にします。

お礼日時:2010/06/26 12:01

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

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

■環境
OS:XP
言語:C++
コンパイラ:Visual C++ 2008

char*やstd::string等で格納された文字列を使用して
変数を宣言することは可能でしょうか。

用途として、テキストファイル等から文字列を取得し
その文字列を変数名としてプログラミング内で使用するという方法を考えています。

よろしくお願い致します。

Aベストアンサー

動的な変数はたま~~~に欲しくなったりするんですが…。

本来の意味での変数とは少し違いますが、私の場合は添字参照演算子を使った擬似変数クラスを使います。
(簡単にint変数とします)
-----------
class CVirVar {
public:
  int & operator[](char* szVarName) {
    // 変数を探し出しす
    return 見つけた変数;
  }
}
-----------

用法
-----------
CVirVar var;
int   a;
char  name[] = "ほげ";
var[name] = 1;
a = var[name];
-----------

_variant_tとかで扱うとエラーも返せるし色んな型が格納できるので、一度作っておくと便利(?)ですよ。

QC#でフォームのオブジェクト名を変数名で指定

C#でフォームのオブジェクトを変数名で指定するにはどうしたらよいでしょうか?

例えば、フォームにラジオボタンrdo0~rdo9と、
それぞれに対応するテキストボックスtxt0~txt9が用意されている状態で、
rdo1がチェックされていたらtxt1に"OK"と表示、
rdo2がチェックされていたらtxt2に"OK"と表示・・・
といったことをfor文で実現する場合どのようにしたらよいでしょうか?
変数をオブジェクト名として認識させるための方法がわかりません。

どなたかご教授願います。


*********************************************
for(int i=0;i<10;i++)
{
 rdoname = "rdo" + i;
 txtname = "txt" + i;

 if((何らかの処理?)(rdoname).checked)
  (何らかの処理?)(txtname).txt = "OK";
}

****************************************
↑この、オブジェクトとして認識する為の「何らかの処理」部がわかりません。

C#でフォームのオブジェクトを変数名で指定するにはどうしたらよいでしょうか?

例えば、フォームにラジオボタンrdo0~rdo9と、
それぞれに対応するテキストボックスtxt0~txt9が用意されている状態で、
rdo1がチェックされていたらtxt1に"OK"と表示、
rdo2がチェックされていたらtxt2に"OK"と表示・・・
といったことをfor文で実現する場合どのようにしたらよいでしょうか?
変数をオブジェクト名として認識させるための方法がわかりません。

どなたかご教授願います。


************************...続きを読む

Aベストアンサー

参考URL参照。

参考URL:http://dobon.net/vb/dotnet/control/findcontrolbyname.html

Qオブジェクト名をforループ内で変更するには?

Java、Java3Dを最近始めたばかりのものです。

質問
Shape3D shape = new Shape3D(geometry,ap);
上記ような、“shape”、“ap”を
forループ内で、“shape1, shape2, shape3, . . .”というように、オブジェクト名を変更していきたいのですが、どのように行ったらよいのでしょうか?

宜しくお願いいたします。

Aベストアンサー

まず「オブジェクト名」ではなく「変数名」です。
変数名に依存したロジックはそもそも間違っていると思ってください。
0..nといった添え字に何らかの意味があるのであれば(画面と密に依存性がある、等)
前者の回答の通り、配列かコレクションAPIを使用します。

まだJavaにあまり慣れていないようであれば、配列でも構わないと思います。
オブジェクトの個数(配列の範囲)が確定しているのであればなおさらです。

Shape3D[] shapes = new Shape3D[n];
shapes[index] = new Shape3D();

しかし、最終的にはコレクションAPIを使用することを目標としたほうがよいでしょう。

QC#で変数名の取得

C#2.0を使っています。

例えば
string s = "test";
という変数名「s」があったときに、この変数名を
Reflectionか何かを利用して取得することはできないでしょうか?

s.GetType().NameなどでString(型)は取得できるのですが
変数名「s」を取得したいのです。

Aベストアンサー

変数といえば、「フィールド」「引数」「ローカル変数」がありますがどれでしょうか?
私の調べた範囲では、

「フィールド」は可能
「引数」はNameからインスタンスが取れないので無理
「ローカル変数」はNameも取れないので無理(コンパイルした時点で名前を保持していない?)


namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
(new myClass()).foo("引数");
}
}

class myClass
{
string s1 = "フィールド";

public void foo(string s2)
{
string s3 = "ローカル変数";

//フィールドの情報
FieldInfo[] fields = this.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
foreach (FieldInfo field in fields) {
object v = field.GetValue(this);
Console.WriteLine("[field]" + field.Name + "=" + v +"," + (v == (object)s1));
}

//引数の情報
ParameterInfo[] parameters = MethodBase.GetCurrentMethod().GetParameters();
foreach (ParameterInfo parameter in parameters) {
Console.WriteLine("[parameter]" + parameter.Name);
}

//ローカル変数の情報
IList<LocalVariableInfo> localVariables = MethodBase.GetCurrentMethod().GetMethodBody().LocalVariables;
foreach (LocalVariableInfo localVariable in localVariables) {
Console.WriteLine("[localVariable]" + localVariable.LocalType);
}
}
}
}

変数といえば、「フィールド」「引数」「ローカル変数」がありますがどれでしょうか?
私の調べた範囲では、

「フィールド」は可能
「引数」はNameからインスタンスが取れないので無理
「ローカル変数」はNameも取れないので無理(コンパイルした時点で名前を保持していない?)


namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
(new myClass()).foo("引数");
}
}

class myClass
{
string s1 = "フィールド";

public void foo(string s2)
{
str...続きを読む

QVBAでループ内で使う変数名を可変にできないか。

次のような処理で・・・、
 Cnt_1 = Cnt_1 + 1
 Cnt_2 = Cnt_2 + 1
   :
実際には一つの変数(Cnt_1など)ごとに処理がもっとあるのですが、
変数はCnt_1からCnt_5まであり、すべて同じ処理をするので、変数名を
可変にして同じループで書けないかと思うのですが、可能でしょうか?

たとえば、
For I=1 to 5
 Cnt_I = Cnt_I + 1
Next I
と書くと、「Cnt_I」という変数の処理になってしまいますね・・。

なにかいい方法はないでしょうか?

Aベストアンサー

こんばんは。

配列変数を使えばいいでしょう。
変数を5個用意して、すべて1~5まで足すという処理の場合です。
Dim Cnt(4) As Integer
Dim i As Integer
Dim j As Integer
For i = 0 To 4
For j = 1 To 5
Cnt(i) = Cnt(i) + j
Next j
Next i
どうでしょうか。

QC#にて別クラスの関数を使いたい

C#にて、別クラスの関数を使用する方法を教えてほしいです。

下記のような、構造体を受け取るメソッドを作りました。

*****************************
private struct MyPoint
{
public int x;
public int y;
}

private void proc1(MyPoint pt)
{
MessageBox.Show("座標:" ; pt.x + "," + pt.y + "実行結果");
}

private void button1_Click(object sender ,System.EventArgs e)
{

MyPoint pt;
pt.x = 10;
pt.y = 20;
proc(pt);
}
*****************************

別のフォームのクラスから、proc1を呼び出したいのですが、やり方がわかりません。
どうか、教えてください。

Aベストアンサー

同じ定義をしたとしても別の名前空間に書いた構造体は同一とはみなされません。

呼び出し先クラスでの構造体を private では無く、public で宣言して下さい。

呼び出し元では、

MyClass.MyPoint pt;

のようにして実体を作ります。

Qint型からchar型への変換

タイトル通り、int型からchar型への変換の仕方がわかりません!><
どうしたらいいのでしょうか?

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

no = 10;
sprintf(buf, "%d", no);

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

Q複数の変数を宣言する時、同時に初期化?できないでしょうか?

複数の変数を宣言する時、同時に初期化?できないでしょうか?

例えば、
int a,b,c;
とした時に、それぞれに1を入れる、みたいに。

Aベストアンサー

int a = 1, b = 1, c = 1;

と記述すれば初期化できると思いますよ。

QC#で共有変数の定義をするには

C#で共有変数の定義をするには、どうしたらよいでしょうか。具体的には、起動パラメータで、任意の文字列(3~4バイト)を渡して、C#アプリケーションを、起動し、プログラムの任意の場所で、そのパラメータを参照したいと考えています。起動パラメータの受け取りは、できるのですが、そのパラメータを、プログラムのどこからも参照できる領域(ここの定義方法が不明)に格納するには、どうしたらよいでしょうか。(2重起動を許す前提です。実行時に1つの目のプログラムにはパラメータ"XYZ"を渡し、2つ目のプログラムを起動時にはパラメータ"ABCD"を渡し、その値により、プログラムの動作を制御したいと思っています)
Windows-xp visual-studio2008 C#でwindowsアプリケーションを作成しています。

Aベストアンサー

namespace test1
{
  static class Program
  {
    /// <summary>
    /// アプリケーションのメイン エントリ ポイントです。
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
      if (args.Length > 0)
      {
        strArg = args[0];
      }
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
      Application.Run(new Form1());
    }
    // ここに記述
    static public string strArg = null;
  }
}

メインクラスのメンバーとしてスコープが有効な場所に記述します

namespace test1
{
  static class Program
  {
    /// <summary>
    /// アプリケーションのメイン エントリ ポイントです。
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
      if (args.Length > 0)
      {
        strArg = args[0];
      }
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
      Application.Run(n...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング