1

LMlib.h

#ifndef LMlib_H
#define LMlib_H
#endif

#define MAX_IP_LENGTH 15         
#define MAX_TABLE_ROWS 255

struct ForwardingTableRow
{
        char address[MAX_IP_LENGTH];
        int subnetMask;
        int interface;
};

typedef struct ForwardingTableRow ForwardingTableRow;

LMlib.c

#include <stdio.h>
#include <math.h>
#include "LMlib.h"

void ReadForwardingTable(FILE* f,ForwardingTableRow * table)
{
        int i;
        for(i=0;i<MAX_TABLE_ROWS;i++)
        {
                fscanf(f,"%s %d %d",&table.address[i],&table.subnetMask[i],&table.interface[i]);
        }


}

コンパイラ コマンド:

cc LMlib.c LMlib.h main.c -lm

エラー:

LMlib.c: In function ‘ReadForwardingTable’:
LMlib.c:11:27: error: request for member ‘address’ in something not a structure or union
LMlib.c:11:45: error: request for member ‘subnetMask’ in something not a structure or union
LMlib.c:11:66: error: request for member ‘interface’ in something not a structure or union

私は何を間違えましたか?

4

2 に答える 2

7

3つの問題があります。1つは、配列のインデックスを適切に使用していないことです。構造体のメンバーではなく、配列であるのはtable変数です。

fscanf(f, "%s %d %d",
    table[i].address,
    &table[i].subnetMask,
    &table[i].interface);

2番目の問題はあなたの質問とは関係ありませんが、将来的に問題を引き起こす可能性があります。それはあなたが持っているインクルードガードです。はファイルの最後#endifにある必要があります。そうでない場合は、単一のファイルのみを保護し、他には何も保護しません。#define

3番目の、そして最も深刻な問題は、addressフィールドに1人のキャラクターがいることです。IPアドレスの最大長は15です。これは正しいですが、文字列として扱いたい場合は、文字列ターミネータ用のスペースも必要です。次のように宣言します

address[MAX_IP_LENGTH + 1];

そしてそれは大丈夫なはずです。

于 2012-11-07T14:39:09.110 に答える
0

演算子の優先順位がすべてです。.よりも優先順位が高い&ため、基本的に次のようになります。

  &(table.address)[i]

構造体でtableはなく、構造体へのポインタです。次に、インデックス付けが間違っています。配列ではなく、構造体のメンバーにインデックスを付けています。

次のように書き直します。

  table[i].address
于 2012-11-07T14:39:36.057 に答える