ポインタの配列でエラーが出てしまいます。
私は今PICというマイコン(ロボットコンテストなどで用いられるロボットの頭脳となるもの)のプログラミングをしています。ポインタの配列を使って液晶表示器に文字列を表示させるプログラムを作っているのですが、エラーが出てしまいます。
このようなプログラムです。
・・・・
static const char *r_max[7] ={"err","750","7500","75k","750k","9.2M","20M"};
・・・・・
Lcd_Custom_Out(1,1,err_ms[1]);
・・・・
ただし、Lcd_Custom_outはあらかじめ用意されている関数で、定義は次のようになっています。
void Lcd_Custom_Out(char row, char col, char *text);
LCDとは2行16文字からなる液晶表示器で、rowで表示する行、colで左から何番目に表示するかを指定します。
そして、これが含まれたソースコードをコンパイルすると、Lcd_Custom_Outの行で、
illegal pointer conversion [?T53] to [text]
というエラーが返されてしまいます。
[?T53]という部分が理解できないのですが・・・
私はC言語はそこまで得意ではないので、何がいけないのか非常に困っています。
使用したコンパイラ「mikroC 8.2」で、ANSIに準拠しております。
大変困っております。どなたかご教授お願いいたします。
No.6ベストアンサー
- 回答日時:
err_msがr_max書き間違えという前提で...
使ったことのないコンパイラですが、恐らく#5の方の回答の通りだと思います。
そこで、
static const char *r_max[7] = ...
を
static char * const r_max[7] = ...
に変えては如何でしょうか?
ポインタは静的領域に配置されて更新可能になってしまいますが、
各文字列自体はROM上に配置され、Lcd_Custom_Outの呼び出しもエラーにならないと思います。
(コンパイラとリンカの仕様次第ですが、恐らく)
ご回答ありがとうございます!私にはそこをそう変えてなぜポインタが静的領域に配置されるのか分かりませんが、試してみます。アドバイスありがとうございます。
No.7
- 回答日時:
>static const char *r_max[7] ={"err","750","7500","75k","750k","9.2M","20M"};
ここを、
static char r_max[7][5] ={"err","750","7500","75k","750k","9.2M","20M"};
とすれば、おそらくエラーは出なくなると思います。
ただ、問題はvoid Lcd_Custom_Out(char row, char col, char *text)の仕様ですね。
textが示す内容を書き換えるのか、書き換えないのか、書き換えるとすればどんな条件で書き換えるのか、といったことを確認する必要があるでしょう。
それらが確認できないのなら、
>static const char *r_max[7] ={"err","750","7500","75k","750k","9.2M","20M"};
ここはこのままで、
>Lcd_Custom_Out(1,1,r_max[1]);
ここを、
char buf[5];
strcpy(buf,r_max[1]);
Lcd_Custom_Out(1,1,buf);
などとする必要があると思います。
回答ありがとうございます。定義がそうなっていますがtextが書き換えられるということは無いと思います・・・なんでこんな仕様なのか私には分かりません。おっしゃるとおりバッファを使ってやってみようとおもいます。
No.5
- 回答日時:
文字列配列 r_maxの型が const char * なのに、関数の引数の型が char * なのでエラーになってるようですね。
constの有無もコンパイラによって解釈が違うので、VC++だとwarningが出るだけですが、このコンパイラではエラーになってるのでしょう。(マイコンソフト等でstatic宣言されたconst変数がROM領域に割り当てられたりする場合は、このエラーチェックは特に重要です)この場合、関数の中でポインタの先が書き換えられるのかどうかが問題となります。書き換えられないのなら関数宣言で引数の型をconst char *としておいてくれたほうが親切です。
書き換えられることが無いのなら(char *)でキャストすれば済む話ですが、書き換えられるなら書き換えられても良い領域に文字列をコピーして渡す必要があります。
回答ありがとうございます。constを完全に見落としていました。解決しました!ありがとうございます。
マイコンだとこの判定は重要なんですね。初めて知りました。
試してみましたが呼び出しているLcd_Outという関数によって渡したポインタが書き換えられるということはないみたいです・・・
キャストして使うことにします。本当にありがとうございました!
No.4
- 回答日時:
>#3さん
>どう見てもポインタではないので
なぜですか?
例えば、char *err_ms[] = { "error", "messege" };
という風に「ポインターの配列」を定義したとき、
err_ms[1]は当該配列の要素であって、"message"なる
文字列リテラルへの「ポインター」ですよね。
err_ms[1]という表記「だけ」をもって、
それがどう見てもポインターではない、などと
いえるはずがありません。
No.3
- 回答日時:
No2の方の回答通り、関数の定義での型 char *と、
関数コール時に渡してる引数 err_ms[1]の型とが不一致なんでしょう。
で、ポインタの型変換ができなくてillegal pointer conversionになる、と。
err_ms[1]の宣言がないので型が不明ですが、どう見てもポインタではないので
そのせいだと思います。
渡したいのはエラーメッセージの文字列を格納した配列の先頭アドレスですよね?
であるならば *err_ms[1]ではないでしょうか。
(個人的には、文字列の配列はchar [][]型で宣言・定義しないと
格納実体が文字列だとわかりにくいと感じます。
別に間違いとかではなく個人の好き好きなので、どうでもいい話ですが。)
ポインタをこねくり回す必要のあるCはやっかいですね。
回答ありがとうございます。私の書き間違いでした。ごめんなさい;;
Cはポインタが鬼門ですが使いこなせるようになるとスマートにプログラムを作れますね。
No.1
- 回答日時:
>static const char *r_max[7] ={"err","750","7500","75k","750k","9.2M","20M"};
>Lcd_Custom_Out(1,1,err_ms[1]);
この2行の関係がわかりません。
r_max[]は定義したけれど使っている気配がなく、
err_ms[]は使っているけれど定義した気配がありませんね。
ご回答ありがとうございます
ごめんなさい、大変失礼しました。行の移し間違えでした。err_maxはr_maxの間違いです。
それでエラーが出るんです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# c言語 コマンドライン引数 4 2023/02/09 18:47
- C言語・C++・C# プログラミングの問題です。至急教えてください。 /***から***/の部分をプログラミングにしてほし 1 2022/10/13 11:48
- PHP SQLとPHPの連結方法がわからないのでアドバイスお願い致します 1 2022/07/12 12:16
- C言語・C++・C# c言語 配列とポインタについて 3 2023/02/09 22:53
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
文字列内の数字削除
-
C言語のintとcharの違いってな...
-
文字列str内の全ての数字を...
-
C言語で文字列をかえす正しい書...
-
SetWindowTextについて。
-
char*を初期化したいのですが
-
構造体が戻り値の関数について...
-
strcat関数を自作したいです
-
CStringからchar*への型変換に...
-
C言語を用いた環境変数の作成/...
-
C言語でポインターで詰まってい...
-
C言語にて構造体のメンバがNULL...
-
char型にint型の数値を代入する。
-
new charとnew char[N]の違いは?
-
char 文字列型 の表現範囲が-12...
-
C言語において、以下の条件で...
-
p = (char **)*p の意味
-
文字の代入とコピーについて
-
ポインタを使用 [数字列を数値...
-
文字列の途中から途中までを抽出
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
char*を初期化したいのですが
-
C言語のintとcharの違いってな...
-
CStringからchar*への型変換に...
-
C言語にて構造体のメンバがNULL...
-
小数点入りの文字列をfloat型に...
-
C言語のプログラムについてです
-
strcat関数を自作したいです
-
fstream型オブジェクトを関数の...
-
new charとnew char[N]の違いは?
-
DWORDとcharの変換
-
文字列の途中から途中までを抽出
-
char 文字列型 の表現範囲が-12...
-
const char* s1とただのchar s1...
-
wsprintf( ポインタ , "%d" , "...
-
c言語でポインタ変数を用いた配...
-
char型にint型の数値を代入する。
-
C言語で文字列をかえす正しい書...
-
C++17で、unsigned char * 配列...
-
共用体について
-
エクセルのMID関数は、C言語では?
おすすめ情報