C Board  

Go Back   C Board > General Programming Boards > C Programming

Reply
 
LinkBack Thread Tools Display Modes
Old 09-11-2006, 09:47 PM   #1
Registered User
 
Join Date: Sep 2006
Posts: 4
stack and pointer problem

hello everyone

I just beginning my data structure course ad currently i have a problem with stack, I hope you guys can help me.

Ok,this is my code

Code:
/* File : stackeng.h */
/* Type declaration and primitive function prototype for stack type */

#ifndef stack_H
#define stack_H
#include "boolean.h"
#define Nil 0
#define Top(S) (S).Top
#define InfoTop(S) (S).T[(S).Top]
#define Size(S) (S).Size

typedef int infotype;
typedef int address;

typedef struct
{
	infotype * T; /*Table for storing stack element*/
	address Top; /*(Table index for he top element)*/
	int Size; /*stack's size*/
}stack;

/*primitive  prototype  */

void CreateEmpty(stack * S, int size);
/* Create a  empty stack S whose capacity is as big as size,
The Index is between 1 until size + 1,because i don't use the 0 index, 
the stack is empty when the stack's Top property has 0 value  */

void Push(stack * S, infotype x);
/* add x as elemen stack s
    Initial state :stack S can be empty,the array container for stack elements is not full
    Final state : x become the new top value in stackS,Stack's S Top atribute is incremented by 1  
 */

void Pop(stack * S, infotype * x);
/* Delete x as stack S element
    Initial state :stack S can not be empty
    Final state : x is a former stack S Top element which had been popped by    Pop  function  
 */

boolean IsEmpty(stack S);
/* check if stack S is empty ,return true if stack S is empty,false is not empty*/

boolean IsFull(stack S);
/* check if stack S is full ,return true if stack S is full,false is not full */

void Destruct(stack * S);
/*Destroy the stack S */

void Grow(stack * S);
/*Makes the stack capacity grows for one additional element
  Initial state :stack S maybe full,maybe not.The stack's Size property is A
  Final state : The stack's Size property is (A+1)
*/
#endif
Code:
/*Stack's Body primitive function */

#include "stackeng.h"
#include "boolean.h"

/*BODY PROTOTYPE*/

void CreateEmpty(stack * S, int size)
/* Create a  empty stack S whose capacity is as big as size,
The Index is between 1 until size + 1,because i don't use the 0 index, 
the stack is empty when the stack's Top property has 0 value  */
{
	(*S).T = (infotype *) malloc ((size + 1) * sizeof(infotype));
	Top(*S) = Nil;
	Size(*S) = size;
	
}

void Push(stack * S, infotype x)
/* add x as elemen stack s
    Initial state :stack S can be empty,the array container for stack elements is not full
    Final state : x become the new top value in stackS,Stack's S Top atribute is incremented by 1  
 */
{
	Top(*S)++;
	InfoTop(*S) = x;
}

void Pop(stack * S, infotype * x)
/* Delete x as stack S element
    Initial state :stack S can not be empty
    Final state : x is a former stack S Top element which had been popped by Pop function  
 */
{
	*x = InfoTop(*S);
	Top(*S)--;
}

boolean IsEmpty(stack S)
/* check if stack S is empty ,return true if stack S is empty,false is not empty*/
{
	return Top(S) == Nil;
}
boolean IsFull(stack S)
/* check if stack S is full ,return true if stack S is full,false is not full */
{
	return Top(S) == S.Size;
}

void Destruct(stack * S)
/*Destroy the stack S */
{
	free((*S).T);
	Top(*S) = Nil;
	Size(*S) = 0;
}

void Grow(stack * S)
/*Makes the stack capacity grows for one additional element
  Initial state :stack S maybe full,maybe not.The stack's Size property is A
  Final state : The stack's Size property is (A+1)
*/
{
	stack S2; /*(temporary stack initialisation)*/
	CreateEmpty(&S2,Size(*S)); /*(make stack S2 empty )*/
	S2 = (*S);/*(copy stack S to stack S2)*/
                Destruct(&S);/*Destroy the stack S */
	CreateEmpty(&S,(Size(*S2) + 1));/*(Create the new stack S whose    size is one element bigger than the old one)*/
	S = &S2;/*(copy stack S2 to stack S)*/
}
Code:
/* File: mstackeng.c*/

