• ベストアンサー

C言語のプログラミング 配列について

C言語の課題でわからないところがあって困ってます。ちなみに初心者です。 int i; //添え字 for(i=0;i<○;i+=16){ //○はデーター数 a[2*i]=b[i]; a[2*i+1]=b[i+1]; a[2*i+2]=b[i+2]; a[2*i+3]=b[i+3]; : a[2*i+15]=b[i+15]; a[2*i+16]=c[i]; a[2*i+17]=c[i+1]; a[2*i+18]=c[i+2]; a[2*i+19]=c[i+3]; : a[2*i+31]=b[i+15]; } という風な配列がありまして、これをすっきりまとめたいのですが どうもエラーか配列aにNULLばかりはいってしまって上手くいきません。 どうすればよいのか教えてください。よろしくお願いします。

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

  • ベストアンサー
  • ykkw_2001
  • ベストアンサー率26% (267/1014)
回答No.2

>ちなみに初心者です。 なので、かなり推定入ってますが・・・・ まず、思い通りに動いてくれないことについて >for(i=0;i<○;i+=16){ //○はデーター数 ここは、 for(i=0;i<○;i++){ こうではないですか? やりたいことがどういうことか、かかれていないので思いっきり推定です。 #ねぇ、#1さん。 あと、「すっきりまとめたい」について、「すっきり」の価値観は結構人によって違いますので、これまたお気に召しますかどうか・・・ 私ならこんな感じです。 for(.........){ memcpy( &a[i*2], &b[i], sizeof(b)*16 ); memcpy( &a[i*2+16], &c[i], sizeof(c)*16 ); };

tommy-mitty
質問者

お礼

ありがとうございます。早速やってみたいと思います。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

  • nagare
  • ベストアンサー率33% (280/831)
回答No.5

>どうもエラー ・aの配列の領域は大丈夫ですか?  iが2であれば、aは64個必要 ・for(i=0;i<○;i+=16)だと、代入する箇所がおかしくなっていきます >NULLばかりはいってしまって ・b,cにデータを入れてます? ・for(i=0;i<○;i+=16)だと、参照する箇所がおかしくなっていきます >これをすっきりまとめたいのですが memcpyを使ったら すっきりしますが。。。(好みですけどね) int datasize=32; int blocksize=16; for (cnt=0; cnt<datasize/blocksize; cnt++) { memcpy (&a[cnt*datasize], &b[cnt*blocksize],blocksize); memcpy (&a[cnt*datasize+blocksize], &c[cnt*blocksize],blocksize); } (No.3 さんと同じ)

tommy-mitty
質問者

お礼

・aの配列の領域は大丈夫ですか? aは#defineで128としてあります ・b,cにデータを入れてます? はいっています。 ちなみに今ポインタ配列でやっています。 いろいろとありがとうございました。早速やってみようと思います。

全文を見る
すると、全ての回答が全文表示されます。
  • timber
  • ベストアンサー率29% (218/739)
回答No.4

a,b,cがすべてcharの配列ということでしたら、 memset(a, 0, sizeof(a)); for(i=0;i<○;i+=16){  strncat(a, &b[i], 16);  strncat(a, &c[i], 16); } でどうでしょうか。

tommy-mitty
質問者

お礼

ありがとうございます。早速やってみたいと思います。

全文を見る
すると、全ての回答が全文表示されます。
  • DrSumire
  • ベストアンサー率39% (264/666)
回答No.3

まとめるとこんな感じになるかな? int i,j; for(i=0;i<○;i++) for(j=0;j<16;j++){ a[(i*32)+j] = b[(i*16)+j]; a[(i*32)+j+16] = c[(i*16)+j]; } インクリメントを16づつやるよりも、式の方で調整をしたほうが分かりやすいと思いますよ。

tommy-mitty
質問者

お礼

ありがとうございます。早速やってみたいと思います。

全文を見る
すると、全ての回答が全文表示されます。
  • ro-su
  • ベストアンサー率24% (19/79)
回答No.1

aとbとcの型はなんでしょうか? あと質問の処理をまとめると ・bとcの配列の値をaにまとめたい ・bとcは16要素ずつまとめてbのデータ→cのデータ  の順に入れたい ってな感じでしょうか。

tommy-mitty
質問者

補足

a,b,cの型はchar型です。 ・bとcの配列の値をaにまとめたい ・bとcは16要素ずつまとめてbのデータ→cのデータの順に入れたい そのとうりです。16要素ずつでなくても4要素,8要素ずつとかもやっってみたいと思っています。bのデータ→Cのデータ→bのデータ→Cのデータという具合です。よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C言語プログラミングについて

    「要素数10の配列を準備する。 配列の各要素に0.0~1.0の乱数を入れる。 各配列に入力された乱数を出力する。 配列をオリジナル関数hanteiに渡す。 数hantei内において,各要素の値が0.5以上であれば1 , 0.5未満であれば0を出力する。」 C言語でこのような問題があるのですがどのように作ればよろしいのでしょうか? ちなみに以下のように作ってみて、「argcは一度も使用されていない」「argvは一度も使用されていない」とエラー(警告)が出てしまいました。修正、もしくは正しいプログラムを教えてくれませんか? #include <stdio.h> #include <time.h> #include <stdlib.h> #define SIZE 10 int hantei(double num) { return num>=0.5; } int main(int argc,char *argv[]) { double number[SIZE]; int i; srand((unsigned)time(NULL)); for(i=0;i<SIZE;i++) number[i]=(double)rand() / RAND_MAX; //手抜き乱数 for(i=0;i<SIZE;i++) { printf("%f %d\n",number[i], hantei(number[i])); } return 0; }

  • [C言語] 配列が添字の意味を失う理由

    はじめまして。こんばんは。 早速ですが、下記のソースコードは、 配列aの各要素の内容を先頭から順に調べ、最初に0であった要素の添字番号を表示する。 という内容の、C言語のプログラムです。(C++でコンパイルするためmain()はint型に指定) そこで、このプログラムを実行していて腑に落ちない点として、 プログラムの挙動を見る限り、 タイトルに書いたとおり、 「配列が添字の意味を失っている」という事なんです。 普通に配列の添字と考えれば、 while文の条件式は、 int i=0; while(a[i]) { i++; } なので、a[0]になるはずなので、 普通に考えれば 条件式の中身としては  配列a[0] が 配列a[0] になるまでi++をするとなるはずです。 しかしながら、このプログラムは、 初期値に「0」が入っている要素まで探し続けます。 なぜ、 「配列が添字の意味を失うのか?」 どなたか、この疑問にお答えしていただけますと幸いです。 「プログラムの内容」 配列aの各要素の内容を先頭から順に調べ、最初に0であった要素の添字番号を表示する。 「表示結果」 a[2]= 0 「ソースコード」 #include<stdio.h> int main() { int a[]={3,0,7,8,5,5,8}; int i=0; while(a[i]) { i++; } printf("a[%2d]=%2d \n",i,a[i]); }

  • C言語:配列の最大値

    こんにちは。 プログラミングの講義の課題で、 1.100未満の整数20個からなる配列を作成する 2.for文を使って20個の整数の中で最大値を求める 3.その結果を出力する というC言語の課題が出されました。完成はしたのですが、何度実行してもビルドエラーが発生して正常に作動しません。どうすれば正常に作動しますか? #include <stdio.h> int main(void){ int i; int max=0; int num[20] = {4,83,71,90,7,33,62,51,98,21,18,20,75,49,69,14,80,22,8,50}; for( i=0 ; i < 20 ; i++ ) { if (num[i] > max) max = num[i]; } printf("%d,",max); return (0); }

  • 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言語の配列について質問です。

    配列の添え字に別の配列を指定するような以下の処理について 質問です。 #include <stdio.h> int main(void) {    int k = 0;    int kn = 0;    char str[256];    char key[] = "ABCD";    kn = strlen(key);    for(k=0; k<kn-1; k++) {    str[key[k]] = kn-k-1;    } } 上記についてですが、for文の中で "str[key[k]]"とありますが、 ループ処理にともなって配列str[] の添え字は、str[A], str[B], str[C] となるのでしょうか?? その場合、結果的に配列str[]の各要素にはどのような値が格納され るのでしょうか? そもそも、配列の添え字に対して別の配列を指定した場合の動きが よくわかりません。 どなたか教えて頂けますか??

  • C言語プログラム 配列

    C言語プログラム初心者です。以下のプログラムに対して、実行結果がなぜそうなるかがわからないので、詳しく教えてください。 #include<stdio.h> int func(int a[ ],int b[ ],int n); main(){ int i,k; static int a[12] ={1,2,3,4,5,(省略)・・・,12};  static int b[12] ={21,22,23,24,(省略)・・・,32}; k = func(a,b,6); k = func(b+3,a+3,6); printf("a = "); for(i=0;i<12;i++)printf("%d",a[i]); printf("\n = b"); for(i=0;i<12;i++)printf("%d",b[i]); printf("\n k = %d\n",k); } int func(int a[ ],int b[ ],int n){ int i,x=0; for(i=0;i<n;i++);{ a[i] = b[i]; x = x+a[i]; } return(x); } 結果: a = 21 22 23 .... 26 7 8 9 10 11 12 b = 21 22 23 .... 26 7 8 9 30 31 32 k = 99

  • C言語課題!C言語初心者です。お願いします。

    課題内容 要素数10の(0~9の順)配列Aの値を2倍して配列Bに格納して  その後配列Aの値を配列Bに、配列Bの逆順を配列Aに格納し  入れ替える前と入れ替えた後の配列A,Bの値を表示するプログラム 書いてみたプログラム #include <stdio.h> int main(void) { int i; int va[10] = {0,1,2,3,4,5,6,7,8,9}; /* 初期化 */ int vb[10]; puts("入れ替え前"); puts("-----------"); for(i=0 , i<10 , i++){ printf("va[%d] = %d\n" , i , va[i]); /* 入れ替え前の配列A */ } for(i=0 , i<10 , i++){ vb[10] = 2*va[10]; } for(i=0 , i<10 , i++){ printf("vb[%d] = %d\n" , i ,vb[i]); /* 入れ替え前の配列B */ } puts("入れ替え後"); puts("-----------"); for(i=0 , i<10 , i++){ vb[10] = va[10]; } for(i=0 , i<10 , i++){ printf("vb[%d] = %d\n" , i ,vb[i]); /* 入れ替え後の配列B */ } for(i = 0 , i < 5 , i++){ /* 配列Bの逆順を配列Aに格納 */ int temp = va[i]; va[i] = vb[4-i]; vb[4-i] = temp; } for(i=0 , i<10 , i++){ printf("va[%d] = %d\n" , i ,va[i]); /* 入れ替え後の配列A */ } return(0); } コンパイルできません。 教えてください。お願いします。

  • C言語の2次配列

    4行5列の配列を用意し、その配列の要素をtij(i=1~4, j=1~5)とするとき、tij=i×j となるように配列に値を入れ、 それを表の形で画面に表示するプログラムを作りなさい。  という問題なんですが、自分は下の様に組みましたがうまく動きません。どこが悪いのか教えてください。よろしくお願いします。あまりC言語を理解していないので申し訳ないですが、なるべく簡単に教えて頂ければ幸いです。 #include<stdio.h> int main(void) { int i,j; int t[4][5]; for(i=0;i<=3;i++) { for(j=0;j<=4;j++) t=i*j; printf("%5d",t); printf("\n"); } return 0; }

  • C言語 配列を交えた関数

    C言語にて配列を絡めた関数を作っています 配列には後にそれぞれの値を与えるのですが double total(int n){ int i; double total = 0; int y[NUMBER] ={0}; for (i = 0 ; i < n ; i++) { tota = tota + (combination(n,i) * power(i) * y[n - i]);} return (tota); } combinationは順列nCi powerは-1^iを表してあり 別々に表示させた場合問題なく出力されます printf("%lf\n" , res + combination(1,0) * power(0) * y[1] + combination(1,1) \ * power(1) * y[0] のようにして実行した場合もただしくでます しかしこれだとtotalを出力させたとき0となり(関数内で配列を初期化させているため?)={0}を消すと出力時に恐ろしい桁の数になってしまいます この関数をうまく作動させるための改善案をご指導願えませんか?情報不足で判断できない場合補足にて追加させていただきます 当方C言語初心者のため詳しくお願いいたします

  • c言語 配列 返り値

    0~255の数を2進数に変換し、各8ビットずつに格納するというを作りたいのですが、 以下のような場合、reutrnで配列を返すにはどうしたらよいのですか? int bina(int r2,int g2,int b2){ int i; char binary[23]={0}; for(i=0;b2>0;i++){//2進数に変換する binary[i]=b2%2; b2=b2/2; } for(i=8;g2>0;i++){ binary[i]=g2%2; g2=g2/2; } for(i=16;r2>0;i++){ binary[i]=r2%2; r2=r2/2; } printf(" 2進数 = "); for(i=0;i<24;i++){ printf("%d", binary[23-i]); } printf("\n"); return binary[23]; } int main(void) { r=124,g=235,b=30 char sStr1[23]; sStr1[23]=bina(r,g,b); for(i=0;i<24;i++){ printf("%d"sStr1[i]); } return(0); }