- ベストアンサー
D言語の連想配列の配列
Tacosanの回答
int[3][char []] x; と宣言しているのだから, 使うときには x["abc"][0] = 1; のようになるのでは?
関連するQ&A
- D言語の連想配列をコピーしたい
D言語で連想配列をコピーしたいのですが、 int[char[]] x; int[char[]] y; for(char[] a,int b;x) { y[a]=b; } などと要素を一つ一つコピーするしかないのでしょうか。 もっと効率のよいコピーはないのでしょうか。
- 締切済み
- C・C++・C#
- D言語の連想配列
D言語の連想配列を使いたいのですが、うまくいきません。同じキーを違うキーだと判定しているようです。 class ではなくstructだとうまくいくようなのですが… class A { int[2] a; this(int p,int q) { a[0]=p; a[1]=q; } int toCmp(A *x) { if(this.a[0]<x.a[0])return -1; if(this.a[0]>x.a[0])return 1; if(this.a[1]<x.a[1])return -1; if(this.a[1]>x.a[1])return 1; return 0; } } int main(char[][] args) { int[A] x; x[new A(1,2)]=1; x[new A(1,2)]=2; foreach(A a,int i;x) { printf("(%d %d) %d\n",a.a[0],a.a[1],i); } return 0; } 実行結果 (1 2) 2 (1 2) 1
- 締切済み
- C・C++・C#
- 動的配列の受け渡しについて
動的に定義した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)
- ベストアンサー
- C・C++・C#
- 構造体や配列へのポインタについての質問です
いつもお世話にばっかりなっているものですが、 表題の件で質問です。 ある関数で定義した構造体や配列へのポインターを、 他の関数で処理する方法ですが、 以下のやり方であっているでしょうか? 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
- ベストアンサー
- C・C++・C#
- 2次元配列とポインタの引数受け渡しについて
2次元配列を関数に渡すときは、引数に渡す2次元配列と同じサイズを指定、もしくは2次元目のサイズのみ合わせて渡す方法がありますが、両方とも違うサイズで同じ関数を使いたいです。 最初は中身が同じで引数で受け取る2次元配列のサイズだけ、それぞれに合わせた引数を持つ関数を2つ作っていたのですが、なんだか冗長な気がしました。 そこで、2次元配列の先頭ポインタとサイズを受け取るようにすればいいのかと思い、テストとして次のプログラムを作成してみました。 #include <stdio.h> void func(unsigned char *a, int y, int x); int main(void) { unsigned char a[10][10]; func(a, 10, 10); printf("%d\n", a[7][4]); return 0; } void func(unsigned char *a, int y, int x) { int i, j; for (i = 0; i < y; i++) { for (j = 0; j < x; j++) { *(a + i*y + j) = i * j; } } } もちろんこれでも動くのですが、やはりこういう書き方はルールにはないので、コンパイルで警告が出ます。 a.c: In function ‘main’: a.c:10: warning: passing argument 1 of ‘func’ from incompatible pointer type a.c:4: note: expected ‘unsigned char *’ but argument is of type ‘unsigned char (*)[10]’ このような書き方はやはりやめたいいのでしょうか。 また、その際はサイズ別に関数を作るしかないのでしょうか。 他にいい方法があれば教えていただけると助かります。
- ベストアンサー
- C・C++・C#
- C言語でunsigned char配列を連結する方法ってありますか?
C言語でunsigned char配列を連結する方法ってありますか? 例えば unsigned char test[]={0x00,0x02,0x03}; unsigned char test2[]={0x05,0x06}; という配列があったとして test[]という配列のあとにtest2の配列を追加することは可能でしょうか? {0x00,0x02,0x03,0x05,0x06}という配列になればOKです。 よろしくお願いします。
- ベストアンサー
- C・C++・C#
- 関数から配列を返すには?
return で配列を返すにはどうしたらよいのでしょうか。 例えば以下のような場合です。 int main (){ char Value[] = "999"; int a; a = test(Value); printf ("%d", a); } int test(char *Value) { int nVal[255]; ここで nVal に適当な処理をして・・・ return Value; } int a を配列とかにしてみましたけど、コンパイラが 通りません。 要は配列数値を main で受け取って表示したいのですが、 本日C言語はじめたところなので、教えていただければありががたいです。
- ベストアンサー
- C・C++・C#
- 多元配列について(ANSI C)
動的多元配列で、 Voidポインタに、多種の型がぶら下がった多元配列を作り、 読み書きをしたいのですがどのようにしたらよろしいでしょうか。 具体的には、 x[0][1]は、intで「2」が入っている x[0][4]は、intで「9」が入っている x[1][2]は、charでしかも文字列の配列で「goo」が入っている x[1][5]は、charでしかも文字列の配列で「教えて」が入っている x[0]は、int型の配列。X[1]は、文字列型の配列。 というようなものです。 一応ソースは作ってみたのですが、int型では問題なくいくのですが、 文字列は、コンパイルはできますが、実行すると予期せぬことが起きます。 #include <stdio.h> #include <stdlib.h> #include <string.h> int main (void) { void **topPointa; int * iDataInput; int * iDataOutput ; char * chDataInput; char * chDataInput2; char * chDataOutput1 ; // ポインタアドレス用のメモリ確保 topPointa = (void *) calloc (10 , sizeof(void *)); if(topPointa == NULL) { printf("メモリが確保できません\n"); exit(-1); } //int配列のメモリ確保 iDataInput = (int * ) calloc (10 , sizeof(int)); if(iDataInput == NULL) { printf("メモリが確保できません\n"); exit(-1); } iDataInput[0] = 3 ; iDataInput[1] = 4 ; topPointa[0] = (void * ) &iDataInput; //int配列の取り出し iDataOutput = *(int *) topPointa[0]; printf( "int: %d\n", iDataOutput[0] ); printf( "int: %d\n", iDataOutput[1] ); //char配列 のメモリ確保 chDataInput = (char * ) calloc (10 , sizeof(char *)); if(chDataInput == NULL) { printf("メモリが確保できません\n"); exit(-1); } chDataInput2 = (char * ) calloc (10 , sizeof(char)); if(chDataInput2 == NULL) { printf("メモリが確保できません\n"); exit(-1); } strcpy(chDataInput2 , "hoe"); chDataInput[0] = &chDataInput2; topPointa[1] = (void * ) &chDataInput; //char配列の取り出し chDataOutput1 = *(char *) topPointa[1]; printf( "char: %S\n", chDataOutput1[0] ); free(iDataInput); free(chDataInput); free(chDataInput2); return 0; } 言語は、C言語ANCI Cでお願いします。 以上。よろしくお願いします。
- ベストアンサー
- C・C++・C#
お礼
回答ありがとうございます。 逆になるんですね。 ところでkeyの配列を得たいのですがx[0].keysとやると怒られてしまいます。どうしたらいいですか。