Возникает ошибка, в которой говорится, что неопознанные функции «push», «pop» и «display», что мне добавить, чтобы это исправить? - PullRequest
0 голосов
/ 14 апреля 2010
#include<stdio.h>

#include<iostream.h>
#include<conio.h>
#include<stdlib.h>(TOP)
#include<fstream.h>

#define MAX 5

int top = -1;
int stack_arr[MAX];

main()
{
int choice;
while(1)
{
printf("1.Push\n");
printf("2.Pop\n");
printf("3.Display\n");
printf("4.Quit\n");
printf("Enter your choice : ");
scanf("%d",&choice);
switch(choice)
{
case 1 :
push();
break;
case 2:
pop();
break;
case 3:
display();
break;
case 4:
exit(1);
default:
printf("Wrong choice\n");
}/*End of switch*/
}/*End of while*/
}/*End of main()*/

push()
{
int pushed_item;
if(top == (MAX-1))
printf("Stack Overflow\n");
else
{
printf("Enter the item to be pushed in stack : ");
scanf("%d",&pushed_item);
top=top+1;
stack_arr[top] = pushed_item;
}
}/*End of push()*/

pop()
{
if(top == -1)
printf("Stack Underflow\n");
else
{
printf("Popped element is : %d\n",stack_arr[top]);
top=top-1;
}
}/*End of pop()*/

display()
{
int i;
if(top == -1)
printf("Stack is empty\n");
else
{
printf("Stack elements :\n");
for(i = top; i >=0; i--)
printf("%d\n", stack_arr[i] );
}
}/*End of display()*/

Ответы [ 3 ]

2 голосов
/ 14 апреля 2010

Вы должны либо объявить следующие функции перед main:

void push();
void pop();
void display();

или переместите фактические объявления выше основного.

0 голосов
/ 14 апреля 2010

Было бы действительно помочь, если бы вы сказали нам, какой компилятор вы используете, и сообщение об ошибке точный , которое он вам дал. Также было бы полезно, если бы вы немного отформатировали свой код (хотя этот конкретный фрагмент небольшой и достаточно простой для чтения).

Итак, здесь происходит несколько вещей. Во-первых, если вы не ввели явно определение функции, предполагается, что эта функция возвращает int (то есть функция неявно напечатана int). Таким образом, предполагается, что main, push, pop и display возвращают int. Это очень архаичный и хмурый стиль, и IINM запрещен в соответствии со стандартом C99. Поскольку push, pop и display не возвращают значение вызывающей стороне, они должны быть явно напечатаны void. main должен быть явно набран int (обсуждается ниже).

Во-вторых, если компилятор не видит объявление или определение функции до того, как он увидит вызов функции, он будет считать, что функция возвращает int. Это может привести к ошибке несоответствия типов, если позже вы определите функцию с другим типом возвращаемого значения, например:

int main(void)
{
  ...
  foo();
  ...
}

void foo(void) { ... }

Когда компилятор видит вызов foo() в main(), он предполагает, что foo() вернет int, но затем более позднее определение противоречит этому предположению, поэтому он выдает диагностику.

Урок здесь заключается в том, что вы должны как минимум объявить свои функции перед тем, как вызывать их, например:

int main(void)
{
  void push();
  void pop();
  void display();
  ...
  push();
  ...
  pop();
  ...
  display();
  ...
}

void push(void) { ... }
void pop(void) { ... }
void display(void) { ... }

и убедитесь, что объявление и определение совпадают. Лично я следую правилу «определить перед использованием», вот так:

void push(void) { ... }
void pop(void) { ... }
void display(void) { ... }

int main(void)
{
  ...
  push();
  ...
  pop();
  ...
  display();
}

Таким образом, вам не нужно беспокоиться о синхронизации объявлений и определений.

Об определении main: Стандарт C определяет ровно два интерфейса для main:

int main(void); 
int main(int argc, char *argv[]); 

Отдельные реализации может определять дополнительные интерфейсы для main; некоторые добавляют третий параметр, например, так:

int main(int argc, char *argv[], char *env[]);

Ваше определение main должно соответствовать одной из двух форм, указанных в стандарте, или одной из форм, указанных в документации для вашего конкретного компилятора, иначе поведение программы будет undefined (что может означать что-либо, начиная от запуска, как ожидалось, сбой немедленно или запуск до завершения, но оставляя систему в плохом состоянии, или что-то еще полностью). Есть несколько авторов, которые настаивают на том, что если вам не нужно возвращаемое значение из main(), вы можете набрать его void, но это верно только в том случае, если документация компилятора явно говорит, что он поддерживает void main() ,

0 голосов
/ 14 апреля 2010

добавить void push(); перед основным

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...