ポインタの配列でエラーが出てしまいます

このQ&Aのポイント
  • 私は今PICというマイコンのプログラミングをしています。ポインタの配列を使って液晶表示器に文字列を表示させるプログラムを作っているのですが、エラーが出てしまいます。
  • Lcd_Custom_Outの行で、illegal pointer conversion [?T53] to [text]というエラーが表示されます。[?T53]という部分が理解できません。
  • C言語が得意ではないため、どう修正すれば良いのか分かりません。mikroC 8.2を使用しています。ご教授をお願いします。
回答を見る
  • ベストアンサー

ポインタの配列でエラーが出てしまいます。

ポインタの配列でエラーが出てしまいます。 私は今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に準拠しております。 大変困っております。どなたかご教授お願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • higeG
  • ベストアンサー率22% (4/18)
回答No.6

err_msがr_max書き間違えという前提で... 使ったことのないコンパイラですが、恐らく#5の方の回答の通りだと思います。 そこで、 static const char *r_max[7] = ... を static char * const r_max[7] = ... に変えては如何でしょうか? ポインタは静的領域に配置されて更新可能になってしまいますが、 各文字列自体はROM上に配置され、Lcd_Custom_Outの呼び出しもエラーにならないと思います。 (コンパイラとリンカの仕様次第ですが、恐らく)

tagussann
質問者

お礼

ご回答ありがとうございます!私にはそこをそう変えてなぜポインタが静的領域に配置されるのか分かりませんが、試してみます。アドバイスありがとうございます。

その他の回答 (6)

  • titokani
  • ベストアンサー率19% (341/1726)
回答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); などとする必要があると思います。

tagussann
質問者

お礼

回答ありがとうございます。定義がそうなっていますがtextが書き換えられるということは無いと思います・・・なんでこんな仕様なのか私には分かりません。おっしゃるとおりバッファを使ってやってみようとおもいます。

回答No.5

 文字列配列 r_maxの型が const char * なのに、関数の引数の型が char * なのでエラーになってるようですね。constの有無もコンパイラによって解釈が違うので、VC++だとwarningが出るだけですが、このコンパイラではエラーになってるのでしょう。(マイコンソフト等でstatic宣言されたconst変数がROM領域に割り当てられたりする場合は、このエラーチェックは特に重要です)  この場合、関数の中でポインタの先が書き換えられるのかどうかが問題となります。書き換えられないのなら関数宣言で引数の型をconst char *としておいてくれたほうが親切です。  書き換えられることが無いのなら(char *)でキャストすれば済む話ですが、書き換えられるなら書き換えられても良い領域に文字列をコピーして渡す必要があります。

tagussann
質問者

お礼

回答ありがとうございます。constを完全に見落としていました。解決しました!ありがとうございます。 マイコンだとこの判定は重要なんですね。初めて知りました。 試してみましたが呼び出しているLcd_Outという関数によって渡したポインタが書き換えられるということはないみたいです・・・ キャストして使うことにします。本当にありがとうございました!

  • asuncion
  • ベストアンサー率33% (2126/6286)
回答No.4

>#3さん >どう見てもポインタではないので なぜですか? 例えば、char *err_ms[] = { "error", "messege" }; という風に「ポインターの配列」を定義したとき、 err_ms[1]は当該配列の要素であって、"message"なる 文字列リテラルへの「ポインター」ですよね。 err_ms[1]という表記「だけ」をもって、 それがどう見てもポインターではない、などと いえるはずがありません。

  • vivace152
  • ベストアンサー率55% (91/165)
回答No.3

No2の方の回答通り、関数の定義での型 char *と、 関数コール時に渡してる引数 err_ms[1]の型とが不一致なんでしょう。 で、ポインタの型変換ができなくてillegal pointer conversionになる、と。 err_ms[1]の宣言がないので型が不明ですが、どう見てもポインタではないので そのせいだと思います。 渡したいのはエラーメッセージの文字列を格納した配列の先頭アドレスですよね? であるならば *err_ms[1]ではないでしょうか。 (個人的には、文字列の配列はchar [][]型で宣言・定義しないと  格納実体が文字列だとわかりにくいと感じます。  別に間違いとかではなく個人の好き好きなので、どうでもいい話ですが。) ポインタをこねくり回す必要のあるCはやっかいですね。

