- 締切済み
引数の可変
覚えたての引数の可変を使ってみた素人であります。(独学です 見よう見真似で書いた為、目茶苦茶だと思われます。 自分で簡単なexeファイルを作ってみていて 引数の可変が必要となったので付け足そうとしていたのですが、「引数の可変」部の他 意外にもfor文からもエラーが出ました(while使えば済む話なのですが) 今までfor文をあまり使わずwhile文ばかり使っていた為、for文の基本的な構文が失敗しているのかもしれません。折角だから使ってみようとした結果がこれです。 #include <stdio.h> #include <locale.h> #include "DxLib.h" #include <string.h> #include <stdarg.h> int i; ・・・略・・・ class CharsOut{ ____int ypixel; ____char *hangar; ____int size; ____int HowMany; ____int list; public: ____int CharsOuting(int HowMany,int ypixel,int size,...); }; int CharsOuting(int HowMany,int ypixel,int size,...){ ____va_start(list,HowMany); ____for (i=0;i<HowMany;i++){ ________printf("%s",va_arg(list,char *)); ____} ____va_end(list); ____return 0; } ypixel、size...といった変数等は気にしないでください。 成功していたらコードを足すつもりでした。 自分がやりたいことは、main関数から変数HowMany,*hangar等を受け取り 文字列*hangarを引数の分出力したいのであります。引数の可変は*hangarを何個か渡すつもりだったので使用しました。 こんな感じに使うつもりでしたc.CharsOuting(2,0,32,"I am ", "hangury"); ※リストは(int HowMany,int ypixel,int size,...)です ※ハングリーのスペルが違う等ということはとてつもなくどうでもいいことなのです。 自分で「main関数から*hangarを受け取り」と書いておきながらリストに*hangarがない時点でおかしいと思ってはいるのですが、記述の方法が分からないので書けません。 以下エラー (名前とか一部改変・不要な部分省略 1>------ ビルド開始: プロジェクト:(≡ω≡.), 構成: Debug Win32 ------ 1>コンパイルしています... 1>soucer.cpp 1>error C2040: 'i' : 'int' は 'int [5]' と間接操作のレベルが異なります。 1>error C2065: 'list' : 定義されていない識別子です。 1>error C2440: '=' : 'int' から 'int [5]' に変換できません。 1>配列型への変換はありませんが、参照またはポインタから配列への変換があります。 1>error C2446: '<' : 'int' 型から 'int *' 型への変換ができません。 1>整数型からポインタ型への変換には reinterpret_cast、C スタイル キャストまたは関数スタイル キャストが必要です。 1>error C2040: '<' : 'int [5]' は 'int' と間接操作のレベルが異なります。 1>error C2105: '++' には左辺値が必要です。 1>error C2065: 'list' : 定義されていない識別子です。 1>error C2065: 'list' : 定義されていない識別子です。 1>ビルドログは "file://c:\・・・\Debug\BuildLog.htm" に保存されました。 1>(≡ω≡.) - エラー 8、警告 0 ========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ========== 文章能力なくて申し訳ありません。 ご回答頂ければ幸いであります。宜しくお願いします。 OS:WinXP コンパイラ:Visual C++
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- Yanch
- ベストアンサー率50% (114/225)
使用例とか載っていますが、このページとか参考になるかな。 http://msdn.microsoft.com/ja-jp/library/kb57fad8.aspx これを見ても意味がわからないようなら、基礎から勉強しなおす事をお勧めします。
- php504
- ベストアンサー率42% (926/2160)
関数に引数を渡すとき普通スタックというところに引数がコピーされて渡されます。 引数の右から積まれるとか左から積まれるとか決まりがあるのですが置いておいて。 CharsOuting(2,0,32,"I am ", "hangury"); と呼び出したとき 2 //int HowMany 0 //int ypixel 32 //int size "I am " "hangury" とスタックに積まれます va_startで指定するのはこの引数の場所になりva_argでその次の引数が取り出されます。 va_start(list, HowMany);としたら次のva_argで取り出せるのはint ypixelになります。 とりあえず関数の引数の順番を int CharsOuting(int ypixel,int size,int HowMany,...);にすると良いでしょう。 va_list list: int i; と変数の宣言もお忘れなく。
お礼
ご回答有難うございます。 やはりこれは難しいものですね。今度ゆっくり勉強したいと思います! そしてエラーですが、全てfor文のエラーでした。 このコードを削ったらエラーが出ずに済みました。 for (i=0;i<HowMany;i++){ ...} HowManyを整数にしてみたりしてみましたが変化なしです。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ soucer.cpp(356) :error C2440: '=' : 'int' から 'int [5]' に変換できません。 1> 配列型への変換はありませんが、参照またはポインタから配列への変換があります。 soucer.cpp(356) :error C2446: '<' : 'int' 型から 'int *' 型への変換ができません。 1> 整数型からポインタ型への変換には reinterpret_cast、C スタイル キャストまたは関数スタイル キャストが必要です。 soucer.cpp(356) :error C2040: '<' : 'int [5]' は 'int' と間接操作のレベルが異なります。 soucer.cpp(356) :error C2105: '++' には左辺値が必要です。
補足
自分のソースコードをよく見たら、何故かint iを配列で宣言していました; 自分の単純なミスでした。申し訳ありません。 質問本文のソースコードを訂正させて頂きます。 class CharsOut{ ____int ypixel; ____char *hangar; ____int size; ____int HowMany; ____va_list list; public: ____int CharsOuting(int ypixel,int size,int HowMany,...); }; int CharsOuting(int ypixel,int size,int HowMany,...){ ____va_start(list,HowMany); ____for(i[3]=0;i[3]<HowMany;i[3]++) ________printf("%s",va_arg(list,char *)); ____va_end(list); ____return 0; } main関数の一部↓ c.CharsOuting(0,0,2,"I can't", "understand easily."); これでエラーが出ずに済むかと思いきや、外部参照さんが出て参りました。 1>リンクしています... 1>soucer.obj : error LNK2019: 未解決の外部シンボル "public: int __cdecl CharsOut::CharsOuting(int,int,int,...)" (?CharsOuting@CharsOut@@QAAHHHHZZ) が関数 _WinMain@16 で参照されました。 1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\menu\Debug\menu.exe : fatal error LNK1120: 外部参照 1 が未解決です。 c.CharsOuting(2,0,0,"I don't", "understand easily."); このコードを除くとエラーが出ない為、やはり何かが違っているようです。
- Yanch
- ベストアンサー率50% (114/225)
● > ____va_start(list,HowMany); va_start の第1引数の型は、va_listですが、 va_list型のlistと言う変数が宣言されている個所が見当たりません。 変数は使用する前に宣言する必要があります。 また、va_startの第2引数は、可変長引数を処理する関数の取得する 可変長パラメタの1つ前のパラメタを指定する事になっていますが、 HowManyは、該当するパラメタではありません。
お礼
ご回答有難うございます。お返事遅くなって申し訳ありません。 >va_list型のlist int型で宣言していましたね・・・気づきませんでした。 >また、va_startの(ry 自分なりに頑張ってみたものの、お恥ずかしながらどう直せばいいのか分かりませんでした。 現在残りのエラーは4つ(以下)です error C2440: '=' : 'int' から 'int [5]' に変換できません。 1> 配列型への変換はありませんが、参照またはポインタから配列への変換があります。 error C2446: '<' : 'int' 型から 'int *' 型への変換ができません。 1> 整数型からポインタ型への変換には reinterpret_cast、C スタイル キャストまたは関数スタイル キャストが必要です。 error C2040: '<' : 'int [5]' は 'int' と間接操作のレベルが異なります。 error C2105: '++' には左辺値が必要です。
お礼
ご回答有難うございます。 此処を見て理解できていれば苦労はしないですね・・・w