• ベストアンサー

C言語の配列をPush(追加)するには

C言語の配列をPush(追加)するには タイトル通りなのですが、OPENCVにあるcvSeqPushのように 配列の末尾に新たな数値を追加する関数はあるのでしょうか?? できれば、簡単なサンプルコードもしくはそれが掲載されているページを紹介していただくと とても助かります。よろしくお願いします。

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

  • ベストアンサー
回答No.1

標準関数にはありません。 作るなら、新たに現在の配列のサイズに要素1つ分のサイズを増やしたメモリ領域を新たに獲得し、そこに既存の配列をコピーしてから一番最後の要素に新しい要素を追加するしかありません。 #include <stdio.h> #include <memory.h> #include <stdlib.h> void *array_push(void *ptr, int size, size_t unit_size, void *item) { void *adr = malloc(unit_size * (size + 1)); memcpy(adr, ptr, unit_size * size); memcpy((char *)adr + (unit_size * size), item, unit_size); return(adr); } int main(void) { char array_one[] = {'0', '1', '2', '3', '4'}; char *array_ptr = array_one; int array_size = sizeof(array_one) / sizeof(array_one[0]); char additem = '5'; printf("配列の%d番目の要素は 0x%X ですよ\n", array_size - 1, array_ptr[array_size - 1]); array_ptr = (char *)array_push(array_ptr, array_size, sizeof(array_ptr[0]), &additem); printf("新しい配列の%d番目の要素は 0x%X ですよ\n", array_size - 1, array_ptr[array_size - 1]); array_size++; printf("新しい配列の%d番目の要素は 0x%X ですよ\n", array_size - 1, array_ptr[array_size - 1]); free(array_ptr); getchar(); return(0); }

a0672113
質問者

お礼

ありがとうございます! とても参考になりました。

その他の回答 (2)

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.3

Cの配列は固定長なので、「新たな要素を増やす」ことは不可能です。 動的にやりたければmallocとreallocを駆使するしかありません。 なおC++では、これを隠蔽するSTLのvectorテンプレートクラスが存在します。

a0672113
質問者

お礼

やはりできないんですね。 ありがとうございました。

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.2

ありません。あきらめましょう。 C言語の配列はその定義時に要素数(正確には配列が必要とするバイト数)が固定されてしまい、その要素数を後から変更することはできません。 cvSeqPushで末尾に新たな値を追加できるのは、その関数が扱う構造体CvSeqが要素の追加・削除を行える構造になっていて、関数内でいろいろと処理をやっているからです。 # opencvは知りませんでしたが、リファレンス(参考URL)を斜め読みしたところどうやら双方向リストを使用しているようです。 つまり、ただの配列に対して末尾追加を行っているわけではありません。

参考URL:
http://opencv.jp/opencv-1.0.0/document/opencvref_cxcore_sequences.html
a0672113
質問者

お礼

なるほど、何やらややこしいですね。 お返事ありがとうございました。

