• 締切済み

2次元配列の1次元目のバッファ

static const char *mainstr[][?] = {  "abc",  "123" }; このソースのabcや123の部分をたまに書き替えてコンパイルするということをしています。 そのときに?の数値を算出するのを手動でやっていますが、自動にするために?にプログラムを書くようなことはできないでしょうか? 大きい固定値にはしたくなく、最小の?の値にしておきたいです。

みんなの回答

  • ency
  • ベストアンサー率39% (93/238)
回答No.3

サイズが不定な文字列(配列)の配列には、No1 ttyp03さんが回答されているように、文字列を指すポインタの配列を使うしかありませんね。 # こうすることで、文字列の長さを考える必要がなくなりますよね。 あと、この場合の配列サイズは、私の場合は以下のようにします。 -------------------------------------------------------- sizeof(mainstr)/sizeof(mainstr[0]) -------------------------------------------------------- 要するに No2 MiracleCat さんとやりたいことは同じです。 # というか、一般に配列サイズを求める、こんなマクロも有名 # ですよね。 -------------------------------------------------------- #define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0])) --------------------------------------------------------

回答No.2

文字列ポインタの一次元並びなら No.1 の方の回答の通りだと思います。 その際の、サイズは sizeof(mainstr)/sizeof(char*) で求めるのが定石ですので、これで for() とか回せますよね。

  • ttyp03
  • ベストアンサー率28% (277/960)
回答No.1

これでいいのでは? static const char *mainstr[] = {  "abc",  "123" };

