2016-06-14 2 views
0

複数の異なる関数で使用する必要がある構造体定義がある。私の構造体定義では、サイズ "len"の配列を持ち、このlen変数はargv [1]の文字列の長さです。ご覧のように、私はこの変数が必要ですが、mainの外にstruct定義を置くことはできません。そうでなければ、その変数は失われます。しかし、私はそれを私の関数のプロトタイプの前に置く必要があります。この問題の解決策は何ですか?ここに私のコードはあります:関数プロトタイプの前に構造体定義を置くが、構造体はargvからの情報を必要とする

void randomize(type_darwin *darwin, type_monkey *monkey); 

int main(int argc, char *argv[]) 
{ 
    if (argc < 2) 
    { 
     printf("Error! Arguments are of form: ./%s [string to parse]\nBe sure your string is surrounded by double quotes.\n", argv[0]); 
     return 0; 
    } 

    int len = strlen(argv[1]);    // length of string 
    const char *string = argv[1];   // make string a constant 

    // define two structs, one for the Darwinian algorithm and one for the monkey bashing algorithm 
    // lock determines whether that element in sentence is locked (in programming terms, if it should now be a constant) 
    typedef struct darwin 
    { 
     char sentence[len]; 
     int lock[len]; // 0 defines not locked. Nonzero defines locked. 
    } type_darwin; 

    typedef struct monkey 
    { 
     char sentence[len]; 
     int lock; // 0 defines entire array not locked. Nonzero defines locked. 
    } type_monkey; 
+0

VLAは、とにかく 'struct'では使用できません。 – Olaf

+0

いずれにしても、ターミネーターを許可するには 'char sentence [len + 1];'のようにもう1つ必要です。 –

+0

@WeatherVane argv引数にヌルターミネータが含まれていませんか? strlnを使ってargv [1]の引数のサイズを調べました。ターミネーターは含まれていませんか? – LTClipp

答えて

3

構造は、このようにして一貫したコンパイル時の定義を持つ必要があります。静的配列の代わりにポインタを使用し、配列のためのスペースを動的に割り当てる方がよいでしょう。その後、構造体の長さ部分を作成する必要があります。

typedef struct darwin 
{ 
    int len; 
    char *sentence; 
    int *lock; // 0 defines not locked. Nonzero defines locked. 
} type_darwin; 

typedef struct monkey 
{ 
    int len; 
    char *sentence; 
    int lock; // 0 defines entire array not locked. Nonzero defines locked. 
} type_monkey; 


int main(int argc, char *argv[]) 
{ 
    if (argc < 2) 
    { 
     printf("Error! Arguments are of form: ./%s [string to parse]\nBe sure your string is surrounded by double quotes.\n", argv[0]); 
     return 0; 
    } 

    int len = strlen(argv[1]);    // length of string 
    const char *string = argv[1];   // make string a constant 

    type_darwin my_darwin; 
    my_darwin.len = len; 
    my_darwin.sentence = malloc(len + 1); 
    my_darwin.lock = malloc((len + 1) * sizeof(int)); 

    type_monkey my_monkey; 
    my_monkey.len = len; 
    my_monkey.sentence = malloc(len + 1); 

    ... 

} 
+0

お返事ありがとうございます。 1つの質問ですが、mallocの文章はlen * sizeof(char)ではないでしょうか? – LTClipp

+0

'sizeof(char)'は定義によって '1'です。 –

+0

@ WedeVane本当ですか?興味深いことに、私はそれを知らなかった。しかし、それは理にかなっていますが、ASCII文字を表すのに1バイトしか必要ありません。 – LTClipp

関連する問題