2011-08-01 46 views
0

我有以下代码,并在第68行,我得到一个格式错误。 stack.c:68: warning: format ‘%e’ expects type ‘float *’, but argument 3 has type ‘double *’C段错误,不知道是怎么回事

在输入push 4上,它得到一个段错误。不知道他们是否有关系。请帮忙!

#include <stdio.h> 
#include <stdlib.h> 
#define OFFSET '0' 
#define DIM1 7 
#define DIM2 5 
#define RES_SIZE 1000 

//typedef double double; 

typedef struct { 
    double *contents; 
    int maxSize; 
    int top; 
} stackT; 

void StackInit(stackT *stackP, int maxSize) { 
    double *newContents; 
    newContents = (double *)malloc(sizeof(double)*maxSize); 
    if (newContents == NULL) { 
     fprintf(stderr, "Not enough memory.\n"); 
     exit(1); 
    } 

    stackP->contents = newContents; 
    stackP->maxSize = maxSize; 
    stackP->top = -1; 
} 

void StackDestroy(stackT *stackP) { 
    free(stackP->contents); 
    stackP->contents = NULL; 
    stackP->maxSize = 0; 
    stackP->top = -1; 
} 

int StackIsEmpty(stackT *stackP) { return stackP->top < 0; } 

int StackIsFull(stackT *stackP) { return stackP->top >= stackP->maxSize-1; } 

void StackPush(stackT *stackP, double element) { 
    if(StackIsFull(stackP)) { 
     fprintf(stderr, "Can't push element: stack is full.\n"); 
     exit(1); 
    } 
    stackP->contents[++stackP->top] = element; 
} 

double StackPop(stackT *stackP) { 
    if(StackIsEmpty(stackP)) { 
     fprintf(stderr, "Can't pop element: stack is empty.\n"); 
     exit(1); 
    } 
    return stackP->contents[stackP->top--]; 
} 

void StackShow(stackT *stackP) { 
    int i; 
    printf("[ "); 
    for (i = 0; i < stackP->top - 1; i++) { 
     printf("%e, ", stackP->contents[i]); 
    } 
    printf("%e ]\n", stackP->contents[stackP->top - 1]); 
} 

double shell(char* s1, double arg) { 
    printf("> "); 
    scanf("%s %f%*c", s1, &arg); 
    return arg; 
} 

int main() { 
    //char cmds[DIM1][DIM2] = {{"push"}, {"pop"}, {"add"}, {"ifeq"}, {"jump"}, {"print"}, {"dup"}}; 
    stackT res; 
    StackInit(&res, RES_SIZE); 
    char cmd[DIM2]; double arg = 0; 
    arg = shell(cmd, arg); 
    if (StringEqual(cmd, "push")) { 
     StackPush(&res, arg); 
     StackShow(&res); 
    } 
} 
+0

错误消息的含义正是它所说的。你不能使用'double'变量和'float'格式说明符。使用“%lf”。在StackShow中还有一个错误的错误,而且你忽略了堆栈可能为空的事实。 –

+0

我在68上将它改为'%lf',segfault仍然存在,StackShow有什么问题? – tekknolagi

+0

您是否尝试过在调试器中运行代码?它会马上给你答案... –

回答

2

刚刚看过你的代码,我认为推动第一个元素后,你的栈顶指针被设置为0。要从这个线访问一个无效的内存位置 现在你StackShow()方法:

printf("%e ]\n", stackP->contents[stackP->top - 1]); // accessing invalid location stackP->contents[-1] 

这是为所述阵列的内容的off-by-one error

1

我只是看了一眼......在stackShow()方法中的最后一行似乎是问题所在。除此之外,我认为你应该自己去调试一下,一个起点是贯穿你的程序,看看1个元素的索引是什么。

1

编辑:kakira和CodeBuzz是正确的。您的段错误来自StackShow。我在下面指出的错误将导致arg设置不正确,但它不会导致您的段错误。


你的编译器告诉你问题是什么。你的scanf期望一个指向浮点的指针,但是你给出了一个指向double的指针。在Linux上,你可以指定double to scanf为%lf,但是如果你的编译器需要%e,那就试一试。

您也有问题,因为您打电话shell的值为arg而不是其地址。您在scanf中给出arg的地址,但您所做的只是将值存入该子例程的局部变量中。你应该做更多的东西一样:

void shell(char *s1, double *arg) 
{ 
    scanf("%s %lf%*c", s1, arg); 
} 

main() 
{ 
    ... 
    double arg; 
    shell(cmd, &arg); 
} 

这样一来,scanf填充你传递它的arg,你不也需要返回值。如果您宁愿继续单独返回该值,则不要将其传入,因为它只会混淆问题。例如:

double shell(char *s1, double *arg) 
{ 
    double arg; 
    scanf("%s %lf%*c", s1, &arg); 
    return arg; 
} 

main() 
{ 
    ... 
    double arg; 
    arg = shell(cmd); 
} 
相关问题