海外旅行から帰ってきたら、まず何を食べる?

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です。
よろしくお願いします。

A 回答 (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];
}

こういうの。

この回答への補足

回答ありがとうございます。
配列の形に変更してみましたが、やはり関数の 呼び出し側 に質問文と同じエラーが出ます。
何が原因なんでしょうか・・・。

補足日時:2008/04/18 14:58
    • good
    • 0
この回答へのお礼

ありがとうございます。
申し訳ないです、AsanoNagiさんのやり方に変えてみたところ、ワーニングの方だけになっていました。(エラーは出なくなっています)
ワーニングが沢山出てるのでエラーが無くなってるのに気付かなかったです。ごめんなさい。
みなさんにご迷惑をおかけして申し訳なかったです。

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

お礼日時:2008/04/18 19:27

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)

★一つも出ません。

☆質問者様が「したい」ことに、実行結果がなるかは別として。
    • good
    • 0
この回答へのお礼

ご回答、ありがとうございます。
constを外すとROM領域にデータが展開されないので外せません。
でも#2さんのやり方(ポインタを使わず、配列で渡す)でエラーは出なくなりましたので、これでやってみます。
ワーニングが気になりますが・・・。
ありがとうございました。

お礼日時:2008/04/18 19:31

>はい、同じように書いてます。



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

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

★プロトタイプ宣言↑

この回答への補足

ありがとうございます。
>同じように書いてます。
というのは自分の質問文のことではなく、
「前の回答の方々のご指摘があった通りに訂正している」
という意味です。
まぎらわしい書き方してすいません。

補足日時:2008/04/18 17:23
    • good
    • 0

> 配列の形に変更してみましたが


> void copy_data(const int int_src[], const char chr_src[])

関数の実体もプロトタイプ宣言も同じように書いていますね?

この回答への補足

ありがとうございます。
はい、同じように書いてます。

補足日時:2008/04/18 16:24
    • good
    • 0
この回答へのお礼

アドバイス、ありがとうございました。
この訂正でエラーは出なくなっていたようです。
ワーニングだけ出てますが。

お礼日時:2008/04/18 19:36

> // 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削減のためにも何とか関数にしたいと思っています。

補足日時:2008/04/18 14:40
    • good
    • 0
この回答へのお礼

アドバイス、ありがとうございました。

お礼日時:2008/04/18 19:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報