/*This file is writeen to check whether the primitive function can be implemented in main program or not */

#include <stdio.h>
#include "boolean.h"
#include "stackeng.c"

main ()
{
	stack S1;
	CreateEmpty(&S1,9);
	if(IsEmpty(S1))
	{
		printf ("push works well\n");
		Push(&S1,5);
	}
	int x;
	Pop(&S1,&x);
	printf ("pop works well %d\n",x);
	Push(&S1,5);
	Push(&S1,5);
	Push(&S1,5);
	Grow(&S1);
	int z;
	scanf ("%d",&z);
    return 0;
}
When I compiled file mstackeng.c with Bloodshed Dev C++,i got this following error messages:

1.line 7 E:\stack\mstackeng.c In file included from E:\stack\mstackeng.c
E:\stack\stackeng.c In function `Grow':
2.line 67 E:\stack\stackeng.c [Warning] passing arg 1 of `Destruct' from incompatible pointer type
3.line 68 E:\stack\stackeng.c invalid type argument of `unary *'
4.line 68 E:\stack\stackeng.c [Warning] passing arg 1 of `CreateEmpty' from incompatible pointer type

I tried best to debug my program but it still won' budge.I think the misuse of pointer is the cause of this problem,but i still don't understand how to fix it.

Can you help me guys?

Thank you
ramaadhitia is offline   Reply With Quote
Old 09-11-2006, 11:22 PM   #2
int x = *((int *) NULL);
 
Cactus_Hugger's Avatar
 
Join Date: Jul 2003
Location: Banks of the River Styx
Posts: 891
Your error comes from passing a stack ** to CreateEmpty. (You're taking the address of a pointer, &S.) Same goes for the Destruct error. Match your types up.

Also:
Code:
S = &S2;/*(copy stack S2 to stack S)*/
That doesn't do what the comment alleges it does. That set S (a pointer) to the address of S2. S goes out of scope afterwards, and that statement has no effect.

Also, "Nil" ? The general rule for #defines is to make them all caps. I'd also use NULL over "Nil" - other programs will read "Nil" and go hunt to find out what Nil is. (Since it's not in caps, it's not obvious it's a define, though one might assume things based on context.)
__________________
long time; /* know C? */
Unprecedented performance: Nothing ever ran this slow before.
Any sufficiently advanced bug is indistinguishable from a feature.
Real Programmers confuse Halloween and Christmas, because dec 25 == oct 31.
The best way to accelerate an IBM is at 9.8 m/s/s.
recursion (re - cur' - zhun) n. 1. (see recursion)
Cactus_Hugger is offline   Reply With Quote
Old 09-11-2006, 11:41 PM   #3
Registered User
 
Join Date: Sep 2006
Posts: 4
Still don't know how to solve it

Thanks cactus_hugger for your reply.

But i still don't know how to fix the problem. I mean i still dont know how to pass argument to function CreateEmpty and Destruct correctly in this case.

Could you write the correct code?,so i can understand how to fix it.

Thank You
ramaadhitia is offline   Reply With Quote
Reply

Thread Tools
Display Modes

Forum Jump

Similar Threads
Thread Thread Starter Forum Replies Last Post
Stack problem - I've hit a wall! miniwhip C Programming 7 11-14-2007 03:05 AM
Stacks Cmuppet C Programming 19 10-13-2004 02:32 PM
Request for comments Prelude A Brief History of Cprogramming.com 15 01-02-2004 10:33 AM
Question about a stack using array of pointers Ricochet C++ Programming 6 11-17-2003 10:12 PM
more pointer problems dharh C Programming 3 02-11-2003 06:52 PM


All times are GMT -6. The time now is 02:17 AM.


Powered by vBulletin® Version 3.8.1
Copyright ©2000 - 2009, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.3.0 RC2

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22