tagussann
質問者

お礼

回答ありがとうございます。私の書き間違いでした。ごめんなさい;; Cはポインタが鬼門ですが使いこなせるようになるとスマートにプログラムを作れますね。

  • g_liar
  • ベストアンサー率52% (382/728)
回答No.2

> Lcd_Custom_Out(1,1,err_ms[1]); ここで使っているerr_msの型が違っているからエラーになっているのでは? 渡しているのはr_maxではないですよね…。

tagussann
質問者

お礼

間違えて大変失礼致しました。

tagussann
質問者

補足

ああっごめんなさい!err_msではなくr_maxです! 行を書き間違えました(汗

  • asuncion
  • ベストアンサー率33% (2126/6286)
回答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[]は使っているけれど定義した気配がありませんね。

tagussann
質問者

お礼

ご回答ありがとうございます ごめんなさい、大変失礼しました。行の移し間違えでした。err_maxはr_maxの間違いです。 それでエラーが出るんです。

tagussann
質問者

補足

err_ms は r_maxの移し間違えでした(汗

関連するQ&A

  • char配列のポインタ消去

    char配列のポインタ消去 こんにちは。C++初心者で、現在ポインタと配列の関係を勉強しています。 以下のコードついて質問があります。 #include <stdio.h> extern void main () { char* str = "hello world."; printf(str); delete str; } コンパイルはうまくのですが、 いつもプログラムが正常に終了できません。 deleteをコメントアウトすると正常に終了します。 理由がわかる方いらっしゃるでしょうか。

  • ポインタ配列

    ポインタ配列によるひとつのプログラムを組もうと思っています。 で、以下のようなプログラムを作ってみました。 1:#include<stdio.h> 2:#define NUM 5 3:main(void){ 4: char *str[NUM]; 5: int i; 6: for(i=0;i<NUM;i++){ 7: printf("string --->"); 8: scanf("%s",str[i]); 9: } 10: for(i=0;i<NUM;i++){ 11: printf("str[%d] --> %c\n",i,str[i]); 12: } 13:} これなのですが、8行目のscanf文でコンパイルエラーではなく、実行エラーが出ます。どのようにすれば動くようになるのでしょうか? 入力する文字は、9文字以下を想定しています。

  • 2次元配列とポインタ

    char str1[][6]={"one","two","three","four","five"}; char *pt1; pt1 = str1; //(1) 上記の記述では(1)で型エラーが発生します。 ここを pt1 = *str1; //(2) と変更するとOKになるのですが、 (1)にすれば配列名だけでstr1先頭のアドレスがポインタpt1にセット されると思うのですが、なぜダメなのでしょうか?

  • 文字列の宣言(ポインタと配列)

    Cでソケット通信などはできるくらい(もちろんできると言っても私のレベルで) になりましたが、文字列を宣言する際に char *str = "ahaha'; char str[] = "ahaha"; の2種類の違いが今イチしっくりきません。 いろんな参考書でこれの説明はありましたが、でも結局なんなんだ、という感じです。 ポインタで宣言するべき時、配列で宣言するべきときが判断できません。 またポインタで宣言するとエラーが出るけど試し配列で宣言してみたら なんか知らんが動いた、ということも多々ありましたが理由がよくわからなかったです。 よろしくお願いいたします。

  • 文字列を表すための配列とポインタ

    文字列を表すための配列とポインタ  配列とポインタは同様に扱えるもの、と思って、次のプログラムを作りました。処理系は、Visual Studio 2010 コマンドプロンプトです。 #include <stdio.h> void main(void) { char a[256]; char *b; printf("文字列を入力してください。\n"); printf("例「abcde」\n\n"); printf("配列型文字列を使います。\n"); scanf("%s", a); printf("文字列は%sです。\n\n", a); printf("ポインタ型文字列を使います。\n"); scanf("%s", b); printf("文字列は%sです。\n", b); }  すると、まずコンパイル時に、 「warning C4700: 初期化されていないローカル変数'b'が使用されます」 と表示されました。そして、実行すると、「配列型文字列」の方は問題ないのですが、「ポインタ型文字列」の方の実行後に、 「x.exeは動作を停止しました。 問題が発生したため、プログラムが正しく動作しなくなりま した。プログラムは閉じられ、解決策がある場合は Windowsから通知されます。」 と表示され、エラーとして終了してしまいます。 「char *b;」 と宣言するところが問題のようですが、なぜなのかが分かりません。どなたか、解説をお願いします。

  • C言語の型と配列

    char* str[10]={"a","b"}; char* str2="c"; としたときにstr=str2とすると 型が合わないといったエラーが出ます。 でもstrって結局はポインタの配列の先頭要素のアドレスですよね。 ポインタにポインタを入れているので通るのかなと思ったんですけど、 配列で宣言するとポインタにも型がつくのでしょうか? この例だと strは char * を10個持つ配列をさすポインタ  で、 str2はchar *をさすポインタ みたいなかんじです。 質問の意味がわかりにくいですが、ご指摘をいただければ補足しますので よろしくお願いします。

  • ポインタを用いた配列

    コマンドラインで入力した入力した3つの数字に配列ポインタを付けて 線形リストにし、それらを表示したかったのですが、エラーが出て分かりません。 3、4年前に一度やったことはありましたが、いざやってみると全然できませんでした。 どこをどう直したら良いのか、ご教授よろしくお願いします。 class Node1 { public static void main(String arg[]) { String num = br.readLine(); a1.new Node(num); a2.new Node(num); a3.new Node(num); a1.next = a2; a2.next = a3; System.out.println("a1 = " + a1.new); System.out.println("a2 = " + a2.new); System.out.println("a3 = " + a3.new); } }

  • 文字列の配列の比較

    こんにちは。タイトルどおり簡単な質問なのですが、どうしても確認したいのでお願いします。 とあるメソッドで、2次元配列の中にいくつか大文字のOが入ってるのですが、与えられた配列にOがあればtrueを返し、なければfalseを返します。 public boolean cellAt(int row, int col){ if(space[row][col].equals("O")) return true; else return false; } rowとcolはテストメソッドから値を受け取ります。 これでプログラム自体は動くのですが、WebCatという自動的に採点するものがあるのですが、それによるとエラーがでてしまいます・・・。 どこが違うのかは教えてくれないのですが・・・。 上で間違っているとすれば、文字列の比較くらいしかないんじゃないかと思うのですが、 space[row][col].equals("O") これで比較できますよね? 他のを調べて、if (Arrays.equals(space[row][col], "O"))これを試してもみたのですが、赤線が出てしまって無理でした。 どなたか宜しくお願いします。

  • char型配列をString型にしたい

     VC++2005ExpressEdition + PlatformSDKを使用しています.  char型配列をString型にしたいと思っています(MessageBoxで表示するため).  int型ならば, > String^ out = String::Format("{0}", i ); > MessageBox::Show(out); などとできます.  下のアドレス(*1)のNo.2の答えにあるように > char ss[256]; > String^ out; > out=ss; とすると > error C2440: '=' : 'char [128]' から 'System::String ^' に変換できません。 なるエラーが出ます(S を大文字にしたりハットを付けたりしています).  char型の配列のString型への変換はどのようにすればいいのでしょうか. (*1)http://oshiete1.goo.ne.jp/kotaeru.php3?q=479640

  • 2次元配列のポインタ

    整数型行2列2の2次元配列の[1][0]は、ポインタでは3になるとおもっているのですが、ちがったでしょうか? 下記のソースでエラーが出ていて困っています。 void main() { int array[2][2] = { { 9, 9 }, { 9, 9 } }; int num=2, j,i; *(array + 3) = 0; for (i = 0; i < num; i++) { for (j = 0; j < num; j++) { printf("%d", array[i][j]); } puts(""); } } 99 09 と表示させたいのですが、どこに間違いがあるのでしょうか?

専門家に質問してみよう