0

Java には数年の経験がありますが、C にはまだ慣れていません。ポインタをいつ、いつ使用しないかを理解するのにまだ苦労しています。この基本コードが与えられたので、「プッシュ」メソッドを終了して次の要素をスタックにプッシュする必要がありますが、次のエラーが表示されます。

構造体ではないメンバー 'top' の要求。

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

int exit_status = EXIT_SUCCESS;
#define EMPTY (-1)
#define SIZE 16

typedef struct stack stack;
   struct stack {
   int top;
   double numbers[SIZE];
};

void push (stack *the_stack, double number) {
    if(&&the_stack.top>=SIZE-1){
       printf("error");
    }else{
       the_stack.numbers[&&the_stack.top++ ] = number;
    }
}
int main (int argc, char **argv) {
  if (argc != 1) {
     fprintf (stderr, "Usage: %s\n", basename (argv[0]));
     fflush (NULL);
     exit (EXIT_FAILURE);
  }
stack the_stack;
the_stack.top = EMPTY;
char buffer[1024];
for (;;) {
   int scanrc = scanf ("%1023s", buffer);
   if (scanrc == EOF) break;
   assert (scanrc == 1);
   if (buffer[0] == '#') {
     scanrc = scanf ("%1023[^\n]", buffer);
     continue;
  }
  char *endptr;
  double number = strtod (buffer, &endptr);
  if (*endptr == '\0') {
     push (&the_stack, number);
  }else if (buffer[1] != '\0') {
     bad_operator (buffer);
  }else {
     do_operator (&the_stack, buffer);
  }
}
 return exit_status;
}

私は非常に基本的なものを見落としていますか?

4

2 に答える 2

1

構造体のメンバーにアクセスする場合、2 つの演算子があります。.非ポインター構造体に使用されるドット演算子と、構造->体へのポインターに使用される「矢印」演算子です。

関数内に構造体へのポインターがあるpushため、「矢印」演算子を使用する必要があります。


関数内の二重アンパサンドなど、コードには他の問題がありますpush。また、プログラムを終了するときにファイルをフラッシュする必要はありません。ランタイムがそれを行います。

于 2013-10-21T05:56:34.263 に答える
0
It seems very clearly that you have less experience in C. There are lots of compile time errors in your code like for example : 

プッシュ関数では、トップと数値を次のように呼び出す必要があります。 the_stack->top the_stack->numbers[]
ポインター変数のメンバーを呼び出すには、矢印が使用されます。

Java との比較: Java はポインタではなく参照のみを使用します。しかし内部的には、メモリ内のある場所を指しています。

https://www.dropbox.com/s/qfk86yb3drdlmz2/C%20to%20Java.JPG 画像 http://erikdemaine.org/papers/CPE98/paper.pdf

このリンクをチェックして、C コードと Java コードを関連付けてください。

于 2013-10-21T06:21:53.730 に答える