![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
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です。
よろしくお願いします。
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_04.png?e8efa67)
No.2ベストアンサー
- 回答日時:
まず、すでに回答のある部分のほか、ポインタの使い方がおかしいです。
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];
}
こういうの。
この回答への補足
回答ありがとうございます。
配列の形に変更してみましたが、やはり関数の 呼び出し側 に質問文と同じエラーが出ます。
何が原因なんでしょうか・・・。
ありがとうございます。
申し訳ないです、AsanoNagiさんのやり方に変えてみたところ、ワーニングの方だけになっていました。(エラーは出なくなっています)
ワーニングが沢山出てるのでエラーが無くなってるのに気付かなかったです。ごめんなさい。
みなさんにご迷惑をおかけして申し訳なかったです。
とりあえずワーニングは出ますが、実行ファイルは出来上がっているようなのでこれで動くと思います。
ありがとうございました。
No.5
- 回答日時:
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さんのやり方(ポインタを使わず、配列で渡す)でエラーは出なくなりましたので、これでやってみます。
ワーニングが気になりますが・・・。
ありがとうございました。
No.4
- 回答日時:
>はい、同じように書いてます。
★えっ、違いますよ。
------------------------------------
★ご質問文中程の関数の実体↓
void copy_data(*int_p,*chr_p) ←◆コンパイラが目をまわしそう
void copy_data(int *int_p,char *chr_p)
★プロトタイプ宣言↑
この回答への補足
ありがとうございます。
>同じように書いてます。
というのは自分の質問文のことではなく、
「前の回答の方々のご指摘があった通りに訂正している」
という意味です。
まぎらわしい書き方してすいません。
No.1
- 回答日時:
> // 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削減のためにも何とか関数にしたいと思っています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
char* を渡したとき、不適切なP...
-
C言語のfor文です。 繰り返しの...
-
絶対パスからのファイル名の切...
-
干支のプログラム
-
配列をnビットシフトする
-
charでの計算?
-
文字列からバイナリ変換
-
fgetsなどのときのstdinのバッ...
-
CStringをwchar_tに変換したい
-
3桁区切(コンマ)記号をつけ...
-
ftoa の作り方
-
'const char *' 型は 'char *' ...
-
ソースコードエラー
-
間接操作のレベルとは
-
C++で16進数の文字コードから文...
-
C言語のポインターで詰まっている
-
C言語の入力した文字を反転させ...
-
charからLPTSTRへの変換方法
-
テキストデータをそのままバイ...
-
2÷3などの余りについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
CStringをwchar_tに変換したい
-
charでの計算?
-
文字列から空白を取り除きたい...
-
charからLPTSTRへの変換方法
-
'const char *' 型は 'char *' ...
-
テキストデータをそのままバイ...
-
配列をnビットシフトする
-
半角カナ→16進
-
double型の値をchar配列に変換...
-
sprintfに同じ変数は使えるか
-
ファイル名である文字列からbas...
-
ネットワークにつながっている...
-
ftoa の作り方
-
間接操作のレベルとは
-
型変換
-
C言語です
-
C言語のfor文です。 繰り返しの...
-
Win32APIでのエディットボック...
-
【C言語】文字型と整数型の違い
おすすめ情報