私の問題は、文字列に含まれるものではなく、atoi が文字列の 16 進数のメモリ アドレスを 10 進数に変換していることです。マクロ中にこれを行っています。マクロ定義で int になっているのに、struct->member をポインターとして解釈するのはなぜですか? 以下の疑似コード:
if (struct.member == int)? struct.member = atoi(data) : struct.member = data;
プログラムのこのセクションの目的は、構造体の属性に関する情報を含む .csv ファイルからデータを取得することです。「id」を取得して、各セルの文字列を文字列の配列 (csvRowSplit) に格納できます。
ただし、配列の内容を、さまざまなデータ型 (プレーヤーの保存された属性、攻撃方法、ショップ アイテムなどを取得するために使用する方法) を含む構造体に転送したいと考えています。ハードコーディングするのは簡単です:
opponent->att = atoi(csvSplitRow[0]);
opponent->= atoi(csvSplitRow[1]);
opponent->hitpoints = atoi(csvSplitRow[2]);
opponent->description = csvSplitRow[3]);
ただし、これはより多くの構造体メンバーで混乱し、柔軟性や再現性があまりありません。
構造体の要素を循環するマクロを定義し、csvSplitRow[] を変数にペアにして、必要に応じて atoi で変換します。
#define X_FIELDS \
X(char*, description, "%s") \
X(int, xpreward, "%d") \
X(int, att, "%d") \
/* ... */
X(int, crit, "%d")
typedef struct
{
#define X(type, name, format) type name;
X_FIELDS
#undef
}
void update_opp(char** csvSplitRow, opp* opponent)
{
int i = 0;
#define X(type, name, format) \
if (strcmp(format, "%d") == 0) \ // if an int, convert it
opponent->name = atoi(csvSplitRow[i]); \
else \ // otherwise put it straight in
opponent->name = csvSplitRow[i]; \
i++;
X_FIELDS
#undef X
}
文字列メンバーへの直接代入は機能しますが (つまり、変換は行われません)、atoi を使用すると、16 進数のメモリ アドレスが、指している文字列ではなく整数に変換されます。
// before conversion
csvRowSplit[1] == 0x501150 "20"
// practice
atoi(csvRowSplit[1]) == 20
// after conversion and storing in struct int member
opponent->xpreward = atoi(csvSplitRow[1]);
opponent->xpreward == 5247312 // the decimal equivalent of 0x501150
解析された csv の行を構造と照合するたびにハードコードを実行する以外に、今何ができるかわかりません。助けてください!
編集: -Werror でコンパイル時エラーが発生します:
error: assignment makes integer from pointer without a cast [-Werror]
update_opp 関数のマクロ内にエラーがあります。ただし、以前に int であると定義したため、ポインターではないことはわかっていますか? では、なぜそれを認識しないのでしょうか。キャストできないので、どうすればいいですか?