0

仮定: struct foo_t { int X,Y,Z; }. 一部の関数は、の配列を取り、struct foo_tそれにいくつかの値を設定します。このようなもの:

void foo(struct foo_t *f, size_t limit, size_t *result_length)
{
   int i = 0;
   struct foo_t a;
   a.X = 5;
   //...
   struct foo_t b;
   b.X = 10;
   // ...
   struct foo_t c;
   c.X = 4;
   //...
   f[i++] = a;
   f[i++] = b; 
   f[i++] = c;
   *result_length = i;
}

その後:

struct foo_t buf[12];
struct foo_t positive[12];
struct foo_t negative[12];
size_t len;
foo(buf, sizeof(buf)/sizeof(buf[0]), &len);
int c,positive_len,negative_len;
for(c = positive_len = negative_len = 0; c < len; c++) 
{
   if(buf[c].X < 8) 
      positive[positive_len++] = buf[c];
   else
      negative[negative_len++] = buf[c];
}

そして最後に:

puts("POSITIVE:");
int i;
for(i = 0; i < positive_len; i++)
   printf("%d\n", positive[i].X);
puts("NEGATIVE:");
for(i = 0; i < negative_len; i++)
   printf("%d\n", nagative[i].X);

問題は次のとおりです。取得する代わりに、取得し"POSITIVE:\n4\n5"ていて印刷されません。つまり、最後に設定された値のみです。なぜこうなった?実際の機能はデータベース管理などを含む約 300 行のコードであるため、ここで助けを得るためにコードを大幅に削減しました。本当に必要な場合は、ここに投稿します。= 演算子を使用する前は、構造体を正/負の配列にコピーしていました。"NEGATIVE:10"5 and 510memcpy()

4

4 に答える 4

1

コードにタイプミスがあります:

   struct foo_t c;
   b.X = 4; // this should be c.X = 4;
   //...
于 2012-11-30T04:07:46.487 に答える
1

いくつかのエラーがありました。一部はスペルミスで、「c」は「foo」関数に割り当てられません。

#include <stdlib.h>
#include <stdio.h>
#include <memory.h>

typedef struct foo_t
{
    int X, Y, Z;
}foo_t;

void foo(struct foo_t *f, size_t limit, size_t *result_length)
{
   int i = 0;
   struct foo_t a, b, c;
   a.X = 5;
   //...
   b.X = 10;
   // ...
   c.X = 4; // CHANGE HERE FROM "B" to "C".
   //...
   f[i++] = a;
   f[i++] = b; 
   f[i++] = c;
   *result_length = i;
}

int main(int argc, char** argv)
{

    // CORRECTED ALL SPELLING ERRORS!!! (POSITIVE / NEGATIVE)
    struct foo_t buf[12];
    struct foo_t positive[12];
    struct foo_t negative[12];
    size_t len;
    int c, positive_len, negative_len;

    foo(buf, sizeof(buf)/sizeof(buf[0]), &len);

    for(c = positive_len = negative_len = 0; c < len; c++) 
    {
       if(buf[c].X < 8) 
          positive[positive_len++] = buf[c];
       else
          negative[negative_len++] = buf[c];
    }

    { // <-- IGNORE THIS BADNESS
        int i;
        puts("POSITIVE:");

        for(i = 0; i < positive_len; i++)
           printf("%d\n", positive[i].X);
        puts("NEGATIVE:");
        for(i = 0; i < negative_len; i++)
           printf("%d\n", negative[i].X);
    }

    getchar();
}
于 2012-11-30T04:14:05.170 に答える
1

これは、コードから生成された SSCCE ( Short, Self-Contained, Complete Example ) です。

#include <stdio.h>

struct foo_t { int X; };

static void foo(struct foo_t *f, size_t limit, size_t *result_length)
{
   size_t i = 0;
   struct foo_t a;
   a.X = 5;
   struct foo_t b;
   b.X = 10;
   struct foo_t c;
   c.X = 4;
   if (i < limit)
       f[i++] = a;
   if (i < limit)
       f[i++] = b; 
   if (i < limit)
       f[i++] = c;
   *result_length = i;
}

int main(void)
{
    struct foo_t buf[12];
    struct foo_t positive[12];
    struct foo_t negative[12];
    size_t len;
    foo(buf, sizeof(buf)/sizeof(buf[0]), &len);
    size_t c,positive_len,negative_len;
    for (c = positive_len = negative_len = 0; c < len; c++) 
    {
        if (buf[c].X < 8) 
            positive[positive_len++] = buf[c];
        else
            negative[negative_len++] = buf[c];
    }

    puts("POSITIVE:");
    for (size_t i = 0; i < positive_len; i++)
        printf("%d\n", positive[i].X);
    puts("NEGATIVE:");
    for (size_t i = 0; i < negative_len; i++)
        printf("%d\n", negative[i].X);
}

以下を生成します。

POSITIVE:
5
4
NEGATIVE:
10

とに修正nagativeしなければなりませんでした。初期化しました。以前はオーバーフローがないようにしていました(そして警告を修正しました)。さまざまなカウンター変数を変更して、符号付きと符号なしの比較に関する警告を回避しました。Y メンバーと Z メンバーは、この最小限の例では使用されていないため、構造体から削除しました。negativepostivepositivec.Xlimitintsize_t

于 2012-11-30T04:14:15.530 に答える
1

上記の例には、2 つのタイプミス/バグがあります。

  1. あなたはcを設定していません

    struct foo_t c;

    bX = 4;

  2. この printf の変数のスペルが間違っています

    for(i = 0; i < 負の長さ; i++)

    printf("%d\n", 負[i].X);

于 2012-11-30T04:09:51.670 に答える