2

私の大学はJavaに取りつかれているように見えるので、私はCを独学しているので、int型のスタック実装を書いています(後でジェネリックにするのは心配です)。意味のわからないエラーに遭遇しましたmissing ';' before 'type'。私の構文が正しいと言える限り、そうでない場合は教えてください。とにかくここに私のコードがあります:

stack.h

typedef struct{
    int *elements;
    int size;
    int capacity;
}Stack;

void newStack(Stack *s);
void delStack(Stack *s);
void pushToStack(Stack *s, int value);
int popFromStack(Stack *s);

stack.c

#include "stack.h"
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>

void newStack(Stack *s){
    s->size = 0;
    s->capacity = 4;
    s->elements = (int*) malloc(4 * sizeof(int));

    assert(s->elements != NULL); // allocation worked?
}

void delStack(Stack *s){
    free(s->elements);
}

void pushToStack(Stack *s, int value){
    if(s->size == s->capacity){
        s->size *= 2;
        s->elements = (int *) realloc(s->elements, s->size * sizeof(int));

        assert(s->elements !=NULL); //reallocation worked?
    }
    s->elements[s->size] = value;
    s->size++;
}

int popFromStack(Stack *s){
    assert(s->size>0);
    s->size --;
    return s->elements[s->size];
}

int main()
{
    Stack s1;
    newStack(&s1);
    int i;
    for(i=0; i<3; i++){
        pushToStack(&s1, i);
        printf("%d ", i);
    }
        printf("\n");
    for(i=0; i<3; i++){
        printf("%d ", popFromStack(&s1));
    }

    delStack(&s1);

    getchar();
    return 0;
}

エラーは行のメインで発生しますが、int i;行を上に移動するとエラーはなくなり、プログラムは問題なく実行されます。理由を知りたいです。

エラーの原因:

    newStack(&s1);
    int i;

エラーなし:

    int i;
    newStack(&s1);

PS:念のため、MS Visual Studio 2010 を使用しています。

4

3 に答える 3

8

Visual Studio は、1998 年より前のどこかでタイム ループに陥っています。当時の標準では、すべての宣言をブロックの先頭に配置する必要がありました。

これは C99 で変更され、MS は最も一般的な機能をサポートしていると言っています。残念ながら、これはそれらの 1 つではありません。

于 2012-08-19T21:49:05.817 に答える
1

C では、スコープの先頭ですべての変数を宣言する必要があります。したがって、呼び出しi後に宣言することはできません。newStack

于 2012-08-19T21:49:01.697 に答える
1

C89 では、宣言はスコープの先頭で行われるため、他の関数呼び出しの前に行われます。

ただし、この制限は C99 で削除されました。

于 2012-08-19T21:50:24.753 に答える