- ベストアンサー
正確に複製を作りたい
以下、変数のコピーで悩んでいます。 test()関数内で、正しく引数のコピーができるようにしたいのですが どうすればよいのでしょうか? int pa[50]; int pb[30][2]; int pc = 10; test(&pa, &pb, pc); void test(const int a[], const int b[][2], int c){ int aa[100]; int bb[20][2]; int cc; cc = c; // これはわかります。 aa = a; // ? 1 memcpy(aa, a, sizeof(a)); // ? 1 // aのサイズが50とわかっている場合 for (int i=0; i < 50; i++){ aa[i] = a[i]; } // bと同じ内容をbbに入れたい場合? }
- みんなの回答 (2)
- 専門家の回答
関連するQ&A
- 参照型の変数をポインタ引数を持つ関数に引数を書く方法
C++の参照を使って以下のソースを試したのですが、 memmoveの引数のところでエラーが出ます。 memmoveの引数はポインタ型で合いません。 実体コピーしたい場合、どのようにすればよいのでしょうか? const AA &aとすれば、a自体が関数内で書き換わる心配がないので、 C++の参照型は、ポインタより安全と理解しているのですが その認識は間違っていないでしょうか? struct aa{ int x; int y; }AA; void test(AA &a) { AA b; memmove(b, a, sizeof(AA)); } void main(){ AA c; test(c); }
- ベストアンサー
- C・C++・C#
- C言語の配列のコピーについて
C言語の配列のコピーについて int a[] = {1,2,3}; int b[3]; memcpy(b, a, sizeof(a)); は、分かるのですが、 int c[][3] = { {1,2,3}, {4,5,6}, {7,8,9}, {10,11,12} }; int d[4][3]; memcpy(d, c, sizeof(c)); の使い方は正しいのでしょうか? 1次元配列の場合は連続するメモリ?なのでmemcpyでOKだと思うのですが 2次元以上の配列の場合は、メモリが連続しているか知らないので 不安に思いました。 実際、C言語でのメモリの取り方など詳しく書かれている本などありますか? よく初心者向け本にメモリは箱という大雑把なイメージで取り挙げられているのですが、突っ込んだ書籍等も探しています。 玄人の方、難しく(^^教えてください。
- ベストアンサー
- C・C++・C#
- int型の変数値をバイト列としてコピー
あるint型の変数に格納されている情報を、バイト列としてコピーする方法で困っています。 変数の入っている領域をそのままコピーしたいので、memcpyを使うかと思うですが、 コピーされた結果を見ると文字列の並びが逆転しているように見えます。 --サンプルコード抜粋 unsigned int i= 12345; unsigned char *c; c = (char *)malloc(sizeof(int)); printf("i_hex=%x\n",i); memcpy(c,(int *)&i,sizeof(int)); 出力結果 i_hex=3039 cの出力結果 3930000000 単純にmemcpyではダメなのでしょうか? 実行環境は、CentOS(32bit)+gccです。よろしくお願いします。
- ベストアンサー
- C・C++・C#
- bashで配列の個数部分を変数で指定するとエラーに
bashで配列の個数部分を変数で指定するとエラーになってしまいます。 #!/bin/bash aa[0]="a0" aa[1]="a1" aa[2]="a2" bb[0]="b0" bb[1]="b1" bb[2]="b2" bb[3]="b3" cc[0]="c0" cc[1]="c1" cc[2]="c2" cc[3]="c3" cc[4]="c4" list=(aa bb cc) for i in ${list[@]} do eval echo "$i=\${#$i[*]}" n="\${#$i[*]}" mes="\${$i[$(( ${RANDOM} * 3 / 32768 ))]}" eval echo "$mes \${$i[$(( ${RANDOM} * 3 / 32768 ))]}" done $ . list-test.sh aa=3 a1 a2 bb=4 b2 b2 cc=5 c0 c2 上記の下記箇所の「各配列の個数部分の3」をイメージ的には変数で指定したいです。 mes="\${$i[$(( ${RANDOM} * 3 / 32768 ))]}" ↓ mes="\${$i[$(( ${RANDOM} * $n / 32768 ))]}" $nのように指定すると、下記のエラーになってしまいます。 >bash: 29205 * ${#aa[*]} / 32768 : 構文エラー: オペランドが予期されます (エラーのあるトークンは "${#aa[*]} / 32768 ") ${n}や\$nや($n)など色々試してみたのですが、解決できませんでした。 恥ずかしながら、どなた様かご教授ねがえませんでしょうか
- ベストアンサー
- その他(プログラミング・開発)
- C言語の参照はずしについて
ソートのプログラムなんですが #include <stdio.h> #include <stdlib.h> int comp(const void *, const void *); int main() { int i; int test[6] = {10, 8, 2, 6, 4, 0}; qsort(test, (size_t)6, sizeof(int), comp); printf("\n"); for (i = 0; i < 6; i++) printf("%d\n", test[i]); return 0; } int comp(const void *a, const void *b) { static int i = 1; printf("%02d--%d,%d\n", i, *(int *)a, *(int *)b); i++; return (*(int *)a - *(int *)b); } 最後のreturnの()の中身がよくわかりません。「参照はずし」という事をしてるらしいんですが「参照はずし」とは何ですか意味も教えてください。
- ベストアンサー
- C・C++・C#
- C言語のsscanf関数の上手な使い方2
質問NO.60489の追加です。 C言語で、 char buf[256] = "\"aa, aa\",100,\"bb bb\",200,\"cc-cc\"; char c1[10],c2[10],c3[10]; int i1,i2; のとき、 c1 = "aa, aa" c2 = "bb bb" c3 = "cc-cc" i1=100 i2=200 に読み込みたいのですが、 sscanf(buf,"\"%[^\"]\",%d,\"%[^\"]\",%d,\"%[^\"]\"",c1,i1,c2,i2,c3); では失敗します。 sscanfのformat部分をどのように書いたらよいか分かりません。
- ベストアンサー
- C・C++・C#
- ポインタを使って関数の値のやり取り
c言語の問題なのですが、2つの異なる1次元配列の積をseki関数を使って計算してもうひとつの配列に入れてmain関数で表示するのですが、うまく走りません原因がわかる人がいた教えてください。 作った実行文は、 #include<stdio.h> int seki(int *pa,int *pb,int *pc); main(){ int a[]={5,2,3,5,3,2,4,8,9,9,7},b[]={4,3,8,4,6,2,8,9,1,6,4},c[11]={0}; int i,*pa,*pb,*pc; pa=&a; pb=&b; pc=&c; seki(pa,pb,pc); for(i=0;i<11;i++) printf("%d,",*(pc+i)); } int seki(int *pa,int *pb,int *pc){ int j; for(j=0;j<11;j++) *(pc+j)=*(pa+j) * *(pb+j); } こんな表示が出てきます。 toi2.c: In function `main': toi2.c:7: warning: assignment from incompatible pointer type toi2.c:8: warning: assignment from incompatible pointer type toi2.c:9: warning: assignment from incompatible pointer type たぶんmain関数内で書いたseki関数の引数の型に問題があると思うのですが。
- ベストアンサー
- C・C++・C#
- 3つの連想配列を交互に代入して、新しい連想配列を作りたい
PHP Version 5.1.6を使っています。 それぞれの連想配列を先頭から順番に交互に代入したいのですが、 どのようなプログラムでできるのでしょうか? $arr1 = array(a1=>"aa1", a2=>"aa2", a3=>"aa3"); $arr2 = array(b1=>"bb1", b2=>"bb2", b3=>"bb3"); $arr3 = array(c1=>"cc1", c2=>"cc2", c3=>"cc3"); 代入後 $new_arr = array( a1=>"aa1", b1=>"bb1", c1=>"cc1", a2=>"aa2", b2=>"bb2", c2=>"cc2", a3=>"aa3", b3=>"bb3", c3=>"cc3", );
- ベストアンサー
- PHP
- 二次元配列とポインタについてよくわかりません2
先ほどもしつもんして自分なりに改良をくわえたのですが 上手くいきません。 int main( void ) { int i, j; /*4 x 4 行列 A*/ double a[4][4]; double *pa; /*4 x 4 行列 B*/ double b[4]; double (*pb)[4]; /*4 x 4 行列 C*/ double c[4]; double (*pc)[4]; pa = a; pb = b; pc = c; printf("4 x 4 行列 Aの要素を入力してください>\n"); for(i = 0; i < 4; i++){ for(j = 0; j < 4; j++){ printf("A[%d,%d]=", i + 1, j + 1 ); scanf("%lf", (*(pa + i) + j)); }} printf("4 x 4 行列 Bの要素を入力してください>\n"); for(i = 0; i < 4; i++){ for(j = 0; j < 4; j++){ printf("B[%d,%d]=", i + 1, j + 1 ); scanf("%lf", &pb[i][j]); }} としたところ(途中までを表記してます) pa = a; pb = b; pc = c; のところでコンパイル時に 警告で問題のあるポインタの変換とでます なぜおかしいのかまったくわからないので よければ教えてください
- 締切済み
- C・C++・C#
- ポインタの疑問点
ポインタで分からないことがあります。 void swap(int* x, int* y){ int tmp; tmp = *x; *x = *y; *y = tmp; } /* int main(){ int *pA,*pB; *pA=5; *pB=10; cout << *pA << " , " << *pB <<"\n"; swap(pA,pB); cout << *pA << " , " << *pB <<"\n"; } */ int main(){ int a,b; a=5; b=10; cout << a << " , " << b <<"\n"; swap(&a,&b); cout << a << " , " << b <<"\n"; } 上のメイン関数ではエラーが起きます。どうしてなんでしょう? 下のと意味は同じだと思うのですが・・・
- ベストアンサー
- C・C++・C#