2016-11-14 4 views
1

ジェネリックスタックを構築しようとしていますが、ポップアップメソッドが間違っているように見えるので、100から1への数値と1の倍数が表示されます。私はこの溶液にポップ方法を変更した場合 :Generic Stacks in Cそれは64にポップしてからちょうど64回0ジェネリックスタックはポップ値を停止します

構造体:

typedef struct { 
    void *elems; 
    int elemSize; 
    int logLength; 
    int allocLength; 
    void (*freefn)(void*); 
} genStack; 

C-ソースファイル:

#include "genstacklib.h" 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <assert.h> 

void GenStackNew(genStack *s, int elemSize, void(*freefn)(void *)) { 
    s->elemSize = elemSize; 
    s->elems = malloc(4 * s->elemSize); 
    if (s->elems == NULL) { 
     perror("\n\nError: "); 
    } 
    s->allocLength = 4 * s->elemSize; 
    s->logLength = 0; 
    s->freefn = freefn; 
} 

void GenStackDispose(genStack *s) { 
    if (s->elems == NULL) { 
     printf("\n\nStack is not initialized!\n\n"); 
     return; 
    } 
    /*if (s->freefn != NULL) { 
     int n = 0; 
     while (s->logLength != 0) { 
      freefn(s->elems + n * s->elemSize); 
      n++; 
     } 
    }*/ 
    free(s->elems); 
} 

bool GenStackEmpty(const genStack *s) { 
    if (s->logLength == 0) { 
     return true; 
    } else { 
     return false; 
    } 
} 

void GenStackPush(genStack *s, const void *elemAddr) { 
    if (s->elems == NULL) { 
     printf("\n\nStack not initialized!\n\n"); 
     return; 
    } 
    if (s->allocLength == s->logLength * s->elemSize) { 
     s->allocLength = 2*s->allocLength; 
     s->elems = realloc(s->elems, s->allocLength*s->elemSize); 
    } 
    memcpy(s->elems+s->logLength*s->elemSize,elemAddr,s->elemSize); 
    s->logLength++; 
} 

void GenStackPop(genStack *s, void *elemAddr) { 
    void *source = s->elems + (s->logLength-1)*s->elemSize; 
    memcpy(elemAddr,source,s->elemSize); 
    memcpy(s->elems,source,s->elemSize); 
    s->logLength--; 
    //memcpy((char*)s->elems+(s->logLength-1)*s->elemSize,elemAddr,s->elemSize); 
} 

テストスタック(数字を0から100にプッシュしてからポップする必要があります):

int main(int argc, char *argv[]) { 

    int val; 
    genStack IntegerStack; 

    GenStackNew(&IntegerStack, sizeof(int), NULL); 
    for (val = 0; val < 100; val++) { 
     GenStackPush(&IntegerStack, &val); 
     printf("Pushed: %d\n",val); 
    } 

    while(!GenStackEmpty(&IntegerStack)){ 
     GenStackPop(&IntegerStack, &val); 
     printf("Popped: %d\n",val); 
    } 

    GenStackDispose(&IntegerStack); 
} 

答えて

1

GenStackPop機能における第二のmemcpy呼び出しは冗長なようで、最初の要素壊したが、何もしません:

memcpy(s->elems,source,s->elemSize); 
1

まあ、私は必要なときvoid *の大きさが知られていないことをコンパイラの警告を取得します。あなたはs->elemsに、ポップで+を使用するよう

memcpy(s->elems+s->logLength*s->elemSize,elemAddr,s->elemSize); 

:これが中occurrs。

struct宣言のvoid *elems;char *elems;に変更しても問題ありません。

+0

OPはコンパイラ拡張を使用しています。 – 2501

+0

@ 2501の場合、これらの拡張は 'void *'と 'char *'の対応になりますか? –

+0

https://gcc.gnu.org/onlinedocs/gcc/Pointer-Arith.html – 2501

関連する問題