関連するQ&A

  • D言語の連想配列の配列

    D言語で連想配列の配列を使いたいのですが、 以下のソースをコンパイルするとコンパイルエラーが起きます。なにがいけないのでしょうか。 int main(char[][] args) { int[3][char[]] x; x[0]["abc"]=1; return 0; } エラーメッセージ test.d(4): cannot implicitly convert expression 0 of type int to char[] test.d(4): cannot implicitly convert expression "abc"i of type char[3] to int

  • ポインタの配列でエラーが出てしまいます。

    ポインタの配列でエラーが出てしまいます。 私は今PICというマイコン(ロボットコンテストなどで用いられるロボットの頭脳となるもの)のプログラミングをしています。ポインタの配列を使って液晶表示器に文字列を表示させるプログラムを作っているのですが、エラーが出てしまいます。 このようなプログラムです。 ・・・・ static const char *r_max[7] ={"err","750","7500","75k","750k","9.2M","20M"}; ・・・・・ Lcd_Custom_Out(1,1,err_ms[1]); ・・・・ ただし、Lcd_Custom_outはあらかじめ用意されている関数で、定義は次のようになっています。 void Lcd_Custom_Out(char row, char col, char *text); LCDとは2行16文字からなる液晶表示器で、rowで表示する行、colで左から何番目に表示するかを指定します。 そして、これが含まれたソースコードをコンパイルすると、Lcd_Custom_Outの行で、 illegal pointer conversion [?T53] to [text] というエラーが返されてしまいます。 [?T53]という部分が理解できないのですが・・・ 私はC言語はそこまで得意ではないので、何がいけないのか非常に困っています。 使用したコンパイラ「mikroC 8.2」で、ANSIに準拠しております。 大変困っております。どなたかご教授お願いいたします。

  • 【MATLAB】配列内の数値のキャンセル方法

    MATLAB という汎用数値解析プログラムを使っています。 現在、100×100の配列の中にランダムな数字(0~40)が入ったデータを扱っています。 しかし、中にはマイナスの値や100を超える値も時々入ってしまっています。 できれば0~40の間の値の中で平均値や最大・最小値を算出したいと考えています。 この外れ値を計算せず(もしマイナスや40以上ならその値は無かったことにして)平均値等を出すことは可能でしょうか? if文なども考えたのですが、いまいち書き方が分からず困っています。 どうかご回答よろしくお願いいたします。

  • Visual C++では問題があるのにgccではうまくいく理由

    Visual C++(2005)付属のコマンドラインのコンパイラを使って(cl)コンパイルしたプログラムでは、出力したい値を格納するdouble型の変数の値が、-1.#IND00となってしまうのに対して、 まったく同じソースをgccでコンパイルした場合には、普通の数値が正常に出力され、その値は事前の予想どおりの傾向を持っていることから、まちがってはいないようです。 clではうまくいかず、gccではうまくいくのはなぜなのでしょうか。 関係があるかどうかわかりませんが、値の算出の過程でrand()を使っています。

  • C++のクラス内での2次元配列

    C++学習者です。Windows 10上で、Visual Studio Community 2015 を使って勉強しています。 2次元配列を持つクラスを作ろうとしていますが、クラス定義ファイルの中のプライベート変数部分に2次元配列を定義しようとするとエラーメッセージが出てきます。 自分のソースコードは次のようなもので、最後の int aray[rowSize][colSize]; の部分に赤い波線が出ていて、そこにカーソルを合わせると「静的でないメンバー参照は特定のオブジェクトを基準とする相対参照である必要があります。」というメッセージが出ます。 #pragma once #ifndef DSUBARRAY_H // Double Subscripted Array #define DSUBARRAY_H #include <iostream> using namespace std; class DsubArray { public: friend ostream &operator<<(ostream &, const DsubArray &); // output array friend istream &operator>>(istream &, DsubArray &); // input array DsubArray(const int=1, const int=1); // default constructor DsubArray(DsubArray &); // copy constructor ~DsubArray(); // destructor int &operator()(int, int);// subscript -- lvalue const int &operator()(int, int) const; // subscript -- rvalue DsubArray &operator=(DsubArray &);// assignment bool operator==(DsubArray &) const; // equality check of the two arrays bool operator!=(DsubArray &) const; // inequality check int getRowSize() const; int getColSize() const; private: int rowSize; int colSize; int aray[rowSize][colSize]; }; #endif これをたとえば次のように書き換えると、赤い波線は消えるのですが、今度はコラムのサイズが10に固定されてしまい、コンストラクターでこれと異なる数値を与えるとエラーになってしまうのではないかと心配します。 int aray[ ][10]; どなたか2次元配列の正しい作り方を教えてください。お願いいたします。

  • 配列について

    C++で下に示したソースコードを参考書を使って書き、文字列を出力する簡単なプログラムを作りました。 #include <iostream> using namespace std; void strout1(char ss[]); int main() { char aa[10] = "abcde"; strout1(aa); strout1("こんにちは"); return 0; } void strout1(char ss[]) { cout << ss << '\n'; } ここで char aa[10] = "abcde"; の部分のaaについて知りたいことがあります。この配列の [] の中の数字は日本語の こんにちは を表示するために 10 を入れているのでしょうか? 確か日本語は一文字2文字幅で表示するのでしたっけ? でもこのソースコートは  char aa[6] = "abcde";のように[]の中を6にしても普通のコンパイルでき、こんにちは も表示できました。5以下の数字だと error C2117: 'aa' : array bounds overflow となりエラーメッセージがでます。 ここでなぜ aa[6] なのに日本語文字の こんにちは が表示できるのでしょうか? 日本語一文字につき2ビット表示なら こんに までしか表示できないように思うのですが。 また仮に strout1("こんにちは"); の文を抜かして char aa[5] = "abcde"; のように宣言してもエラーになります。 "abcde"は5文字なので aa[5] としても良いようにおもうのですがなぜエラーになるのでしょうか?

  • 文字列のメンバ変数を外部変数のように扱いたい

    済みません。質問なのですが、 メンバ変数を外部変数のように扱うにはどうしたらよいのでしょうか? int型などの場合、 class test{ static const int a; }; const int test::a = 10; とすればよいですよね? これをcharの配列にして class test{ static char a[7][32]; }; char test::a[0] = "test"; とすると サイズが0の配列を割り当てまたは宣言しようとしました というコンパイルエラーがでてしまいます…。 多次元配列の場合はstatic変数としてもてないのでしょうか? char** として宣言してもどこでnewを行えばよいか解りません。 コンストラクタの中で行えば そこでstaticではなくなってしまいますし…。 後、できればstringクラスの配列で持ちたいのですが #include <string> class test{ static string test[7]; }; string test::test[0] = "aaa"; なんてことができますでしょうか? 質問内容が解りにくいかも知れませんが どうか教えてください。 宜しくお願いいたします。

  • 構造体や配列へのポインタについての質問です

    いつもお世話にばっかりなっているものですが、 表題の件で質問です。 ある関数で定義した構造体や配列へのポインターを、 他の関数で処理する方法ですが、 以下のやり方であっているでしょうか? typedef struct _abc { char name[50]; int value; } abc; の場合 void func_from() { abc xyz; char * y[2]; y[0] = xyz.name; y[1] = ( char * )&xyz.value; func_to( y, &xyz ); } void finc_to( char ** x, abc * pqr ) { *x = pqr->name; *( x + 1 ) = ( char * )&( *pqr ).value; } 上の例、数値は(char *)型にして入れる仕様だと思ってください。 本番バージョンはもっと違うのですが、 コンパイルエラーなく動いている、みたいです;D ただ、ぜんぜん自信がないので、 大丈夫だよと一言言ってもらえるか、 そらあかんは、というコメントお待ちしていますm(__)m

  • 多次元配列について質問

    以下はあるJavaの参考書の問題文とその解答ソースコードです。 疑問点があるので、質問に答えてくだされば幸いです! 問題文:じゃんけんゲームを作成します。ジャンケンは次の図のように数値で表します。勝敗表も示します。(『次の図』と『勝敗表』は、Upした画像を参考にしてください。) 次のメソッドを持つクラスを作成します。 A.rand3メソッド ・乱数を使って1,2,3のどれかの値を作成して返す(グー、チョキ、パーにあたる) B.jankenメソッド ・人が入力したじゃんけんの種類(1,2,3のどれか)を仮引数nに受け取り、次の処理を行う。 1:rand3メソッドでコンピューター側のじゃんけんの値を変数mに得る 2:mとnを比較して次のどれかの値を返す ・人が勝ちなら 1・コンピューターが勝ちなら2 ・引き分けなら0 C. isJankenメソッド ・int の値を仮引数nに受け取り、nが1,2,3のどれかであるときtrue、そうでなければfalseを返す D.mainメソッド ・キーボードをタイプして1,2,3のどれかの値を入力し、それを実引数としてjankenメソッドを呼び出し、勝敗を表示する。   1:isJankenメソッドを使って、人が入力した数値が1,2,3のどれかであるかどうか検査し、もしも1,2,3以外なら「入力した値が正しくない」と表示して直ちに処理を終了します。 2:入力値が正しければ、jankenメソッドを実行する。   3:結果は、「勝ち」「負け」「引き分け」のどれかの文字列を表示する。 ------解答ソースコード------- package 第16章; import lib.Input; public class 通過テスト2 { public static void main(String[]arg){ int n=Input.getInt(); if(isJanken(n)){ System.out.print(n+":"); switch(janken(n)){ case 0: System.out.println("引き分け"); break; case 1: System.out.println("勝ち"); break; case 2: System.out.println("負け"); break; } }else{ System.out.println("入力した値が正しくない"); } } public static int rand3(){ int com=(int)(Math.random()*3+1); return com; } public static boolean isJanken(int n){ if(n==1||n==2||n==3){ return true; }else{ return false; } } // public static int janken(int n){ int[][]tb1={ {9,9,9,9}, {9,0,1,2}, {9,2,0,1}, {9,1,2,0} }; int m=rand3(); System.out.println(m+" "); return tb1[n][m]; } } -----解答ソースコード終----------- 質問:Jankenメソッドの2次元配列について、その意味が全然わかりません。Upした画像の「勝敗表」を表してるのはわかるのですが、その勝敗表とどのような対応関係にあるのかわかりません。 具体的な疑問点は以下の2点です  1点目:何故「9」という数字があるのかわかりません。  2点目:何故2次元目の要素数が「4つ」あるのかわかりません。1次元目の要素数も4つありますが、それもわかりません。 ごめんなさい、、ほんとに何もかもわからない。手取り足取り教えていただきたいです。。

    • ベストアンサー
    • Java
  • 警告 : 問題のあるポインタの変換

    #include <iostream.h> char *f(){   char buf[1] = "\0"; // char *buf = "\0";  return static_cast<char*>(buf); } main(){  cout << f(); これで、関数の型が char * なのに、char [] 型変数を 返そうとするソースだからコンパイルで警告が出るんだと思いました。 関数の型が char [] なのに、char * 型変数を返したなら 返された値を変更できないから不都合が起こるのが 分かりますが、上に書いたソースの場合は不都合なことに なりますか? 問題のあるポインタの変換ということを言われるのが納得 できないので、納得させてください。

専門家に質問してみよう