よくあるエラー

よくあるエラー

# 一般的に

  • Gearsの場合は CbCで書いたファイルをPerlスクリプトで変換して、変換後のファイルがコンパイルされる
  • そのために自分が書いた.cbcなファイルと、生成された.cファイル、ヘッダファイルを見てエラーを考える必要がある
  • 他にはCファイルの問題もある

# 個別

# Gearef(cbc_context,char)

# 原因 1

  • CodeGearの引数を実装しているInteface/Interfaceの実装に無いフィールドを参照しているときに起こる
  • Gearefの第2引数はDataGear(context.hの中のunion Dataにかかれている構造体)でないとだめだが、charは無いので

# 解決方法

  • char* hogeなどを引数で渡していると考えられるので、これをInteface/InterfaceImplのfieldに追加する
    • headefileに書けばいい

# 原因 2

  • #interface "hoge.h"しているhoge.hgenerate_stub.pl側から参照できない
    • generate_stub中でPerlの if (-f $filename) でファイルを判定している為

# 解決方法

  • #interface以降のファイル名をmakeしているディレクトリからの相対パスで書く
    • ビルドしている.cbcと同じディレクトリの場合は省略可能

# Gearefの第2引数が空白になっている

# 原因

  • generate_stubで上手く生成できていない
  • generate_stubは現在実装しているinterfaceの名前をコンストラクタの関数名でキャプチャしている
    • Interface* createInterfaceImpl()
    • このInterface*に該当するものが、Intefaceの名前であり、 Gearefの第2引数になる

# 解決

  • 該当するコンストラクタを書く
    • コメントでも別に問題はない
  • 書かれたコンストラクタはextern.hに出力される

# __code next(...)が.cでも置換されてない/ stubで渡している変数の数が足りない

# 原因

  • 引数の型名を struct hoge* fooではなくて stuct hoge *fooにしているのが原因
  • *は必ず型名の方につける必要がある

# 解決

  • 生成されたcのstubのコードを見ながらポインタの位置がずれてそうな箇所を探す
    • 特定されたら修正する

# よくわからないGearefが生成されている

# 原因

  • 現状のgenerate_stubは //はCのコメントに対応していない
  • // goto hoge()みたいに書いてしまうと、コメントの外にGearefのマクロが出力されてしまう

# 対策

  • 複数コメントにしておく
1
2
3
/*
  goto hoge();
*/
Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy