ジェネリックスタックを構築しようとしていますが、ポップアップメソッドが間違っているように見えるので、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);
}
OPはコンパイラ拡張を使用しています。 – 2501
@ 2501の場合、これらの拡張は 'void *'と 'char *'の対応になりますか? –
https://gcc.gnu.org/onlinedocs/gcc/Pointer-Arith.html – 2501