2017-06-28 4 views
-9

私は問題が何かを考え出したと思います.Cは臭いです。これは、局所的に宣言されたポインタを一方向に扱い、ポインタを別のものとして渡します。これは、questionへの回答です。数日前に投稿しました。私はそこに投稿しようとしましたが、プログラムは適合しませんでした。ポインタを増分しても、配列として扱うのはなぜ失敗するのですか?パート2

私はあなたの質問が何であるかわからないんだけど、このコードはおそらく、あなたがやりたいことはありません
// Test arrays and pointers 

#include <stdio.h> 
// #include <string.h> 

#define EOL "\n" 

typedef struct 
{ 
    int useless1; 
    int useless2; 
} type1; 

void function1(char* s) 
{ 
    printf("Pointer to string. "); 
    while (*s) 
     putchar(*s++); 

    printf(EOL); 
} 

void function2(char* s) 
{ 
    int i=0; 
    printf("Index into string. "); 
    while (s[i]) 
     putchar(s[i++]); 

    printf(EOL); 
} 

void functionX1(type1* p, int count) 
{ 
    printf("Pointer to struct." EOL); 
    for (int i=0; i<count; i++) 
    { 
     printf("index: %d useless1: %d" EOL, i, p->useless1); 
     printf("index: %d useless2: %d" EOL, i, p->useless2); 
     p++; 
    } 
    printf(EOL); 
} 

void functionX2(type1* p, int count) 
{ 
    printf("Index into array of structures." EOL); 
    for (int i=0; i<count; i++) 
    { 
     printf("index: %d useless1: %d" EOL, i, p[i].useless1); 
     printf("index: %d useless2: %d" EOL, i, p[i].useless2); 
    } 
    printf(EOL); 
} 

void getptr1(char* s, char** ss) 
{ 
    *ss = s; 
} 

void getptr2(type1* ptr, type1** pptr) 
{ 
    *pptr = ptr; 
} 

int main(int argc, char** argv) 
{ 
// Work with strings of characters 

    char* s; 

    function1(argv[0]); 
    function2(argv[0]); 
    function1(*argv ); 
    function2(*argv ); 

    getptr1(argv[0], &s); 
    function1(  s); 
    function2(  s); 

    printf("main Pointer to string. "); 
    while (*s) 
     putchar(*s++); 
    printf(EOL); 

    int i=0; 
    printf("main Index into string. "); 
    while (s[i]) 
     putchar(s[i++]); 
    printf(EOL); 

// Work with array of structures 
    #define count 3 

    type1 a[count]; 

    int x1 = 123; 
    int x2 = 789000; 
    int kx = 111; 

    for (int i=0; i<count; i++) 
    { 
     a[i].useless1 = x1; 
     a[i].useless2 = x2; 
     x1 += kx; 
     x2 += (kx * 1000); 
    } 

// functions1(&a , count);  Fail 
// functions2(&a , count);  Fail 
    functionX1(&a[0], count); 
    functionX2(&a[0], count); 
    functionX1(a , count); 
    functionX2(a , count); 

    type1* b; 

    getptr2(a, &b); 
    functionX1(b , count); 
    functionX2(b , count); 

    printf("main Pointer to struct." EOL); 
    for (int i=0; i<count; i++) 
    { 
     printf("index: %d useless1: %d" EOL, i, b->useless1); 
     printf("index: %d useless2: %d" EOL, i, b->useless2); 
     b++; 
    } 
    printf(EOL); 

    printf("main Index into array of structures." EOL); 
    for (int i=0; i<count; i++) 
    { 
     printf("index: %d useless1: %d" EOL, i, b[i].useless1); 
     printf("index: %d useless2: %d" EOL, i, b[i].useless2); 
    } 
    printf(EOL); 
} 
+2

あなたの質問は何ですか?:

はこのような何かを考えてみましょうか – smarx

+0

あなたの以前の質問へのリンクを追加してください。それは理解するのが一層役立ちます。 – LinuxStuff

+2

Cは臭いですか?あなたはそれをタグの説明に追加する必要があります – CIsForCookies

答えて

2

printf("main Pointer to struct." EOL); 
for (int i=0; i<count; i++) 
{ 
    printf("index: %d useless1: %d" EOL, i, b->useless1); 
    printf("index: %d useless2: %d" EOL, i, b->useless2); 
    b++; 
} 
printf(EOL); 

printf("main Index into array of structures." EOL); 
for (int i=0; i<count; i++) 
{ 
    printf("index: %d useless1: %d" EOL, i, b[i].useless1); 
    printf("index: %d useless2: %d" EOL, i, b[i].useless2); 
} 
printf(EOL); 

最初のループはbの値を変更するので、第二のループのdoesnあなたが思っているところから始めなさい。

type1* bOrig = b; // store the original value 
printf("main Pointer to struct." EOL); 
for (int i=0; i<count; i++) 
{ 
    printf("index: %d useless1: %d" EOL, i, b->useless1); 
    printf("index: %d useless2: %d" EOL, i, b->useless2); 
    b++; 
} 
printf(EOL); 
b = bOrig; // restore the original value 

printf("main Index into array of structures." EOL); 
for (int i=0; i<count; i++) 
{ 
    printf("index: %d useless1: %d" EOL, i, b[i].useless1); 
    printf("index: %d useless2: %d" EOL, i, b[i].useless2); 
} 
printf(EOL); 
+0

はい、申し訳ありません。私はオリジナルの質問へのリンクが助けになると思ったが、このコードを説明していない。 –

+0

このプログラムは、ポインタをポインタまたは配列として扱うことができますが、場合によってはそうすることができない場合があることを示しています。プログラムを実行すると、最後の文字列の例( 'main index into string')と最後の構造体の例( "構造体の配列へのメインインデックス")の2つのインスタンスを除くすべての結果は同じです。これらの2つのインスタンスはデータを配信できません。だから私の質問は、なぜこれらの2つの例は失敗ですか?私が見ることのできる唯一の違いは、2つの失敗のコードが、本体にあり、ポインターが関数に含まれる代わりに宣言されていることです。 –

+0

私の前のコメントは無視してください。私はこのプログラムが私の元の問題を立証したと思ったが、私はエラーを出したので失敗した。だから絵画板に戻って。 –

関連する問題