【GCC】implicit declaration of function '_wtoi' 解決方法
- 問題 : GCC で C コンパイル時の警告文「warning: implicit declaration of function '
_wtoi
' [-Wimplicit-function-declaration] int n = _wtoi(argv[1]);」を解消したい - 答え :
#undef __STRICT_ANSI__
コンパイルする
#include <windows.h> int main() { // コマンドライン引数(1番目)を数値変換して出力 int length; LPWSTR *argv = CommandLineToArgvW(GetCommandLineW(), &length); int n = _wtoi(argv[1]); TCHAR s[99]; wsprintf(s, TEXT("%d"), n); MessageBox(NULL, s, TEXT(""), MB_OK); return 0; }
警告が出る
コンパイル gcc src.c -std=c11
すると、以下の警告文が表示される。
src.c: In function 'main': src.c:6:3: warning: implicit declaration of function '_wtoi' [-Wimplicit-funct ion-declaration] int n = _wtoi(argv[1]);
この意味は、「暗黙に宣言された関数 _wtoi
を使っています」だ。
インクルードし忘れか?
きっと _wtoi
が宣言されたヘッダファイルをインクルードしていないから、こんな警告をされるのだ。ならば、インクルードしよう。C:\MinGw\include\
内を検索する。
結果はこれだ。
stdlib.h
tchar.h
なので、#include <stdlib.h>
と #include <tchar.h>
を src.c
に追加して再コンパイルするも、同じ警告をされてしまった。(それどころか別のエラーまで発生する始末)
よくよく調べてみると、windows.h
にて、遠回しにこれらのヘッダファイルがインクルードされるようになっていたので、全く意味がなかった。
原因は stdlib.h のソースだった
明示的に宣言しているはずなのに、どうして暗黙の宣言だと警告されてしまうのか。その原因は、stdlib.h
内にある _wtoi
の宣言方法にあった。以下に、当該箇所を示す。
#if !defined (__STRICT_ANSI__) _CRTIMP double __cdecl __MINGW_NOTHROW _wtof (const wchar_t *); _CRTIMP int __cdecl __MINGW_NOTHROW _wtoi (const wchar_t *); _CRTIMP long __cdecl __MINGW_NOTHROW _wtol (const wchar_t *); #endif
#if !defined (__STRICT_ANSI__)
というブロックに囲われて宣言されている。「もし __STRICT_ANSI__
が定義されていないならば、_wtoi
という関数を宣言しますよ」という意味だ。ゆえに、_wtoi
が宣言されたヘッダファイルを正しくインクルードしていても、__STRICT_ANSI__
が定義されていれば、暗黙の宣言になってしまい、警告が出る。
そもそも「暗黙の宣言」とは何か。よくわからないが、#include <stdio.h>
しなくとも printf
が使えるのと同じで、自動的に宣言してくれる機能があるらしい。
GCC コマンドオプションによって結果が変わる
つまり、警告を出さないためには __STRICT_ANSI__
を定義しないようにすればいいことがわかる。どうすれば定義されないようにできるかというと、コンパイル時のオプションで -std=c11
や -std=c99
を指定せず、例えば -std=gnu1x
を指定しておけば定義されなくなる。その証明は、以下のソースコードのコンパイルで行うことができる。
#include <windows.h> int main() { TCHAR s[99]; wsprintf(s, TEXT("%d"), __STRICT_ANSI__); MessageBox(NULL, s, TEXT(""), MB_OK); return 0; }
コンパイル gcc nazo.c -std=c11
して、実行すると、メッセージボックスが現れ、「1」と表示される。
一方で、gcc nazo.c -std=gnu1x
すると、以下のエラーが出てコンパイル失敗する。
nazo.c: In function 'main': nazo.c:4:27: error: '__STRICT_ANSI__' undeclared (first use in this function) wsprintf(s, TEXT("%d"), __STRICT_ANSI__); ^ nazo.c:4:27: note: each undeclared identifier is reported only once for each function it appears in
このことにより、__STRICT_ANSI__
の定義は、-std=c11
なら「有」となり、-std=gnu1x
だと「無」になることがわかる。
強引だが解決できなくはない
ならば、-std=c11
時に行われる __STRICT_ANSI__
の定義を取り消せば、_wtoi
が明示的に宣言されるようになるのであり、その方法として、「ソースコードの最初のほうに #undef __STRICT_ANSI__
を書いておく」というものがある。
#undef __STRICT_ANSI__ #include <windows.h> int main() { // コマンドライン引数(1番目)を数値変換して出力 int length; LPWSTR *argv = CommandLineToArgvW(GetCommandLineW(), &length); int n = _wtoi(argv[1]); TCHAR s[99]; wsprintf(s, TEXT("%d"), n); MessageBox(NULL, s, TEXT(""), MB_OK); return 0; }
これで警告は出なくなる。
たかが警告だ放っておこう
しかしながら、ヘッダファイルが -std=c11
といった規格指示によって、何らかの意図があって _wtoi
の宣言の有無を自動決定していくれているものを「警告をなくしたいから」という理由だけで影響範囲も考えず __STRICT_ANSI__
の定義を取り消すことはまずいことのきっかけになりそうなにおいを孕んでいる。
たかが警告だ。放っておこう。
Windows 無線 LAN 切断バグへの対処例
最近、PC (Windows 10) で無線 LAN インターネットをしていると、切断されてしまうことが多い。色々と試行錯誤をしているが、原因がはっきりしない。
試したこと~その1~
- デバイスドライバを再インストールしたり、
- 「ネットワークと共有センター」→「Wi-Fiのプロパティ」→「インターネット プロトコル バージョン 4 (TCP/IPv4)のプロパティ」→「TCP/IP 詳細設定」で、
- 「LMHOST の参照を有効にする」をオフ
- NetBIOS over TCP/IP を無効にする
したりと、色々いじっている。
不具合内容
「無線 LAN が切断される」の意味は、「無線ルーターが発信している SSID が見えなくなる」ということで、すなわち「無線ルーターがバグる」のである。(PC でこの現象が起きてから、PSVita で無線 LAN 接続しようとしても、当該 SSID が一覧に表示されないので、PC 側だけの問題ではないのだ)
無線ルーターが物理的にぶち壊れてきたのではないかとも思ったが、まだ寿命ではないと信じたい。
試したこと~その2~
他の試行錯誤として、wlan プロファイルの種類を「パブリック ネットワーク」にすることもやった。これをやったあたりから、一日間、しばらくバグってないので、おそらく、これが効いているような気がする。
そもそも、Windows 8(.1) 時代はずっと「パブリック ネットワーク」にしていたのだが、Windows 10 にしてから、色んな設定の見直しの最中に、気まぐれで「プライベート ネットワーク」に変更した。これが良くなかったのではないか。
種類の変更は、以下のようにして行う。
- まずプロファイルを削除する。コマンド プロンプトで
netsh wlan delete profile 当該SSID名
でできるはず。(できない場合は、netsh wlan show profiles
で調べる) - プロファイルを新規作成。接続するときの質問「このネットワーク上の他の PC やデバイスが、この PC を検出できるようにしますか?」で「いいえ」を選択
- 完了
結論
原因はよくわからない。どんな方法が有効なのかもはっきりしない。
鉄拳動画の楽しみ方
「鉄拳」という格闘ゲームがある。
このシリーズの最新版は「鉄拳7」で、様々な対戦動画がネットに上がっている。
たとえば、Evo 2015 - Tekken 7 Grand Final: BE | AO vs ORZ | Nobi - YouTube だ。
何の知識がなくても、派手な空中コンボや独特なキャラクターたちを見て楽しめるが、ゲームシステムの仕様を最低限知っていれば、より多くのシーンを楽しむことができる。
- 技の分類(上・中・下・しゃがステ・ジャンステ)
- ガードすると有利になる技がある(反撃で確実にダメージを与えられる)
- ガードすると不利になる技がある(長い行動不能時間が発生)
技の分類
鉄拳のキャラクターは、とても多くの技が使える。全てのキャラの全ての技のコマンドを覚えることが難しいほどに多い。
しかしながら、大きく分類することができる。すなわち、上段・中段・下段である。
上段
ジャブやハイキックなど、相手の頭らへんに向けた技は「上段」である。
この技を出したとき、相手が「ぼっ立ち」「後退」をしているとダメージが通らない。これを「ガードされる」と言う。
また、相手が「しゃがみ」をしていると、そもそも当たらない。(空を切る)
中段
アッパーやジャンプキックなど、相手の腹らへんに向けた技で、非常に多くの技が「中段」に分類されている。
上段同様、相手が「ぼっ立ち」「後退」をしているとガードされる。
上段と違って、相手が「しゃがみ」をしていても当たる。なので、相手がしゃがむことを期待して中段を出す場面は多い。
鉄拳には「浮かせ技」があり、うまく当たれば空中コンボにつなげることができる。主な浮かせ技として、「右アッパー」「ライトゥー(※)」がある。これらの多くが「中段」である。
※ライトゥーとは、ジャンプしながらキックする技のことで、元々「ライジングトゥーキック」という、あるキャラ特有の技の名称が由来である。
下段
ローキックなど、相手の足元に向けた技が「下段」である。
上段・中段と違い、相手が「ぼっ立ち」「後退」していても当たる。
中段と違い、相手が「しゃがみ」をしているとガードされる。
鉄拳のキャラは、意図的に「しゃがみ」ボタンを押さない限りは、常に立っており、その状態が基本となっているので、当てやすいタイプの攻撃ではあるが、それ相応のリスクが存在する。(後述:ジャンステ)
しゃがステ
特定の行動を取ると、キャラに「しゃがみステータス」が付く。これが付くと、「しゃがみ」と同じような特徴が発生する。一般に、略して「しゃがステ」と呼ばれる。
たとえば、ローキックする際、多くのキャラが低い姿勢で行っている。この短い間「しゃがステ」が付き、しゃがんでいるときと同様、相手の上段が当たらない。ただし、しゃがステは、純粋な「しゃがみ」とは異なり、こちらが遅いしゃがステ技を出している間、相手の速い下段が当たると、普通にダメージを食らう。
相手の上段をかわしつつ攻撃を入れたいときに「しゃがステ」技を使うことは有意義である。たとえば、「しゃがパン」すなわちしゃがみパンチを出すと、ダメージこそ低いものの、相手の上段を潰すことができる。
低い姿勢で出している技には「しゃがステ」効果がある。
ジャンステ
特定の行動を取ると、キャラに「ジャンプステータス」が付く。一般に、略して「ジャンステ」と呼ばれる。
これが付くと、相手の下段が当たらない。たとえば、ライトゥーは、キックしつつジャンプしているので、相手のローキックなんかをジャンプでかわしながら攻撃できる技のひとつである。
ある瞬間、相手が下段を出してくると予想して、ジャンステ技であり浮かせ技でもあるライトゥーを行えば、ノーダメージで空中コンボに持ち込むことができる。
このため、「ライトゥーされると怖いので下段を出すのに躊躇する」という遠慮が生じる。あまりしゃがまない相手には下段が通るが、連発していると、読まれてライトゥーという大ダメージ確定技で反撃される恐れがある。それが下段最大のリスクである。
ジャンプしつつ出している技には「ジャンステ」効果がある。
まとめ表
自分\相手 | 立ち | しゃがみ | しゃがステの下段 | ジャンステの中段 |
---|---|---|---|---|
上段 | ガードされる | かわされる | 当てられる | 相打ち |
中段 | ガードされる | 当たる | 相打ち | 相打ち |
下段 | 当たる | ガードされる | 相打ち | 当てられる |
- 「相打ち」は、両者が同じ速さの攻撃を同じタイミングで出した場合に限る。(また、その場合であっても、両者の技のモーションの組み合わせによっては、「当たる」や「当てられる」に該当するような当たり判定になることがある)
- 「当てられる」とは、「自分の攻撃が当たらず、相手の攻撃が当たる」の意
硬直時間
鉄拳では、技を出すと、行動不能時間が発生する。たとえば、ジャブという技は、「腕を前に突き出し→戻す」というモーションとなっている。ジャブを行っている最中、とても短い間だが、そのキャラはジャブに専念しているので、しゃがんだり後退したりジャンプしたり他の技を出したりすることはできない。
この時間は一般に「硬直時間」と呼ばれる。
また、技を出したときだけではなく、ガードしたときでも硬直時間は発生する。
前提
硬直時間の基本は、以下となっている。
- 技を食らうと自分の硬直時間のほうが長くなる(不利)
- 技をガードすると自分の硬直時間のほうが短くなる(有利)
ガードすると有利になる技
基本的に、相手の技をガードしたとき、自分の硬直時間は、相手の硬直時間より短く、相手より先に動き始めることができる。
さらに、浮かせ技である右アッパーやライトゥー等は、ガードすると非常に有利になり、自分の硬直が解けたときにはまだ、相手は長い硬直時間に陥っており、この間にワンツーを確実に食らわせることができたりする。100% ダメージを与えられるこの行為は、一般に「確定反撃」略して「確反」と呼ばれている。
さまざまな確反を熟知している上級者相手に、浮かせ技のように強力な技をガードされると、確実な反撃が待っていると思っていい。
ガードすると不利になる技
しかし、中には、ガードすることで、自分の硬直時間が相手より長くなってしまうような技も存在する。実は、ほとんどのジャブがこれに該当する。
技によって、硬直時間の長短はさまざまであるが、どんなにこちらの硬直時間が長くなっても、「後退」や「しゃがみ」によるガードは可能である。「ぼっ立ち」によるガードはできないことがある。
こちらがガードしかできない間に相手が技を出してくる恐怖。よく使われるテクニックとして、「中段か下段の技をされる」というものがある。これへの対応としては、中段がきそうなら立ちガードをして、下段がきそうならしゃがみガードをするしかない。これは一般に「二択」と呼ばれる。
備考
ここに読み合いが発生する。ガードすると不利になる技を受けた相手は、二択を警戒してガードに徹するはずなので、ハッキリと視認できないまでもとんでもなく遅いモーションの技を邪魔されずに出すことができる。しかし、さらに相手がそれを読んで、硬直時間が切れた瞬間にモーションの速い技で潰してくる可能性もある。そして、さらにそれを読んで、普通に二択をすれば、確実にダメージを与えられる。等々。
その他
立つかしゃがむか前進か後退かジャンプ以外に、「横移動」というものもある。相手のあらゆる技をかわすことのできる行動だ。さらには、そうして横移動する相手を攻撃するための「ホーミングアタック」というジャンルの技もあり、ここにもまた読み合いが発生する。
その他、モーションキャンセルを多用することで高速にバックステップを繰り返す「山ステ」によって、相手の技をかわしてから、相手の硬直時間中に刺す「スカ確」という高等テクニックもある。胸元をつかまれた瞬間に、ある特定のボタンを押すことで「投げ抜け」ができるとか、下段された瞬間に、ある特定のボタンを押すことで「下段捌き」ができるとか、あるキャラの特定の技に対する特殊な対処方法があるとか、非常に多くの要素が鉄拳にはある。