関連するQ&A

  • C言語の配列にPushするには

    Perlのpushのように あるループ内の配列にたいして任意の文字列を配列の末尾に入れることは可能なのでしょうか。 ヒープやを使えば文字列がどんな長さでも対応できるということまでは理解できたのですが どのようなソースの書き方をすれば良いのか判りません。 出来ましたら簡単なサンプルソースを教えいただけませんでしょうか。

  • array_push関数について

    array_push関数を使って配列に追加していくことはできるのですが、多次元配列に追加する方法がわかりません。 WEBマニュアルを見ても詳しく書かれておらず困っています。 array_push関数で多次元配列に追加していくことはできるのでしょうか? できるのであれば簡単な書式をご伝授ください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • C言語Char型配列に小数値を入れる方法

    C言語Char型配列に小数値を入れる方法について質問なんですが、 分からなく質問させていただきました。 (例)23.8を float f = 23.8 char c[100]; cの配列の中に23.8を入れる c[0] = '2' c[1] = '3' c[2] = '.' c[4] = '8' c[5] = '\0' 上記みたいに入ってほしいんですが、そういうC言語の関数ありますか? itoaやsprintfを使わないでお願いします。

  • C言語で巨大配列を作るにはどうすれば良いのでしょうか?

    C言語で巨大配列を作るにはどうすれば良いのでしょうか? テストで作ってみた配列を用いたプログラムが動かなかったので(コンパイルは正常)、なんでだろうと思って調べてみると、巨大な配列はcalloc関数等を用いて作る必要があると知りました。 しかし正直解説サイトを見てもよく意味が分かりませんでした…。 例えばA[1000][1000][1000]の様な配列は、どの様に作ればいいのでしょうか? A[x][y][z]みたいに表現して、Aを変えて同じ様な配列を8個ほど作りたいです。 初心者なので勉強不足かも知れませんが、どうぞ宜しくお願い致します。

  • arayy_pushの挙動は?

    arayy_pushの挙動は? file関数で読み込んだカンマ区切りのデータ(改行コードはLF)をlist(data1,data2,data3)として、data3には改行コードが含まれたまま、全てのデータ(data1,data2,data3)の最後にaray_push関数で末尾にデータを追加(data4とする)した場合には、data3とdata4の改行コードはどうなるのでしょうか? array_pushのマニュアルには何も書いてなく、自動的にdata4には改行コードが付加されるか確認する方法がわかりません。 アドバイスをお願いします。

    • ベストアンサー
    • PHP
  • C言語でプログラムを書いています。

    C言語でプログラムを書いています。 その中で、サンプルデータの入ったファイルを読み込み、 その中身を配列を用いて行列として整理したいのですが、どのような命令が必要でしょうか。 ファイルの中身は、以下のようになっています。 1:0.111 2:0.222.....600:0.999 ・ ・ ・ 1:0.122 2:0.233.....600:0.998 「数字:」の部分は使用しないため、実際はコロン以下の数値で組みたいと考えています 詳しいサイトの紹介でもかまいませんので、よろしくお願いします

  • 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言語で使うことの出来る配列のLIB

    C言語から使うことの出来るSTLのコンテナクラスのようなものはありますでしょうか? 配列の追加、削除、検索、更新を高速で処理したいので(LIST構造)、汎用的に使えるLIBのようなものがあれば教えていただきたいです。

  • C言語のプログラミングの関数と配列を用いてそんなに

    C言語のプログラミングの関数と配列を用いてそんなに難しくないプログラムを考えているのですが、何かいいプログラムはないでしょうか?簡単なゲームや、簡単な貯金計算など種類は問いません。 そこまで難しくない何かいいプログラムを教えてください。

  • C言語について。

    C言語プログラマとしては、スタートアップコードは・・・ ・自分が書いたプログラムを、直接動かすために必要なライブラリ ・それはコンパイル後、リンカによって追加されるライブラリこれは、 どういう意味でしょうか?分かりやすく教えていただけると幸いです。すみません。で、 以下のかぶくんまんさんの回答です。 https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11247611941 で、 C言語におけるプログラミングとは「main関数を書くこと」に他ならない。なぜ「main関数を書く」ことがC言語におけるプログラミングに他ならないのかと言えば、それは偏に「C言語のコンパイラはmain関数を呼び出すプログラムを生成するから」です。それがmain関数を求めるので結果的にmain関数がリンクされ、そしてmain関数が求めるままに他の関数もリンクされていくわけです。 で、その「main関数を呼び出すプログラム」こそが、C言語における「スタートアップコード」。 という回答で、main関数以降は、プログラマが書くのですよね?プログラマが関数をリンクさせる様なプログラムを書くということでしょうか?教えていただけると幸いです。すみません。 という所が分かりません。教えていただけると幸いです。すみません。以下のURL https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12247932542

専門家に質問してみよう