- ベストアンサー
配列とポインタの使い方
ROM領域にあるたくさんのデータの一部をRAMにコピーしたいのですが、うまくいきません。 どこがおかしいのか教えていただけないでしょうか? (例:int型の10個のデータとchar型の5個のデータをRAMへコピーする) // ROM領域に置いたテーブル const int int_table1[10]={1,2,3,4,5,6,7,8,9,0}; const char chr_table1[5]={1,2,3,4,5}; const int int_table2[10]={11,22,33,44,55,66,77,88,99,100}; const char chr_table2[5]={11,22,33,44,55}; // RAM領域 int int_data[10]; char chr_data[5]; // プロトタイプ宣言 void copy_data(int *int_p,char *chr_p); //メイン処理 | copy_data(int_table1,chr_table1); // テーブル1をRAMへコピー | | copy_data(int_table2,chr_table2); // テーブル2をRAMへコピー | // ROMデータをRAMに転送する関数 void copy_data(*int_p,*chr_p) { char i; for (i=0;i<10;i++) { int_data[i]=int_p; int_p++; } for (i=0;i<5;i++) { chr_data[i]=chr_p; chr_p++; } } コンパイルすると [Warning(ccom)] assignment from const pointer to non-const pointer ===> copy_data(int_table1,chr_table1); // テーブル1をRAMへコピー [Error(ccom)] mismatch prototyped parameter type ===> copy_data(int_table1,chr_table1); // テーブル1をRAMへコピー のワーニング&エラーになります。 どのようにしたらワーニング、エラーを直せますか? または「こうすればできる」という回答でもOKです。 よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
まず、すでに回答のある部分のほか、ポインタの使い方がおかしいです。 chr_data[i]=chr_p; は、おそらく、正しい動作をしないでしょう。 書くなら、 char_data[i] = *char_p; です。 というより、関数の引数として配列は使えるので、配列の形で処理するのも手なのですが。 void copy_data(const int int_src[], const char chr_src[]) { char i; for (i=0;i<10;i++) { int_data[i]=int_src[i]; chr_data[i]=chr_src[i]; } こういうの。
その他の回答 (4)
- yama5140
- ベストアンサー率54% (136/250)
No.4 です。 >まぎらわしい書き方してすいません。 いえ、こちらこそ。 あの部分を指摘すれば、お気づきになるのでは、と・・。 (年寄りは思い込みが強くて・・、申し訳ない) >どのようにしたらワーニング、エラーを直せますか? ・No.4 で「←◆コンパイラが目をまわしそう」とした箇所を 「プロトタイプ宣言」と同じにする。 ・冒頭の const を全て取る(グローバル)。 ・No.2 さんが指摘した int_data[i] = int_p; → = *int_p; chr_data[i] = chr_p; → = *chr_p; この3点を直すと、少なくとも私の環境では「警告・エラー」は、 (Borland C++ 5.5.1) ★一つも出ません。 ☆質問者様が「したい」ことに、実行結果がなるかは別として。
お礼
ご回答、ありがとうございます。 constを外すとROM領域にデータが展開されないので外せません。 でも#2さんのやり方(ポインタを使わず、配列で渡す)でエラーは出なくなりましたので、これでやってみます。 ワーニングが気になりますが・・・。 ありがとうございました。
- yama5140
- ベストアンサー率54% (136/250)
>はい、同じように書いてます。 ★えっ、違いますよ。 ------------------------------------ ★ご質問文中程の関数の実体↓ void copy_data(*int_p,*chr_p) ←◆コンパイラが目をまわしそう void copy_data(int *int_p,char *chr_p) ★プロトタイプ宣言↑
補足
ありがとうございます。 >同じように書いてます。 というのは自分の質問文のことではなく、 「前の回答の方々のご指摘があった通りに訂正している」 という意味です。 まぎらわしい書き方してすいません。
- asuncion
- ベストアンサー率33% (2127/6289)
> 配列の形に変更してみましたが > void copy_data(const int int_src[], const char chr_src[]) 関数の実体もプロトタイプ宣言も同じように書いていますね?
お礼
アドバイス、ありがとうございました。 この訂正でエラーは出なくなっていたようです。 ワーニングだけ出てますが。
補足
ありがとうございます。 はい、同じように書いてます。
- asuncion
- ベストアンサー率33% (2127/6289)
> // ROMデータをRAMに転送する関数 > void copy_data(*int_p,*chr_p) void copy_data(int *int_p, char *chr_p) という風に、何型へのポインタであるかを明記してみると、 どうなりますか?
お礼
アドバイス、ありがとうございました。
補足
回答ありがとうございます。 型を入れても同じ結果でした。 関数側ではなく呼び出し側にエラーが出てるのでどうしたものか・・・。 今は関数を使わずにそこに直接転送する処理を入れてますが、マイコンなのでROMが少ないんです。 for(i=0;i<10;i++)int_data[i]=int_table1[i]; for(i=0;i<5;i++)cha_data[i]=chr_table1[i]; 毎回転送するところにコレを入れてます。 ROM削減のためにも何とか関数にしたいと思っています。
お礼
ありがとうございます。 申し訳ないです、AsanoNagiさんのやり方に変えてみたところ、ワーニングの方だけになっていました。(エラーは出なくなっています) ワーニングが沢山出てるのでエラーが無くなってるのに気付かなかったです。ごめんなさい。 みなさんにご迷惑をおかけして申し訳なかったです。 とりあえずワーニングは出ますが、実行ファイルは出来上がっているようなのでこれで動くと思います。 ありがとうございました。
補足
回答ありがとうございます。 配列の形に変更してみましたが、やはり関数の 呼び出し側 に質問文と同じエラーが出ます。 何が原因なんでしょうか・・・。