0

私はCを初めて使用しますが、現在、必要なことを行う方法がわからないプロジェクトに取り組んでいます。

私は 2 つの異なる構造体配列を持っていますが、それらは完全に異なって定義されており、PHP の array_pop と同じアクション、つまり配列構造の最後の要素を削除しようとしています。

構造型ごとに 1 つずつ、2 つの個別の関数を作成できることはわかっていますが、明らかに最良のアイデアではないため、いずれかの構造型を 1 つの関数に渡すことができるかどうか疑問に思っています。キャストする必要がある構造のタイプを決定します。

私の構造は次のように定義されています

typedef struct CallLogSearchResultStruct
{
    long date;
    int dRowIndex;
} callLogSearchResultStruct;

typedef struct CallLogSearchDataStruct
{
    char * date;
    char * time;
    char * bParty;
    char * aParty;
    float duration;
    char * cleardownCause;
    struct CallLogSearchOutboundStruct * outboundLegs;
} callLogSearchDataStruct;

以下は、構造がどのように初期化されるかです

callLogSearchData = calloc(numRows, sizeof(callLogSearchDataStruct));
callLogSearch = calloc(numRows, sizeof(callLogSearchResultStruct));

numRows配列内に含まれる構造体の数です。

以下は、私が構造をどのように使用しているかです

callLogSearchData[dataRow].aParty = NULL;
callLogSearchData[dataRow].bParty = NULL;
callLogSearchData[dataRow].cleardownCause = NULL;
callLogSearchData[dataRow].date = NULL;
callLogSearchData[dataRow].time = NULL;
callLogSearchData[dataRow].outboundLegs = NULL;

これが単純で率直な答えである場合はお詫び申し上げます。Googleで何も見つけることができませんが、これが何と呼ばれるか完全にはわからないため、間違ったキーワードを使用している可能性があります。

ご協力いただきありがとうございます。

4

3 に答える 3

1

「取り除く」とはどういう意味ですか?配列はどのように割り当てられますか?

次のような宣言によって作成された配列がある場合:

struct foo my_foos[123];

my_foos123 要素の長さという事実を変更するためにできることは何もありません。もちろん、別のsize_t foo_count変数を維持することで、それらのいくつかを無視することを選択できます。

C の配列は一般に動的ではありません (より多くの高級言語のリスト/配列とは異なります)。を使用して動的配列を実装できますmalloc()。これはそれほど難しくありませんが、それがあなたが行ったことかどうかは不明です。

于 2013-10-07T14:34:58.497 に答える
0

必要なのは、実際にはリンクされたリストです。これは、それぞれがリストの N 番目の要素と次の要素を指す構造体のコレクションです。そうすれば、チェーン内のリンクを解除することで、要素を簡単に削除できます。C でリンクされたリスト lib をグーグル検索するか、1 つ実装することができます (これは良い演習です)。C の配列は、要素に十分なスペースしかない静的メモリ範囲です。これ以上何もない。通常、1 つの要素を削除することはできません。ただし、realloc 関数を使用して既存の配列のサイズを変更することはできます。あなたがやろうとしていることについては、リンクされたリストに行きます。

于 2013-10-07T15:05:35.093 に答える