• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:構造体や配列へのポインタについての質問です)

構造体や配列へのポインタについての質問です

このQ&Aのポイント
  • 構造体や配列へのポインタについての質問です。他の関数で処理する方法について不安があります。
  • typedef struct _abcで定義した構造体や配列へのポインターを他の関数でどのように処理すればよいか分かりません。
  • 質問に示された例では、構造体と配列のポインタを別の関数に渡す方法が示されていますが、自信がありません。

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

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

void finc_to( char ** x, abc * pqr ) { *x = pqr->name; *( x + 1 ) = ( char * )&( *pqr ).value; } は void finc_to( char *x[], abc * pqr ) { x[0] = pqr->name; x[1] = ( char * )( pqr->value ); } の方が判りやすいが、何をしたいのだろう?

micchicchi
質問者

お礼

chie65535さんの例を参考にさせていただきます! ありがとうございました!

その他の回答 (4)

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.5

>ポインタの配列(この場合y)を用意して、 >その配列yを、ある関数に投げると特定の処理をしてくれる func_to/func_fromの関係がいまいち把握できないのですが;; ・func_form関数はfunc_to関数の呼び出し元の関数である. ・ポインタ配列はfunc_from関数のローカル変数で定義し、  func_to関数で設定する ・ポインタ配列に対して値を設定する func_to関数と  その関数で設定したポインタ配列に対する処理を行う  func_otherがありfunc_fromから呼び出される? ・func_toという関数を用意しているが、  そのほかの関数からも設定したい? であってますか??(間違ってたら読み飛ばして指摘して下さい。) # 引数の異なる関数を引数にポインタ配列を受け取る事で # 同じ呼び出しの様にしたいという感じ? わたしが「呼び出された関数側が知っておく必要がある」 と書いたのは、最後の「func_other関数側」です。 補足の内容から察するに、 何かの処理をするために必要なデータは すべて配列のポインタで格納されているはずです。 この場合だと、処理用の関数は配列の何番目に どんな値をさすポインタが入っているのかを考慮して処理を 書く必要がありますがこれなら始めからポインタ配列に入れる前の データを処理用の関数の引数に取ったほうがよっぽどマシですよね? フラグを導入してそれらを集約した関数を作るのも一つの手では あるかもしれませんが。 あえて、ポインタ配列という引数にこだわるのは、 汎用性を高めるためとか、関数ポインタを登録して使うとか いろいろ考えられますが、今回はそういう気配がなかったので、 一応指摘しました。 #最初の認識が間違ってるとどうしようもないのですが。。。 > 最初、配列自体をfunc_toに投げたんですが、 > 変数のスコープの問題だと思うのですが、上手くいかず これについては該当のコードを見ればもう少し 細かく答えることができるかもしれませんが。。。

micchicchi
質問者

補足

