【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は謹んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.19342

関数の引数にポインタを
投稿者---T(2005/01/19 18:39:36)


教えて頂きたい事すら上手く伝えられるか自信がありませんが
どなたかわかる方、教えて下さい。

【やりたい事】
test()関数内にあるテーブルのデータをコール元(main()関数)で
定義してある配列にコピーしたいのです。(伝わったでしょうか??)

そのために▲でしめした箇所に、なんのポインタ演算子(* or &)
を何個記述すればいいのか?教えて下さい。
当方、かれこれ1時間も格闘しています。。。。
宜しくお願い致します。



void main(void)
{
uchar i; /* ループ用 */
uchar RS_sbuf[10]; /* 送信バッファ */
uchar ▲▲p /* ポインタポインタ */


test(▲▲p); /* コール */

for(i=0 ; i<2; i++){
RS_sbuf[i] = ▲(p + i); /* 送信バッファにデータ格納 */
}
}



void test(uchar ▲buf)
{
uchar tbl[2][2] = /* データ格納テーブル */
{{0x00,0x01},{0x02,0x03}};


▲buf = &tbl[0][1]; /* 任意のテーブルのアドレスを格納 */
return;
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:関数の引数にポインタを 19343 あかま 2005/01/19 18:56:18
<子記事> Re:関数の引数にポインタを 19344 nop 2005/01/19 19:03:40


No.19343

Re:関数の引数にポインタを
投稿者---あかま(2005/01/19 18:56:18)


ローカル変数は関数から帰ってきたときに破棄されますので、そのポインタを使用してはいけません。
RS_sbufにデータを入れたいならこんな感じかと。
void main(void)
{
    uchar RS_sbuf[10]; /* 送信バッファ */
    test(RS_sbuf); /* コール */
    
}

void test(uchar *buf)
{
    uchar i; /* ループ用 */
    uchar tbl[2][2] = /* データ格納テーブル */
        {{0x00,0x01},{0x02,0x03}};
    
    for(i=0 ; i < 2; i++){
        buf[i] = tbl[i][0]; /* 送信バッファにデータ格納 */
    }
    return;
}



この投稿にコメントする

削除パスワード

No.19345

Re:関数の引数にポインタを
投稿者---T(2005/01/19 19:12:50)


>ローカル変数は関数から帰ってきたときに破棄されますので、そのポインタを使用してはいけません。

なるほどどうりで変な値が入ってると思いました
あかま様、御回答及び参考プログラム有難う御座います。
ですが・・実仕様では、test()は多方面からコールされ、
また以下のようになっているため大人しく、外部に定義します。
気づかないでずっと悩んでる所でした。有難う御座いました。


void test(uchar sel, uchar *buf)
{
    uchar i; /* ループ用 */
    uchar tbl[2][2] = /* データ格納テーブル */
        {{0x00,0x01},{0x02,0x03}};
    
    switch(sel){
     case 0x01:
    ▲buf = &tbl[0][1];
         break;

     case 0x02:
    ▲buf = &tbl[1][0];
         break;
    }
    return;
}




この投稿にコメントする

削除パスワード

No.19344

Re:関数の引数にポインタを
投稿者---nop(2005/01/19 19:03:40)


>【やりたい事】
>test()関数内にあるテーブルのデータをコール元(main()関数)で
>定義してある配列にコピーしたいのです。(伝わったでしょうか??)
>
>そのために▲でしめした箇所に、なんのポインタ演算子(* or &)
>を何個記述すればいいのか?教えて下さい。

「▲」の箇所に何を入れても駄目でしょう。


> uchar tbl[2][2] = /* データ格納テーブル */
> ▲buf = &tbl[0][1]; /* 任意のテーブルのアドレスを格納 */

ローカル変数ポインタを呼び元に渡しても、
関数から return した時点で無効なポインタとなります。


>test()関数内にあるテーブルのデータをコール元(main()関数)で
>定義してある配列にコピーしたいのです。(伝わったでしょうか??)

これを行うなら、main() で test() をコール際に、
コピー先配列の先頭ポインタを渡し、
test() 関数内で、内部のテーブルから、
引数で渡されたポインタの領域へコピーすべきでしょう。

とりあえず、各変数の寿命と、
ポインタが指すオブジェクトが何か?
を頭に入れて再度、考え直される方がよいかと思います。



この投稿にコメントする

削除パスワード

No.19346

Re:関数の引数にポインタを
投稿者---T(2005/01/19 19:20:23)


>>これを行うなら、main() で test() をコール際に、
>コピー先配列の先頭ポインタを渡し、
>test() 関数内で、内部のテーブルから、
>引数で渡されたポインタの領域へコピーすべきでしょう。
>とりあえず、各変数の寿命と、
>ポインタが指すオブジェクトが何か?
>を頭に入れて再度、考え直される方がよいかと思います。


入れ違いになったようです。すみません
初心にもどってポインタとは?から考え直す必要があるみたいです。
nop様、有難う御座います。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