可変長配列の初期化はできる?エラーの解決方法を教えてください

このQ&Aのポイント
  • iOSでマップアプリを開発している際に、NSMutableArrayからデータを呼び出してCustomAnnotationクラスの初期化を行いたいと思っています。しかし、for文を使用して複数の初期化を行おうとするとエラーが発生します。エラーメッセージは「Variable-sized object may not be initialized」と出力されます。
  • このエラーは、可変長配列の初期化ができないことを示しています。つまり、for文や配列のインデックスを使用して可変長配列を初期化することはできないのです。
  • 解決策としては、可変長配列の代わりにNSMutableArrayを使用する方法があります。NSMutableArrayは可変長であり、要素を追加・削除することができます。そのため、for文を使用して複数の要素を追加することが可能です。具体的なコード例としては、NSMutableArrayのインスタンスを作成し、for文内で要素を追加する方法です。
回答を見る
  • ベストアンサー

可変長配列の初期化

いつもお世話になっております。 iOSで開発を勉強中の者です。 マップアプリを開発しており、NSMutableArrayからデータを呼び出して以下のようにCustomAnnotationクラスの初期化を行っていました。 CustomAnnotation *Pin1 = [[CustomAnnotation alloc] initWithLocationCoordinate:CLLocationCoordinate2DMake(numberToDouble(Latitude[1]), (numberToDouble(Longitude[1])) title:Title[1] subtitle:Subtitle[1]]; これを、for文を使って複数一度に初期化を行おうとしたのですが、エラーが出てしまいました。 コードは下のようになっています。 for(int i=0; i<10; i++) { CustomAnnotation *Pin[i] = [[CustomAnnotation alloc] initWithLocationCoordinate:CLLocationCoordinate2DMake(numberToDouble(Latitude[i]), (numberToDouble(Longitude[i]))) title:Title[i] subtitle:Subtitle[i]]; } Variable-sized object may not be initialized と出ているのですが、可変長配列の初期化はできないのでしょうか・・・。 またできるとしたらどのような方法があるのでしょうか。 どうかよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • harawo
  • ベストアンサー率58% (3742/6450)
回答No.1

なにか問題が発生したとき、その問題の原因が自分自身にあると、最初に思う人間は、むしろ少数であって、コンパイラの欠陥だとか、言語仕様の欠陥と考えたがるのが多数派だというのは、理解できます。たしかに私自身にもそういう傾向はあります。しかしそれは人間の心理の話であって、現実世界の事実は、コンパイラや言語仕様に原因を認められるケースはほとんどなく、99.9%は人為ミスです。 for(int i=0; i<10; i++) { CustomAnnotation *Pin[i] = [[CustomAnnotation alloc] ~~~~~ こういう書式はありえません。 サンプルを示します。 NSMutableArray *testArray = [NSMutableArray array]; for (int i = 0; i < 10; i++) { testArray[i] = [NSNumber numberWithInt: i + 1]; } for (int i = 0; i < 10; i++) { NSLog(@"%d", [testArray[i] intValue]); } これはモダンな書き方で、従来の書式はこちら。 NSMutableArray *testArray = [NSMutableArray array]; for (int i = 0; i < 10; i++) { [testArray addObject: [NSNumber numberWithInt: i + 1]]; } for (int i = 0; i < 10; i++) { NSLog(@"%d", [testArray[i] intValue]); } 以上を参考にしてください。

katsuo777
質問者

お礼

お礼が遅くなり申し訳ありません。 丁寧に回答していただきありがとうございます。 ご指摘の通り、自分自身の知識不足から来るミスです。 これから勉強して参ります。 いただいたサンプルや、他サイト様の情報から何とかやりたい動きをさせることができました。 ありがとうございました。

関連するQ&A

  • MKMapkitの緯度経度を配列から呼びたい

    Objective-cで開発を行っている初心者です。 最近、MKMapkitを使って地図上にピンを立てられるようになったのですが、ピンを立てる位置情報をNSMutableArrayから呼んでこようとしたところつまづいてしまいました。 [Latitude addObject:[NSNumber numberWithDouble:35]]; [Latitude addObject:[NSNumber numberWithDouble:36]]; // CustomAnnotationクラスの初期化(インスタンス化) CustomAnnotation *Pin = [[CustomAnnotation alloc] initWithLocationCoordinate:CLLocationCoordinate2DMake(Latitude[0], 139.763153) title:@"テスト" subtitle:@"test"]; 以上の部分で、"Passing 'id' to parameter of incompatible type 'CLLocationDegrees' (aka 'double')"のエラーが・・・。 latitude,longitudeの型を調べたところdouble型であるとあったのでそのようにして配列をつくったのですが、まだなにかしなければならないことがあるのでしょうか? 初歩的な質問かとは思いますが、どうかよろしくお願いします。

  • c言語 可変長配列

    下は可変長配列のプログラムである.提供される可変長配列に文字列を格納するにはどのようにすればよいのでしょう.使い方の例を示していただけると助かります. #include <assert.h> #include <stdio.h> #include <stdlib.h> #include <string.h> /* 可変長配列の初期サイズ */ #define INIT_SIZE 5 typedef struct vector Vector; typedef Vector *VectorPtr; /* 可変長型配列の構造体 */ struct vector { char **elems; /* 要素(文字列)の配列(固定長)*/ int size; /* 可変長配列のサイズ */ int capacity; /* 可変長配列の最大容量 */ }; /* 可変長配列を生成する */ VectorPtr create_vector(void) { VectorPtr v = NULL; v = malloc(sizeof(Vector)); if (v == NULL) { fprintf(stderr, "Couldn't allocate memory for a vector\n"); exit(EXIT_FAILURE); } v->elems = malloc(sizeof(char *) * INIT_SIZE); v->size = 0; /* 初期使用サイズは 0 */ v->capacity = INIT_SIZE; return v; } /* 可変長配列の実質的な解放作業を行う. * (次々と free() するので free() 後の NULL 代入は省略) */ void delete_vector0(VectorPtr v) { int i; /* free() と同様,NULLポインタに対しては何も行わない */ if (v == NULL) { return; } /* 各要素(文字列)の領域を解放 */ for (i = 0; i < v->size; i++) { free(v->elems[i]); } free(v->elems); /* 内部配列の領域を解放 */ free(v); /* 外側の枠も解放 */ } /* 可変長配列 v を初期化する(未使用状態にするだけで領域は解放しない).*/ void clear_vector(VectorPtr v) { int i; assert(v); /* 要素の各文字列を解放 */ for (i = 0; i < v->size; i++) { free(v->elems[i]); v->elems[i] = NULL; } /* 使用サイズを0にする */ v->size = 0; } /* 可変長配列 v を拡大する */ void expand_vector(VectorPtr v) { assert(v); /* 最大容量を2倍に増やす */ v->capacity *= 2; /* 新しい最大容量を持つ領域を確保 */ v->elems = realloc(v->elems, sizeof(char *) * v->capacity); /* サイズを変更できなかった場合のエラー処理 */ if (v->elems == NULL) { fprintf(stderr, "Couldn't re-allocate memory for a vector\n"); exit(EXIT_FAILURE); } } /* 可変長配列 v の最後に文字列 s を追加 */ void append(VectorPtr v, char *s) { assert(s); /* 容量が一杯になったら容量を拡大する */ if (v->size == v->capacity) { expand_vector(v); } v->elems[v->size] = _strdup(s); /* 最後に要素を追加 */ v->size++; /* 使用部分のサイズを1つ増やす */ } /* 可変長配列の(使用部分の)サイズを返す.*/ int get_vector_size(VectorPtr v) { assert(v); return v->size; } /* 可変長配列 v における添え字 index の要素(文字列)を取得 */ char *get_elem(VectorPtr v, int index) { assert(v); /* 配列添え字の範囲をチェック */ if (index < 0 || index >= v->size) { fprintf(stderr, "Index out of bounds"); exit(EXIT_FAILURE); } /* 指定された添え字の値を返す */ return v->elems[index]; } /* 可変長配列の内容を横に並べて表示する.*/ void print_vector(VectorPtr v) { int i; assert(v); if (v->size == 0) { printf("(empty)\n"); return; } for (i = 0; i < v->size; i++) { printf(">>%s", v->elems[i]); } printf("\n"); } int main(void) { return 0; }

  • テーブルビューで配列が自動消滅することについて

    xcode4.1をつかってiphoneアプリを作成しています。 テーブルビューの画面遷移時に、 可変配列NSMutableArrayに plistを読み込ませたNSMutableDictionaryの一意のキーの中身を保存し、 更に選択した行番号で呼び出した配列の中身を別ビューに渡そうとすると失敗してしまいます。 ・・自動解放されてしまっていると思うのですが、 [[[NSMutableArray alloc] init] retain]; としてもうまくいきませんでした。 どうすればうまくデータを別ビューに渡せるでしょうか。 (plistの読み込みは必須です。。) すみませんがご教授いただけますでしょうか。。。 よろしくお願いいたします。 //-------- .h------ @interface DtlVCL : UITableViewController { //別のViewからデータ受け渡し用 NSString *rcvStr; //plist一時読み込み用 NSMutableDictionary *dic; NSMutableArray *ary; } .m------------ viewDidLoad------ //各変数初期化 ary = [[[NSMutableArray alloc] init] retain]; dic = [[[NSMutableDictionary alloc] init] retain]; id path = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"xxxxxxxx.plist"]; if([[NSFileManager defaultManager] fileExistsAtPath:path] == YES){ dic = [NSMutableDictionary dictionaryWithContentsOfFile:path]; }else{ NSLog(@"Dtl :ファイル読み込みエラー"); } ary = [dic objectForKey:rcvStr];//rcvStrは前ビューから取得した文字列 ------------------- - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath------ ExpVCL *expvcl = [[ExpVCL alloc] initWithNibName:@"ExpVCL" bundle:nil]; //データの受け渡し expvcl.rcvNum = [indexPath row]; expvcl.rcvStr = [NSString stringWithFormat:@"%@",[ary objectAtIndex:[indexPath row]]]; [self.navigationController pushViewController:expvcl animated:YES]; [expvcl release];

  • Objective-C for文でのインスタンス

    既出の質問と類似してますが、解決しないので質問します。 Objective-CのNSMutableArrayを使いラベルを複数個作りならべたいのですが、 変数iを使ってラベルに番号をつける方法がわかりません。 今のコードは NSMutableArray *tiles = [NSMutableArray array]; for( int i=0; i<25; i++ ){ UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(0,0, tileSize,tileSize)]; label.text=[NSString stringWithFormat:@"%d",i]; [tiles addObject:label]; [self.view addSubview:label]; } です。 これを UILabel *label%d,i = [[UILabel alloc]initWithFrame:CGRectMake(0,0, tileSize,tileSize)]; のようにして、 label0、lable1、label2、label3・・・・ というように生成するにはどうしたらいいですか? Objective-C初心者です。 よろしくお願いします。

  • 文字列配列を動的に割り当てるアルゴリズムはこのようなものであっていますか?

    結果的に char strs[10][10]; と同じ領域を確保しようというものです。 ちなみにコンパイル時に warning C4700: local variable 'strs' used without having been initialized という警告がでますが、きちんと動作します。 この警告の意味することがわからないのと、今回のようなアルゴリズムとして適当なものであるのか教えてほしいです。 ↓以下ソース↓ #include <stdio.h> #include <stdlib.h> int main(){ char **strs; *strs = (char *)malloc(10); for( int i=0 ; i < 10 ; i++ ){ strs[i] = (char *)malloc(10); } strs[0] = "maiueo"; strs[1] = "kakiku"; printf("%s", strs[0] ); printf("%s", strs[1] ); for( int i=0 ; i < 10 ; i++ ){ free(strs[i]); } free( *strs ); return 0; }

  • [再]objective-c 描画処理について

    前回質問させて頂きましたが、まだ抜け出せていないので教えて下さい。 ↓↓↓ -------------------------------------------------------------------------------------------------------------- 初心者ですが、iPhoneアプリを作成しています。 画像を並べてスクロールできるように配列で描画処理を行ないたいのですが、うまくいきません。 今のところのコードはこんな感じです↓ - (void)viewDidLoad { [super viewDidLoad]; NSMutableArray* imageList = [NSMutableArray array]; for (int i=1; i < 20; i++) { UIImage* image = [UIImage imageNamed: [NSString stringWithFormat:@"%d.jpg", i+1]]; [imageList addObject:image]; } MyImageView* imageView = [[MyImageView alloc] initWithImage:imageList]; scrollView.contentSize = imageView.bounds.size; [scrollView addSubview:imageView]; [imageView release]; } どなたか分かる方、教えて頂けますよう宜しくお願いします。 -------------------------------------------------------------------------------------------------------------- ↓ NSArray *initWithImage;と引数で渡しましたが、 「MyImageView* imageView = [[MyImageView alloc] initWithImage:imageList];」 の部分で、「Incompatible pointer sending 'NSMutableArray *' to parameter of type 'UIImage *'」とエラー表示され、実行すると、 「Tread1 : Program received signal: "SIGABRT"」で落ちてしまいます。

  • objective-c 描画処理について

    初心者ですが、iPhoneアプリを作成しています。 画像を並べてスクロールできるように配列で描画処理を行ないたいのですが、うまくいきません。 今のところのコードはこんな感じです↓ - (void)viewDidLoad { [super viewDidLoad]; NSMutableArray* imageList = [NSMutableArray array]; for (int i=1; i < 20; i++) { UIImage* image = [UIImage imageNamed: [NSString stringWithFormat:@"%d.jpg", i+1]]; [imageList addObject:image]; } MyImageView* imageView = [[MyImageView alloc] initWithImage:imageList]; scrollView.contentSize = imageView.bounds.size; [scrollView addSubview:imageView]; [imageView release]; } どなたか分かる方、教えて頂けますよう宜しくお願いします。

  • ArrayListを使った多次元配列の作成について

    ArrayListで可変長配列を扱っているのですが、 2次元可変長配列を用いる必要が出てきたので、 下記のように変更したのですがうまくいきません。 何が悪いのか教えていただけませんでしょうか? ----------------------------------------- ArrayList cars=new ArrayList(); cars.add("フェラーリ"); cars.add("ポルシェ"); cars.add("メルセデスベンツ"); for(int i=0;i<cars.size();i++){  String str=(String)cars.get(i);  System.out.println(str);} ----------------------------------------- 上記から下記のように変更しました。 ----------------------------------------- ArrayList[] cars=new ArrayList[3]; cars[0].add("フェラーリ"); cars[0].add("ポルシェ"); cars[0].add("メルセデスベンツ"); for(int i=0;i<cars[0].size();i++){  String str=(String)cars[0].get(i);  System.out.println(str);} ----------------------------------------- エラーは「Exception in thread "main" java.lang.NullPointerException」です。 どうやら初期配列が10ではなく3となってしまっているようです。

    • ベストアンサー
    • Java
  • Rubyにおける配列の中の配列の指定の仕方

    こんにちは。rubyを使用しているrgss2という言語でゲーム開発をしているものです。 タイトルのことで質問があります。 たとえば a=[] for i in 0..3 a[i] = ["あ","い","う","え","お"].scan(/./) end としたとします。 そうするとa[0]に["あ","い","う","え","お"]がはいって a[1]に["あ","い","う","え","お"]がはいって....という風になりますよね? そのときに「a[1]という配列の一部」の中の配列の頭から1番目を指定するにはどうしたいいのでしょか? なんだかとても頭がこんがらがってきてしまう話ですが どなたかわかる方ご回答といただけないでしょうか? よろしくお願いします。

  • 配列の配列をmemcpyやmemcmpしたいです

    【環境】WindowsXP(SP2)、VisualStudio2005++(MFC) タイトルの通りなんですが、配列の配列を比較したりコピーしたいのですが、以下に質問を3つ記載させていただきますので、どなたかご教授お願いいたしますm(__)m 1.宣言と初期化について char **buf; buf = new char*[3200]; for(int i=0; i < 3200; i++) { buf[i] = new char[4]; } これで、buf[1]、buf[2]、buf[3]、buf[4]に、それぞれ3200のchar型の配列が宣言された事になりますでしょうか? ※buf[4][3200] なのか buf[3200][4]なのかよく分からないです。 2.上記の方法で定義した2つの配列(bufとtmp)の比較 for(int i =0; i < 4; i++) { memcmp (buf[i], tmp[i], sizeof(tmp[i])); } これで比較出来ますでしょうか? 3.上記の方法で定義した2つの配列(bufとtmp)のコピー for(int i =0; i < 4; i++) { memcpy_s(buf[i], sizeof(buf[i]), tmp[i], 3200 * sizeof(char)); } これではバッファオーバーランエラーが発生してしまうのですが、どこがおかしいでしょうか? 以上3点、初心者の質問なので意味が分からないような箇所があるとは思いますが、どうかご教授お願いいたしますm(__)m  

専門家に質問してみよう