お晩ですm(__)m aris-wizさん、 丁寧にレスしていただいて、ありがとうございます! >・func_form関数はfunc_to関数の呼び出し元の関数である. >・ポインタ配列はfunc_from関数のローカル変数で定義し、 > func_to関数で設定する >・ポインタ配列に対して値を設定する func_to関数と > その関数で設定したポインタ配列に対する処理を行う > func_otherがありfunc_fromから呼び出される? >・func_toという関数を用意しているが、 > そのほかの関数からも設定したい? すごい!完璧です! そうなんです。 func_toを独立した関数にしないと、 その部分のコードが長ったらしくて、 いちいちその度に書くのもあれなんで、 いわゆるライブラリー関数みたいにしたかったんです。 で、そうですね、ちょっと反省は、 具体的に書かないと、教えてくださる方もちんぷんかんすね^^; ですので、ちょっと、詳しめにコード書いてみます~ ただ、ちょっと「ある制約」があるため具体的に書けない点、 ご理解くださいませm(__)m ちなみに、func_otherは、 データベースにデータを追加する関数です~ すごい説明遅れてますが… ですので、func_otherは、処理するテーブルの構造を通して、 aris-wizさんご指摘の 「呼び出された関数側が知っておく必要がある」を クリアーしているのだと思います。 <詳しいコード例> func_otherをdb_insertとします。 plus グローバル変数使えないような仕様だと思ってください。 typedef struct _users{ int32 id; char name[60+1]; int32 members_id; char members_name[40+1]; char rep_name[20+1]; char tel[16+1]; } users; extern void set_pointers( char ** field_ptrs, users * recorder ) { // field_ptrs には、 // 読取用構造体の各項目別アドレスを格納する ( char * ) 型配列へのポインタが設定されます。 // recorder には、 // 使用するテーブルに対応した読取用 field 定義構造体へのポインタが設定されます。 // ポインタ配列( field_ptrs )に、読込用構造体( recorder )の各項目別アドレスを格納する。 *field_ptrs = ( char * )&( *recorder ).id; *( field_ptrs + 1 ) = recorder->name; *( field_ptrs + 2 ) = ( char * )&( *recorder ).members_id; *( field_ptrs + 3 ) = recorder->members_name; *( field_ptrs + 4 ) = recorder->rep_name; *( field_ptrs + 5 ) = recorder->tel; return; } static void insert_data( app * po ) { char * field_ptrs[6];// データ追加に使用するポインタ配列 users recorder;// レコードデータ格納領域 // db 接続 connect_database( po ); // テーブルオープン po->table_ptr = open_table( po->db_ptr, table_name ); //ポインタ配列( field_ptrs )に、読込用構造体( recorder )の各項目別アドレスを格納する set_pointers( field_ptrs, &recorder ); // recorder を NULL で初期化する MEMSET( &recorder, 0x00, sizeof( users ) ); // 読込用構造体に、追加するレコードデータをセットする set_inserted_data( po, &recorder, 256, "(株)タコ介", 11, "ご素人協会", "日本太郎", "03-3333-3333", ); // レコードを追加 db_insert( po->db_ptr, po->table_ptr, field_ptrs ); // db 閉じる c_close_table_and_database( po ); return; } 以上です。 で、set_pointers側の、 目の覚めるような美しいコーディングを ぜひぜひ見させて下さいませm(__)m 私の、ごり押し、コテコテ、超初級!な感じですので… ちなみにchie65535さんの回答大変参考になっています。

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.4

> ある関数で定義した構造体や配列へのポインターを、 > 他の関数で処理する方法ですが、 > 以下のやり方であっているでしょうか? 聞きたいのはC言語の構文に対しての質問でしょうか? であれば、動作は兎も角として構文は間違ってはいません。 聞きたいのが動作についてであれば、 あっているかどうかは、あなたの作りたいものに 沿っているかどうかだと思いますが、 提示されているコードを見た感じでは意味がない。 今回の場合だと、関数の中では呼び出しもとから与えられた 構造体の中身や配列が何個使われていて、どのオフセットに 何が入っているのかを呼び出された関数側が知っておく必要が あるので、構造を考慮して書くより、構造体のポインタや 配列をそのまま渡したほうが遥かに簡単に思える。

micchicchi
質問者

補足

勝手にaris-wizさんにコメント付けますが、 いろいろ皆様から、 何が聞きたいかさっぱりわからない!と 厳しいご指摘を受けましたので、 私の説明不足の部分、補足させていただきますm(__)m ちなみにCレベル超初級かも知れません… 以下補足説明 ある関数(この場合func_from)内で、 ポインタの配列(この場合y)を用意して、 その配列yを、ある関数(ここには書いてありません)に投げると 特定の処理をしてくれるというプログラムを考えて下さい。 で、その配列yに、 データが格納されているポインタを 配列の数だけセットしていくのですが、 そのロジック部分を、外の関数(この場合func_to)で書く場合の 書き方が知りたかったのです。 最初、配列自体をfunc_toに投げたんですが、 変数のスコープの問題だと思うのですが、上手くいかず、 こういう場合、ポインタを投げるのかなーと 素人考えで考えて作ったのが、例題のコードです。 しかし、 *( x + 1 ) = ( char * )&( *pqr ).value; のような、あまりに美しくないコテコテのコードって、 なんか基本的に違うんじゃないかと思い質問しました! ですので、質問は、 1.私のやり方の方向性という条件なら もっといいコードの書き方があったら教えてください! chie65535様のような感じの回答です。 2.あるいは、根本的に変えて、こうするべきという示唆 aris-wiz様のご指摘のように、 この関数、呼び出された関数側が知っておく必要がある というのが気になってます… で、質問の前提が、 私にとってポインタの配列のポインタを渡すような 関数を書くのが初体験だったからです@@; ということで、 よろしくご教授の程お願い致します。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

「あっているかどうか」というのは ・仕様上やっていいのか ・期待する動作に即しているのか という側面があります. 仕様上はできるけど, #1 にもいわれるように「そもそもなんでこんなことをしたいのか」がまったく読み取れないので後者の側面については判断できない. けど, こんなキャストをして「自信がない」というときは, 大体「他にもっといい方法がある」と思った方がいいような気がするなぁ.

  • Yanch
  • ベストアンサー率50% (114/225)
回答No.1

この処理が、どのような動作を期待しているのか。 読み取れませんよ。 どのような動作を期待しているのか、補足を書いた方がよいでしょう。

関連するQ&A