2017-10-07 42 views
0

私はMassプログラムの中心を作成していますが、一般化しようとしていますが、3Dでのみ動作します。 3Dと質量の要素を持つ構造を使用する。型オブジェクトの変数の数は、私はユーザーではなく、私が定義したいと思います。しかし、私はループを使って変数を作成する方法を見つけることができません。たぶん別の方法があり、私はそれについて知らないだけかもしれません。ここではコードの例を示しますが、コード全体ではありませんが、すべての式で同じロジックです。forループで初期化する構造体

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

struct objects 
{ 
    int Xcdnt; 
    int Ycdnt; 
    int Zcdnt; 
    int Mass; 
}; 

int main() 
{ 

    int objectcount = 0; 
    int dimensioncount = 0; 

    printf("How many objects are there?"); 
    scanf(" %d", &objectcount); 

    printf("How many dimensions are used?"); 
    scanf(" %d", &dimensioncount); 

    for(int i = 0; i < objectcount; i++) 
    { 
     struct objects (i); 
    } 

    for(int i = 0; i < objectcount; i++) 
    { 
     printf("X coordinate is %d.\n", (i).Xcdnt); 
    } 

    return 0; 

} 

答えて

0

オブジェクトの配列をmallocする必要があります。あなたの現在のコードは、ちょうど、fooは、配列の名前をある

struct objects foo[objectcount]; 

を作成し、代わりにあなたのループで、あなたが書くでしょうオブジェクトの配列を作成するには、同じ1

struct objects* objects = malloc(objectcount * sizeof(struct objects)); 
for(int i = 0; i < objectcount; i++) 
{ 
    objects[i].Xcdnt = 42; 
    ..... 

} 
0

を破壊looops、およびobjectcountは、配列内にあるアイテムの数です。

次に、各要素にアクセスするためのコードは次のようになります。

for(int i = 0; i < objectcount; i++) 
{ 
    printf("X coordinate is %d.\n", foo[i].Xcdnt); 
} 

あなたが実際にそれをプリントアウトする前にfoo[i].Xcdntに値を代入するために、その前にいくつかの他のステップを持っている必要がありますが。

0

使用malloc関数は、動的に

struct objects* objs = malloc(sizeof *objs * objectcount); 

あなたはまた、次のようにローカル配列を作成することができ、アレイを作成するには:

struct objects objs[objectcount]; 

が、それはあまりにも大きいです場合は、スタックを爆破危険性があります。

1

これはCでメモリを扱う際の基本的な部分です。難しいことではありませんが、電球が点滅する前に友達にしなければならないことの1つです。 (注:あなたのコンパイラはC99可変長配列オブジェクトをサポートしている場合、あなたが代わりに動的に割り当てることで、それはここで扱われていないVLAを使用することができます)

次の3つのメモリを動的に割り当てるためのツール、malloccallocreallocを持っています。(callocmallocと同じことをしますが、ゼロにすべてのバイトを初期化 - 便利なあなたはすべてのメモリを確保したいときに初期化され、わずかにmallocより遅い)ご例えば

、あなたのオブジェクトに対して動的にメモリを割り当てることができ(ノート以下/* comments */における付加情報)を次のように

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

typedef struct { /* a typedef will do (and make things easier) */ 
    int xcdnt;  /* C generally uses all lowercase variable and */ 
    int ycdnt;  /* function names, avoiding MixedCase or  */ 
    int zcdnt;  /* camelCase, reserving all uppercase for  */ 
    int mass;  /* constants and macros.      */ 
} object; 

int main (void) { 

    int objectcount = 0; 
    int dimensioncount = 0; 
    object *objects = NULL; 

    printf ("How many objects are there?: "); 
    if (scanf (" %d", &objectcount) != 1) { /* validate ALL user input */ 
     fprintf (stderr, "error: invalid conversion or EOF.\n"); 
     return 1; 
    } 

    printf ("How many dimensions are used?: "); 
    if (scanf (" %d", &dimensioncount) != 1) { 
     fprintf (stderr, "error: invalid conversion or EOF.\n"); 
     return 1; 
    } 

    /* create objectcount objects using calloc */ 
    objects = calloc (objectcount, sizeof *objects); 

    if (!objects) { /* validate all memory allocations */ 
     fprintf (stderr, "error: virtual memory exhausted.\n"); 
     return 1; 
    } 

    /* create some random values */ 
    for (int i = 0; i < objectcount; i++) { 
     objects[i].xcdnt = i; 
     objects[i].ycdnt = i + 1; 
     objects[i].zcdnt = i + 2; 
     objects[i].mass = i % 10 + 5; 
    } 

    printf ("\ndimensioncount: %d\n\n", dimensioncount); 

    /* output the random data in objects */ 
    for (int i = 0; i < objectcount; i++) { 
     printf ("X coordinate is %d.\nY coordinate is %d.\n" 
       "Z coordinate is %d.\nmass is: %d\n\n", 
       objects[i].xcdnt, objects[i].ycdnt, objects[i].zcdnt, 
       objects[i].mass); 
    } 

    free (objects); /* don't forget to free the memory you allocate */ 

    return 0; 
} 

使用例/出力

$ /bin/dynamicobjects 
How many objects are there?: 10 
How many dimensions are used?: 3 

dimensioncount: 3 

X coordinate is 0. 
Y coordinate is 1. 
Z coordinate is 2. 
mass is: 5 

X coordinate is 1. 
Y coordinate is 2. 
Z coordinate is 3. 
mass is: 6 

<snip... objects[2-7]> 

X coordinate is 8. 
Y coordinate is 9. 
Z coordinate is 10. 
mass is: 13 

X coordinate is 9. 
Y coordinate is 10. 
Z coordinate is 11. 
mass is: 14 
あなたが動的にメモリを割り当てることを書くの任意のコードで

メモリ使用/エラーチェック

、あなたは、割り当てられたメモリの任意のブロックに関する2人の責任持っている:(1)は常に開始アドレスへのポインタを維持しメモリブロックのために、(2)は不要になったときに解放されます。

あなたが、メモリのあなたに割り当てられたブロックの境界外/越えて書き込もうと読み取ろうかベース初期化されていない値を使用して、条件付きジャンプをし、最終的にないことを保証するためのプログラムをチェックメモリエラーを使用することが不可欠です割り当てたすべてのメモリを解放することを確認します。

Linuxの場合valgrindが通常の選択です。すべてのプラットフォームに同様のメモリチェッカーがあります。それらはすべて使いやすく、プログラムを実行するだけです。

$ valgrind ./bin/dynamicobjects 
==9105== Memcheck, a memory error detector 
==9105== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al. 
==9105== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info 
==9105== Command: ./bin/dynamicobjects 
==9105== 
How many objects are there?: 10 
How many dimensions are used?: 3 

dimensioncount: 3 

X coordinate is 0. 
Y coordinate is 1. 
Z coordinate is 2. 
mass is: 5 

<snip... remaining> 

==9105== 
==9105== HEAP SUMMARY: 
==9105==  in use at exit: 0 bytes in 0 blocks 
==9105== total heap usage: 1 allocs, 1 frees, 160 bytes allocated 
==9105== 
==9105== All heap blocks were freed -- no leaks are possible 
==9105== 
==9105== For counts of detected and suppressed errors, rerun with: -v 
==9105== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) 

割り当てたすべてのメモリが解放され、メモリエラーがないことを常に確認してください。

ご質問がある場合は、私に連絡してください。

関連する問題