ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

質問者:otaking 配列とポインタの使い方
困り度:
  • 困っています
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です。
よろしくお願いします。
質問投稿日時:08/04/18 14:03
質問番号:3957023
この質問に対する回答は締め切られました。
最新から表示回答順に表示良回答のみ表示

回答

 

回答者:yama5140 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)

★一つも出ません。

☆質問者様が「したい」ことに、実行結果がなるかは別として。
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:08/04/18 18:20
回答番号:No.5
この回答へのお礼ご回答、ありがとうございます。
constを外すとROM領域にデータが展開されないので外せません。
でも#2さんのやり方(ポインタを使わず、配列で渡す)でエラーは出なくなりましたので、これでやってみます。
ワーニングが気になりますが・・・。
ありがとうございました。

回答

 

回答者:yama5140 >はい、同じように書いてます。

★えっ、違いますよ。
------------------------------------
★ご質問文中程の関数の実体↓

void copy_data(*int_p,*chr_p) ←◆コンパイラが目をまわしそう
void copy_data(int *int_p,char *chr_p)

★プロトタイプ宣言↑
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:08/04/18 16:57
回答番号:No.4
この回答への補足ありがとうございます。
>同じように書いてます。
というのは自分の質問文のことではなく、
「前の回答の方々のご指摘があった通りに訂正している」
という意味です。
まぎらわしい書き方してすいません。
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

良回答10pt

回答者:asuncion > 配列の形に変更してみましたが
> void copy_data(const int int_src[], const char chr_src[])

関数の実体もプロトタイプ宣言も同じように書いていますね?
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:08/04/18 15:47
回答番号:No.3
この回答への補足ありがとうございます。
はい、同じように書いてます。
この回答へのお礼アドバイス、ありがとうございました。
この訂正でエラーは出なくなっていたようです。
ワーニングだけ出てますが。

回答

良回答20pt

回答者:AsanoNagi まず、すでに回答のある部分のほか、ポインタの使い方がおかしいです。

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];
}

こういうの。
種類:回答
どんな人:一般人
自信:参考意見
回答日時:08/04/18 14:43
回答番号:No.2
この回答への補足回答ありがとうございます。
配列の形に変更してみましたが、やはり関数の 呼び出し側 に質問文と同じエラーが出ます。
何が原因なんでしょうか・・・。
この回答へのお礼ありがとうございます。
申し訳ないです、AsanoNagiさんのやり方に変えてみたところ、ワーニングの方だけになっていました。(エラーは出なくなっています)
ワーニングが沢山出てるのでエラーが無くなってるのに気付かなかったです。ごめんなさい。
みなさんにご迷惑をおかけして申し訳なかったです。

とりあえずワーニングは出ますが、実行ファイルは出来上がっているようなのでこれで動くと思います。
ありがとうございました。

回答

 

回答者:asuncion > // ROMデータをRAMに転送する関数
> void copy_data(*int_p,*chr_p)

void copy_data(int *int_p, char *chr_p)

という風に、何型へのポインタであるかを明記してみると、
どうなりますか?
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:08/04/18 14:15
回答番号:No.1
この回答への補足回答ありがとうございます。
型を入れても同じ結果でした。
関数側ではなく呼び出し側にエラーが出てるのでどうしたものか・・・。
今は関数を使わずにそこに直接転送する処理を入れてますが、マイコンなので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削減のためにも何とか関数にしたいと思っています。
この回答へのお礼アドバイス、ありがとうございました。
最新から表示回答順に表示良回答のみ表示