• ベストアンサー

ポインタの引数を持った関数の呼び出し方

ポインタの引数を持った関数の呼び出し方がわからず困っています。 呼び出したい関数は下記 enum{ TEST_TOP_MENU=0, TEST_MAIN1_MENU, TEST_MAIN2_MENU, TEST_MAIN3_MENU, TEST_AREA_TOP_MENU, }; void test_menu_mode(LCD_VIEW_MODE *view) { int ret_menu; switch(view->sub){ case TEST_MAIN1_MENU: ret_menu = test_main1_menu(); break; case TEST_MAIN2_MENU: ret_menu = test_main2_menu(); break; case TEST_AREA_TOP_MENU: ret_menu = test_area_top_menu(); break; } } この関数を呼び出すために main(){ //中略 LCD_VIEW_MODE test; test->sub = TEST_MAIN1_MENU; test_menu_mode(test); //中略 } このようにtest_menu_mode関数を呼び出すとエラーが出てコンパイルできないのですが、どこが問題なのでしょうか?

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.3

C言語を理解しないで、闇雲に進めるのは無理ですよ。 test.sub = TEST_MAIN1_MENU; test_menu_mode(&test); で、コンパイルエラーは無くなると思いますけど、意図通りに動くかどうかは、また別。

techhouse
質問者

お礼

回答頂きありがとうございました。 コンパイルエラーが解消されました。 ちょっと疑問に思っているのが、なぜ、 ”test->sub = TEST_MAIN1_MENU;”このように書いちゃいけないのかというのが残っているのですが、これはまた別の質問でやらせていただきます。

その他の回答 (2)

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

どんなエラーが出たかを必ず提示してください。 解決への第一歩です。 testはポインタ変数ですか? もし違うとすると、アロー演算子は使えません。

techhouse
質問者

お礼

回答頂きありがとうございます。 大変申し訳ありません。 LCD_VIEW_MODE test; この”LCD_VIEW_MODE”というのは typedef struct _LCD_VIEW_MODE_ { BYTE mode; BYTE sub; WORD time; }LCD_VIEW_MODE; このような形の構造体になっています。 それとコンパイル時のエラー文は ”C2204 (E) Illegal member reference for "->"” が出力されました。 今H8_2368マイコンでプログラミングをやっています。

回答No.1

ポインタなんだからアドレスを渡しましょう。 test_menu_mode(&test);

techhouse
質問者

お礼

回答頂きありがとうございました。 なるほど、test_menu_mode関数に渡したい引数データはtestのデータのアドレスということになるのですね。だから ”test_menu_mode(&test);”って書いているのですね。

関連するQ&A

  • 関数の引数を動的に変えたい

    ちょっと説明がややこしいのですが……。 <html> <head> <script language="JavaScript"> function PopupActive( PopupID , id) { ・・・(中略)・・・ PopupObj = document.all( PopupID ).style ・・・(中略)・・・ PopupObj.visibility = "visible"; return; } function DocAction(id) { ・・・(中略)・・・ } </script> </head> <body> ・・・(中略)・・・ <%For i=1 To 10%> <a href="javascript:void( 0 )" onClick="javascript:PopupActive( 'Popup1', <%=i%> )">メニュー<%=i%></a><br> <%Next%> <div style="position:absolute; left:0; top:0; width:75px; height:25px; z-index:1; visibility:hidden;" id="Popup1"> <pre class="PopupMenu"> <a class="Popup" href="javascript:DocAction(XXX)">サブメニュー</a> </pre> </div> </body> </html> 上記処理で、divタグ内にあるDocAction(XXX)の、XXX部分に、Forループでのiの値を入れたいのですが、そういうことは可能でしょうか? PopupActive関数内で、例えばPopupObj.pixelWidth=100とすれば、レイヤーの幅を75から100に変えることができるのはわかるのですが、似たような方法で、メニュー1のサブメニューならDocAction(1)、メニュー2のサブメニューならDocAction(2)、というように動的に指定できる方法はないでしょうか? (この例ではForループのiを入れてますが、実際に作りたいプログラムでは、DocActionの引数にどんな値が来るかは不定です)

  • 列挙体(enum)と関数教えてください。

    下記、勉強中の本から抜粋したものです。 main関数の中のenum animal selected;が呼び出されたあと、 どのように読んで?進んでいったらよいのでしょうか? enum(列挙体)のenum animal { Dog, Cat, Monkey, Invalid };が 0,1,2,3,の働きをするということは、enum animal select(void)関数 に続くということでしょうか? 本の中に、enum animalが型名、 selectedが変数の宣言となってることも わかりません。ただmain関数で宣言しているだけなのでしょうか? switch文の中の (selected = select())もどういう意味なのでしょうか? enum(列挙体)とenum animal select(void)関数の関係や、 main関数の中のenum animal selected;、 switch文の中の (selected = select())などの説明していただける方 教えてください。よろしくお願いします。 #include <stdio.h> enum animal { Dog, Cat, Monkey, Invalid }; void dog(void) {      puts("ワンワン!!"); } void cat(void) {      puts("ニャ~オ!!"); } void monkey(void) {      puts("キッキッ!!"); } enum animal select(void) {      int tmp;      do {           printf("0…犬 1…猫 2…猿 3…終了:");           scanf("%d", &tmp);      } while (tmp < Dog || tmp > Invalid);      return (tmp); } int main(void) {      enum animal selected;      do {           switch (selected = select()) {                case Dog : dog(); break;                case Cat : cat(); break;                case Monkey: monkey();break;           }      } while (selected != Invalid);      return (0); }

  • コマンド分岐処理 単体テスト

    C言語勉強中です。Sub関数の単体テストを行いたいのですが、どうすれば良いのか分かりません。疑似mainを作ってそこに実行された関数の戻り値を返す?というのはなんとなく分かります・・。どういう風に書けばよいのか良いのですか?? #include<stdio.h> int sub_command(int icmd,LINE **stt_pnt,LINE **cur_pnt,LINE **help_pnt,char *afname) { static char *adress=NULL; static int iupdate=0; int ret; int pret; switch(icmd){ case 1: *cur_pnt=(*cur_pnt)->next; Sub_current(*stt_pnt,*cur_pnt); } break; case 2: Sub_apend(stt_pnt,cur_pnt); iupdate==1; break; case 3: Sub_delete(stt_pnt,cur_pnt); iupdate==1; Sub_current; break; case 4: Sub_past(cur_pnt,adress); iupdate==1; break; case 5: ret=Sub_save(*stt_pnt,iupdate,afname); if(ret==0){ iupdate==0; } break; case 6: adress=Sub_copy(*cur_pnt,adress); break; case 7: Sub_help(help_pnt); break; case -1: pret=Sub_quit(iupdate); break; } return pret; }

  • ポインター引数の関数でコンパイルエラーが出る。

    現在ATmega88というアトメル社製のマイコンのプログラミングを行っています。コンパイラはwin_avrを使用しています。 現在void tx_test(cc1101_client * client)というcc1101_clientポインターを引数とした関数を作成したのですが、この関数内でu16 tx_fifo_set(txfifo_data * txfifo)という txfifo_dataポインターを引数とする関数を呼び出したいと思っているのですが、これをコンパイルすると error: incompatible type for argument 1 of 'tx_fifo_set'というエラーが出力されコンパイルできない状態になります。なぜこのようなエラーになるのでしょうか? u16 tx_fifo_set(txfifo_data * txfifo) { -------------------(中略)------------------------------------------------------------- } void tx_test(cc1101_client * client) { u8 i=0; u8 new_input_data=0; -------------------(中略)------------------------------------------------------------- while(1) { switch(status) { -------------------(中略)------------------------------------------------------------- case FIFO_SETUP: if(cnt_sent_packet > 100) { status = DATA_WAVEOUT_QUIT; break; } //alert_data_get(&client); cc1100_cmd_flush_tx(); cc1100_cmd_idle(); cc1100_cmd_calibrate(); cc1100_cfg_gdo0(CC1100_GDOx_SYNC_WORD); mdelay(5); client->status.sessionflag = 0x02; //SYN flag set client->status.ivent_flag = 0xa5; //tx_length = tx_fifo_set(client); //tx_fifo_set(&client); tx_fifo_set(client->txfifo); udelay(10); #if 1 cc1100_read_reg_uartout((CC1100_REG_TXBYTES | CC1100_ACCESS_STATUS)); #endif status = DATA_WAVEOUT; break; -------------------(中略)------------------------------------------------------------- }

  • 関数で取得したポインタを削除したい

    関数で取得したポインタを削除したい 以下のような方法でMain関数からpData0の実体を削除しようとしています。 ですが、これだとMain()で宣言したpdataが削除されるだけで、pData0のデータは残っています。 調べたところ、pdata = GetDataPointer(0)は、単なるポインタコピーに過ぎないからでしょうか。 このような場合は、どうしたらよいのでしょうか? よろしくお願いします。 void Main(void) {     CData *pdata;     pdata = GetDataPointer(0);     if (pdata) {         pdata->Remove();         pdata = NULL;     } } CData* GetDataPointer(int fg) {     CData *pRetData;          switch (fg) {     case 0:         pRetData = pData0;         break;     case 1:         pRetData = pData1;         break;     }          return pRetData; }

  • 関数について

    C言語の関数プログラムで、月を入力すると季節を表示する関数を作っているのですが、上手くいきません・・・。何か違うのでしょうか。 #include <stdio.h> void month(int a) { switch(a) { case '3': case '4': case '5': printf("春です。"); break; case '6': case '7': case '8': printf("夏です。"); break; case '9': case '10': case '11': printf("秋です。"); break; case '12': case '1': case '2': printf("冬です。"); break; default: printf("そのような月はありません。"); break; } } int main(void) { int m; printf("月を表示してください:"); scanf("%d",&m); month(m); return 0; }

  • 関数の引数なしを変数に代入したら入ってきた数値は何?

    デバッグソフトで自分のプログラムを動かしていたときに、 int test_func(char x) { x = x + 1; ------(中略)----------- return x; } int main(void) { int test_val; ------(中略)----------- test_val = test_func; ------(中略)----------- } このようにtest_func(char x)という関数の戻り値を変数test_valに代入するつもりだったのですが、間違って引数部分を書かずにコンパイルしてしまいました。 このときにコンパイルでエラーが出ると思ったのですが、コンパイル完了でデバッガで変数test_valをみてみると何か値が入っていました。 ちょっと気になったのですが、この変数の中に入った値はいったい何なのでしょうか。ご存じの方いらっしゃいましたらご教授お願いいたします。

  • PICのマシンのプログラムについての質問です。

    #include <16f873a.h> #fuses HS,NOWDT,NOPROTECT,PUT,NOBROWNOUT,NOLVP #define use_portb_lcd TRUE #use delay (clock=10000000) #include <lcd.c> void port_ini(void); void lcd_express(int); void motor_drive(int); main() { int mode; port_ini(); while(1){ mode = (input_a() & 0b00000110); lcd_express(mode); motor_drive(mode); } } void port_ini(void) { setup_adc_ports(NO_ANALOGS); setup_counters(RTCC_INTERNAL,RTCC_DIV_2); port_b_pullups(FALSE); set_tris_a(0xff); set_tris_b(0x00); set_tris_c(0x00); output_b(0x00); output_c(0x00); lcd_init(); } void lcd_express(int disp) { lcd_gotoxy(1,1); lcd_putc("<DC-motor mode>"); delay_ms(5); lcd_gotoxy(1,2); switch(disp){ case 0:{ lcd_putc("- Go!Go! -"); break; } case 2:{ lcd_putc("- L-Bend -"); break; } case 4:{ lcd_putc("- R-Bend -"); break; } case 6:{ lcd_putc("- R-Turn!-"); break; } default: break; } } void motor_drive(int mode) { switch(mode){ case 0:{ output_c(0b00110000); break; } case 2:{ output_c(0b00111000); break; } case 4:{ output_c(0b01110000); break; } case 6:{ output_c(0b01010000); delay_ms(800); while(!(4==(input_a() & 0b00000110))){} output_c(0b00101000); delay_ms(100); break; } default:break; } } この文でlcdに何も表示しないようにしたいのですがどこを消せばいいのでしょうか? あと、void文などもできれば消して動かせるようにしたいのですが、どのようにすればいいでしょうか? ちなみにプログラムは、SW1・2を押しているときに、それぞれ片方タイヤを回転させ、両方押しているときに両方回転させて前進、両方押していないときは後退するというプログラムです。 ×字の台に張られた黒いテープをたどって最終的に真ん中でとまるという競技のプログラムです。 できればlcd関連のプログラムをすべて消したいです。

  • FlashとJavaScriptの連携 (ExternalInterface)

    初心者です。初めて質問いたします。 調べてやってみたのですが、上手くいかず、ご教授願えませんか? FlashのボタンからFlashに重ねたインラインフレームを制御しようとしてます。 その際に使いたいJavaScriptが・・・ function switchContent(id){ var view = $("main"); var tgt=$("main-win"); switch (id){ case "test1": view.style.visibility = "hidden"; tgt.src=""; break; case "test2": resizeMain(); view.style.visibility = "visible"; tgt.src="http://www.google.co.jp/"; break; } } というものです。main-winがインラインフレームで、その下に配置しているmainを表示、非表示と制御したいと考えております。 FlashのほうのASは・・・ import flash.external.*; Button.onRelease = function() { ExternalInterface.call("関数名", 引数); }; と調べやってみましたが、上手くいきません。 Flashのほうに問題があると思うのですが 何卒よろしくお願いします。

  • オブジェクトの消滅と関数の戻り値オブジェクト

    public sub test1() { dim hoge as classX = tes2() test2.getHogehoge() } public Function test2() as classX { dim ret As New classX("初期化") return ret } 大変簡略化してますが上記2つの関数があった場合 関数test1でclassX型のアドレスhogeに、test2()が返す classX型オブジェクトの参照を代入しています。 でこの実体というかインスタンスretはtest2()の中の スコープで消滅する自動変数として生成されています。 んで実際関数test2を抜けるときretのインスタンスは 破棄されるのにtest1ではそれをhogeアドレスに代入して 使用していいのでしょうか?

専門家に質問してみよう