ベストアンサー ※ ChatGPTを利用し、要約された質問です(原文:配列) 配列を渡す場合の注意点 2005/01/11 23:07 このQ&Aのポイント Javaの配列を渡す場合、初期化された配列をそのまま渡すことはできますが、{}で新しく配列を生成することはできません。値の入った配列を渡す場合は、事前に配列を初期化してから渡す必要があります。例えば、int[] a = {0,1,2,1,0};という配列がある場合、test(a);のように渡す必要があります。 配列 public void test(int[] x){ ... } というメソッドに配列を渡したいとき、 test(new int[5]); は可能ですが、 int[] a = {0,1,2,1,0} という書式が可能なことから、 test( {0,1,2,1,0} ); としてみたのですが、コンパイルでひっかかります。 {}による配列生成は初期化のみに限定されているのでしょうか。 値の入った配列をこのtestに入れてやりたい場合は、 int[] a = {0,1,2,1,0}; test(a); としていかないといけないのでしょうか。 質問の原文を閉じる 質問の原文を表示する みんなの回答 (1) 専門家の回答 質問者が選んだベストアンサー ベストアンサー UKY ベストアンサー率50% (604/1207) 2005/01/11 23:31 回答No.1 このように書きます。 test(new int[] {0,1,2,1,0}); 配列を宣言と同時に初期化する場合は、 int[] a = {0,1,2,1,0}; と書けますが、省略せずに書くならば int[] a = new int[] {0,1,2,1,0}; となります。 逆に、配列を宣言と同時に初期化する場合以外(今回のメソッド呼び出しもそうですが)は省略できません。そういう意味で int[] a = {0,1,2,1,0}; という省略した書き方はむしろ特殊なものだといえます。 new int[5] の場合もそうですが、一般に配列を new するときには何型の配列なのか明確にコンパイラに伝えてやる必要があります。例えば {null, null, null} では Object[] なのか String[] なのか XXX[] なのか分かりませんよね。ちゃんと new Object[] {null, null, null} とか new String[] {null, null, null} というふうに書いてやる必要があるわけです。 ではなぜ同時に初期化する場合だけ省略できるかというと……(もう言わなくてもわかりますよね?) 質問者 お礼 2005/01/11 23:47 詳しいご解説ありがとうございます。 たしかに冷静に考えてみると型情報がないですね。 すっきりしました。 またよろしくお願いいたします。 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 カテゴリ [技術者向] コンピュータープログラミング・開発Java 関連するQ&A 多次元配列について int[]a = {1,2,3} int[]a = new int[3];//は普通の配列 int[]a = {{1,2,3},{4,5,6}}; int[][]a = new int[3][3]は //2次元配列 int[]a = {{1,2,3}{4,5,6}{7,8,9}};int[][][] = new int[3][3][3]; //は3次元配列 int[][][][]a = new int[3][3][3][3]; //は4次元配列になると思いますがこっちの方はコンパイルエラーが出ないのに int[][][][]a = {{1,2,3},{4,5,6},{7,8,9},{10,11,12}}; //はコンパイルエラーが出ます どうしてですか? 配列に値を入れるのを簡略化 配列に値を入れるのに簡略化する方法はないのでしょうか? ---ソース--- //グローバルで初期化 static int a[5]={0}; void main void{ //メイン関数で値を代入 宣言と共に初期化する場合はa[5]={ 4,6,9,2,7 } と簡略化できるのに値を代入する場合はいちいちひとつづつ値を代入しないといけないの? a[0]=4; a[1]=6; a[2]=9; a[3]=2; a[4]=7; } registerと配列 ある本に以下のような書き出しでプログラムが載っています。 >register付きで宣言された配列の先頭要素の値を表示(動作しない)< #include<stdio.h> int main(void) { register int x[5]; printf("x[0]の値は%dです。\n",x[0]); return 0; } 配列はコンパイルする段階で*(a+0)とポインタに変換されるとは理解しているのですが、私の環境(Red Hat Linux)では動作してしまいます。 さすがに、 printf("&x[0]の値は%pです。\n",&x[0]);とすると>registerにかかわらずポインタの値を求めています<という警告がでますが、 本では>動作しない<と書かれていますが、きちんとコンパイルも行われ>動作します< これはどの様に考えたらよいのでしょうか?宜しく願います。 ネットワークエンジニアとは?技術職の未来を考える OKWAVE コラム 配列のコピーをして値を返したいが //配列のコピーをして値を返したい import java.util.*; public class Test7_22 { static int[] arrayClone(int[] a){ int[] b = new int[a.length]; for(int i =0;i>a.length;i++) b[i] = a[i];//ここで代入されるはず return b; } public static void main(String[]args){ Scanner std = new Scanner(System.in); System.out.print("要素数:"); int n = std.nextInt(); int[] a = new int[n]; for(int i=0;i<n;i++){ System.out.print("a["+i+"]="); a[i] = std.nextInt(); } int[] x = arrayClone(a); for(int i=0;i<a.length;i++) System.out.println("x["+i+"]="+x[i]); } } //コンパイルするとb[0] = 0になる javaの配列 javaの配列なんですが、配列の全要素一気にメソッドを実行させることができますか? 例えば、 Turtle[] hm = new Turtle[3]; for(int i = 0; i < 3; i++){ hm[i] = new Turtle(); } と配列を生成し、fd(int s)←[sピクセル前進]というメソッドを配列の全部の要素を順番ごとにではなく全部同時に実行させたい場合、コードはどのように書けばよいのでしょうか? 動的配列の受け渡しについて 動的に定義した2次元配列を受け渡す方法がわからなくて困ってます。 配列に-1以外が入っている場合の行数を数えるプログラムを作成しています。 しかし、コンパイルすると下のエラーが出てコンパイルできません。 error:cannot convert 'long int **' to 'long int (*)[2] for argument '1' to 'long int count_line(long int (*)[2])' #include <stdio.h> long count_line(long arrau[][2]); int main(void){ long** test = new long* [100]; for(long num1=0 ; num1<100 ; num1++){ test[num1] = new long [2]; } for(int i=0 ; i<100 ; i++){ test[i][0]=-1; test[i][1]=-1; } for(int num2=0 ; num2<10 ; num2++){ test[num2][0]=1; test[num2][1]=1; } int x=0; x = count_line(test); printf("x=%d\n",x); } long count_line(long array[][2]){ long count=0; long end=0; long roop=0; while(end!=-1){ if(array[roop][1]!=-1){ count++; } end=array[roop][1]; roop++; } return(count); } どなたかお助けをー(T_T) 配列を引数にするとき ↓のようなメソッドのある時に public void method(int[] arr){} ↓のようには実行出来ると思うのですが、 int[] a = {1,2,3}; method(a); 引数に入れる時に、直接値を入れられないでしょうか? イメージ的には、 method({1,2,3}); みたいに。 よろしくお願いします。 変数の初期値 へんてこな質問かもしれません・・・ class Syokika{ public static void main(String args[]){ int[] a = new int[1]; System.out.println(a[0]); } } を実行するとどうなるかという問題なのですが、 「変数が初期化されていない」 というエラーが出ると思っていたのですが、 答えは「0と表示される」でした・・・ で、解説を見ると、「配列が生成されるときに初期値が生成される。intの場合は0だ」と書いてありました。 でも、たんにint a;とした場合にaを参照しようとすると初期化されてないですよね・・・? これはどういうことなのでしょうか・・・? C#で、引数にクラスの配列の参照パラメータを渡したい C#始めて3日目ですが、そろそろ挫折しそうです。 以下のクラス class Test{ int num; public Test(){ num = 0 }; ~Test(){}; public void set(int n){ num = n; } public int get(){ return num; } } があり、 void kakikae(Te [] t){ for(int i =0; i < 10; i++){ t[i].set(i); } } Test [] test = new Test[10] = { new Test, new Test, new Test, new Test, new Test, new Test, new Test, new Test, new Test, new Test }; kakikae(test); とした時に、test[0]からtest[9]まで 1,2,3,4,5,6,7,8,9 の値が入っている事がしたいのです。 要は、クラスの配列のポインタを渡して、相手側の関数で書き方内容が、関数から戻った時も値渡しでなく 参照渡しのように値が変わって戻ってきて欲しいです。 配列の仕組み、クラスの仕組み、パラメータの仕組みが 分からず、ここから進みません。 1から勉強できるC#の参考書も探しています。 配列の値(長文です) 現在JFrameを使ってのデバック中なのですが、どうしてもわからないので質問します。A.javaの(1)を格納しようとする時、TreeTest.javaのerrorメソッドで入れた配列をshowClassPropertyメソッドで使いたいのですが初期化されてるようで何も表示しません。どうすればきちんと動作するか教えていただけませんか?粗末なプログラムですみません。些細なことでもいいので教えていただければ幸いです。 A.java------------------------------- public class A{ TreeTest tree = new TreeTest(); ・・・ tree.error("java",1); ・・・(1) } ------------------------------------- TreeTest.java------------------------ public class TreeTest extends JFrame{ String[][] hai = new String[10][10]; int counter; TreeTest(){ ・・・ for(int ii=0;ii<10;ii++){ for(int jj=0;jj<10;jj++){ hai[ii][jj]= new String(); } } ・・・ } public void error(String a,int i){ for(int co=0;co<10;co++){ if(hai[i][co].equals("")){/*配列の中身がない場合*/ hai[i][co] = a;/* 配列にaを入れる */ System.out.println("hai["+i+"]["+co+"] = "+hai[i][co]); break; } } counter = i; } public void showClassProperty() { for(int co=0;co<10;co++){ if(!(hai[counter][co].equals(""))){/*配列の中身がある場合*/ System.out.println("hai["+counter+"]["+co+"] = "+hai[counter][co]); } } --------------------------------------- Main.java------------------------------ public static void main(String[] args){ TreeTest tree = new TreeTest(); tree.setVisible(true); } 配列の数を途中で増やすには? はじめまして。 この度、以下のようなプログラムを作りました。 が、途中で配列の数を増やすことになってしまいました。 ------------------------------------------------ struct a{ int int_a; long int_b; }; struct b{ a *aa; }; void main(void){ b *bb; bb = new b[3]; bb[0].aa = new a[5]; bb[1].aa = new a[4]; . . . } ------------------------------------------------ 具体的には、'bb'の配列を3から5に増やすようなやり方を探しています。 元の配列より大きい配列をつくり、そこにコピーすればいいと考えたのですが、 'bb'内の'aa'の配列も動的に作成しているため、それも出来ない状況です。 どなたかやり方を知っている方がいましたら、教えていただきたいです。 下手な説明ですいません。 引数に二重配列のある関数について void calc(int *a,int b,int c){ a[0]=b+c; a[1]=b-c; } void main(void){ int x[2]; int y=2,z=5; calc(x,y,z); printf("x[0]=%d,x[1]=%d\n",x[0],x[1]); } 上のように引数が普通の配列の関数ならできるのですが, 引数が下のような多重配列になるとエラーが出てしまいできません。 void keisan(int **a,int b,int c){ a[0][0]=b+c; a[0][1]=b-c; a[1][0]=b*c; a[1][1]=b/c; } void main(void){ int x[2][2]; keisan(x,6,2); printf("x[0][0]=%d,x[0][1]=%d\n",x[0][0],x[0][1]); printf("x[1][0]=%d,x[1][1]=%d\n",x[1][0],x[1][1]); } 引数に多重配列を使った場合の関数の作り方について教えてください. お願いいたします. AIは使う人の年齢や市場にも影響する?人工知能の可能性 OKWAVE コラム 多次元配列の new 多次元配列を new すると、どのような型のサイズの領域の配列が確保されるんでしょうか?たとえば、 int (*a)[2] = new int[3][2]; とすると、 1. 長さ2のintの配列へのポインタ型の長さ3の配列の領域が確保される のか、 2. int[3][2] すなわち、int が 6 つ分の領域が確保される のか。 今まで、「そりゃあ 2 の方だろう」と信じ込んであまり考えずにいたんですが、「コードの型形式からすると 1 の方の解釈でもいいよなぁ」と、ふと思ったものですから、質問させていただきました。 わたしの環境で調べてみると(配列用のハウスキーピング的な余分の領域とか、パディングなどは無視して)、確かに 1 の方なんですか、これで標準準拠なんでしょうかね?^^; XP Home Edition Ver.2002 SP2 cygwin v.1.0.2-1 GNU g++ v.4.1.1 ===== #include <iostream> #include <new> #include <cstdlib> struct A { char a; void *operator new(std::size_t s) { void *p = std::malloc(s); std::cout << "A::new(): " << p << '\t' << s << '\n'; return p; } void operator delete(void *p, std::size_t s) { std::cout << "A::delete(): " << p << '\t' << s << '\n'; if (p) std::free(p); } void *operator new[](std::size_t s) { void *p = std::malloc(s); std::cout << "A::new[](): " << p << '\t' << s << '\n'; return p; } void operator delete[](void *p, std::size_t s) { std::cout << "A::delete[](): " << p << '\t' << s << '\n'; if (p) std::free(p); } }; int main() { std::cout << sizeof(char) << '\t' << sizeof(A) << '\t' << sizeof(A(*)[8]) << '\n'; A *a = new A; std::cout << a << '\n'; A *aa = new A[8]; std::cout << aa << '\n'; A (*aaa)[8] = new A[8][8]; std::cout << aaa << '\n'; A (*aaaa)[8][8] = new A[8][8][8]; std::cout << aaaa << '\n'; delete[] aaaa; delete[] aaa; delete[] aa; delete a; } ===== % ./a.exe 1 1 4 A::new(): 0x870668 1 0x870668 A::new[](): 0x870678 12 0x87067c A::new[](): 0x870688 68 0x87068c A::new[](): 0x8706d0 516 0x8706d4 A::delete[](): 0x8706d0 516 A::delete[](): 0x870688 68 A::delete[](): 0x870678 12 A::delete(): 0x870668 1 配列のインデックス番号を返したいが インデックス番号を返したい x[0]=1 x[1]=2 x[2]=3 x[3]=3 x[4]=5 の場合で探す(返す)値を3とした場合⇒2,3と値が返るようにしたい import java.util.*; class Test7_23 { static int[] arraySrchIdx(int[] a,int x){ int idx = 0; for(int i=0;i<a.length;i++){ //A if(a[i]==x){ a[i] = i; idx++; } else{ a[i] = 0; } } for(int i=0;i<a.length;i++) //B System.out.println(a[i]); int[] b = new int[idx]; for(int i=0;i<a.length;i++){ if(a[i] != 0) for(int j=0;j<idx;j++) b[j]=a[i]; } for(int i=0;i<idx;i++) System.out.println("b["+i+"]="+b[i]); return b; } public static void main(String[]args){ Scanner std = new Scanner(System.in); System.out.print("配列の要素数は:"); int n = std.nextInt(); int[] x = new int[n]; for(int i=0;i<n;i++){ System.out.print("x["+i+"]="); x[i] = std.nextInt(); } System.out.print("探す値:"); int a = std.nextInt(); int[] b = arraySrchIdx(x,a); for(int i=0;i<b.length;i++){ System.out.println(b[i]); } } } JAVAのNEW配列生成とガベージコレクション解放 ある本に、IF文内での、JAVAの配列生成で、IF文のブロックを内で生成した配列が、ブロックを抜けた際の挙動が異なると書いてありました。 NEWを使わないで生成した配列では、解放されるが(例 int[] k = {10 , 20 , 30}; ) NEWを使って生成した配列(例 int[] hoge = new int {3}; )は メモリー内に残ってしまうということでしたが、多分その後 ガベージコレクションで解放されると思いますので問題はないのですが 両者とも、メモリー内に作成(用意)された同じような変数の箱を利用しているのに どうして挙動が異なるのでしょうか? NEWを使わないで生成した配列kは、例えばk[0]の中にアドレス参照でなく 10という値がそのまま入るのでしょうか? 分かりやすく教えていただけると助かります。 よろしくお願いいたします。 C#で配列の値をチェックするメソッドを書きたい C#の配列についてお教え頂けませんでしょうか? CSVファイルから1行読取り、配列に格納しています。 string[] rowdata; string x; int y; double z; TextFieldParser Parser = new TextFieldParser(FILEPATH, Encoding.GetEncoding("shift_jis")); while (!Parser.EndOfData) { //1行読取り rowdata = csvParser.ReadFields(); //読み取った値を変数に x = rowdata[0]; //string y = rowdata[1]; //int z = rowdata[2]; //double } rowdata[0~3]を変数に格納する前に、データのチェックをおこないたいです。 例えば、rowdata[1]はint型変数に格納されます。しかしrowdata[1]に格納された値が「A1」とあった場合、int型変数yには格納できずエラーが起こります。 よって、rowdata[1]に数値以外の文字列があったら「0」に置き換えるなどの処理をいれたいです。 なので、配列を受け取ってデータチェックをするメソッドを作りたいと思いますが、どのように作っていいかがわかりません。 1つのメソッドでint、double、stringかどうかの、チェックを行いたいですが、そのようなことは可能なのでしょうか? 下記のように3つメソッドを作って、データをメソッドに渡しチェックを行なうのがいいのでしょうか? string CheckData(string[] arr){}; int CheckData(int[] arr){}; double CheckData(double[] arr){}; やりたい事は、 メソッド(配列を受取る) rowdata[0]が渡された場合、中身はstringかのチェック。問題なければ格納されている値を返す。問題があれば、何らかの処理。 rowdata[1]が渡された場合、中身はintかのチェック。問題なければ格納されている値を返す。問題があれば、何らかの処理。 rowdata[2]が渡された場合、中身はdoubleかのチェック。問題なければ格納されている値を返す。問題があれば、何らかの処理。 以上のような事です。宜しくお願い致します。 c言語 int型の数字をchar型の配列に c言語についてです。 int型の数字をchar型の配列に入れたいです。 関数に対してint型の数字を文字列として渡し、 関数内でchar型の配列に格納したいです。 例として、 a(char a[]){ ~~ ~~ } int main(void){ int x = 5678; ~~ a(x); } とできるようにしたいです。 しかしこれだと5678という値がそのままchar型の一つの配列に入る?ため正しくないです。 欲しい結果としてはちゃんとa関数内で、 a[1] = '5' a[2] = '6' a[3] = '7' a[4] = '8' となってほしいです。 もともと渡す値が”5678”となっていれば結果は正しく出るのですが、 渡す値がint型と決まっているためどうにかして5678を”5678”とすればいいのではないかと考えています。 つまり5678を単純に文字列に変換すればいいのでしょうか? またプログラム内ではsprintfやatolを使用しないで実現させたいです。 難しいかもしれませんがお願いします。 なんだか説明が下手ですみません。 お願いいたします。 配列表記について 質問させてください。 以前から気になっていたのですが、 配列を宣言するときに int型の場合 int num[] = new int[5]; と宣言するのにたいして String型(インスタンス)の場合 String[] str = new String[5]; と一般的に書くのはどうしてなのでしょうか? ちなみにどちらでもコンパイルとおりますよね。 C♯の配列について C♯でプログラムを作っているのですが、配列の要素数の最大値と最小値の求め方がわかりません。配列の値の最大値の求め方は調べれば出てくるのですが、要素数の最大値等は調べてもわかりませんでした。 例えば下記のような配列があった場合 int[,,] a =new int[100,100,100] a[2,3,6]=1 a[4,5,9]=1 a[13,46,79]=1 a[8,15,45]=1 a[1,33,68]=1 それぞれの要素数の最小値1、3、6、最大値13、46、79は どのようにプログラムで求めればいいのでしょうか? よろしくお願いします。 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 注目のQ&A 「You」や「I」が入った曲といえば? Part2 結婚について考えていない大学生の彼氏について 関東の方に聞きたいです 大阪万博について 駅の清涼飲料水自販機 不倫の慰謝料の請求について 新型コロナウイルスがもたらした功績について教えて 旧姓を使う理由。 回復メディアの保存方法 好きな人を諦める方法 小諸市(長野県)在住でスキーやスノボをする方の用具 カテゴリ [技術者向] コンピューター プログラミング・開発 Microsoft ASPC・C++・C#CGIJavaJavaScriptPerlPHPVisual BasicHTMLXMLCSSFlashAJAXRubySwiftPythonパフォーマンス・チューニングオープンソース開発SEOスマートフォンアプリ開発その他(プログラミング・開発) カテゴリ一覧を見る OKWAVE コラム 突然のトラブル?プリンター・メール・LINE編 携帯料金を賢く見直す!格安SIMと端末選びのポイントは? 友達って必要?友情って何だろう 大震災時の現実とは?私たちができる備え 「結婚相談所は恥ずかしい」は時代遅れ!負け組の誤解と出会いの掴み方 あなたにピッタリな商品が見つかる! OKWAVE セレクト コスメ化粧品 化粧水・クレンジングなど 健康食品・サプリ コンブチャなど バス用品 入浴剤・アミノ酸シャンプーなど スマホアプリ マッチングアプリなど ヘアケア 白髪染めヘアカラーなど インターネット回線 プロバイダ、光回線など
お礼
詳しいご解説ありがとうございます。 たしかに冷静に考えてみると型情報がないですね。 すっきりしました。 またよろしくお願いいたします。