By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
448,799 Members | 1,356 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 448,799 IT Pros & Developers. It's quick & easy.

problem in passing a value into a structure

P: n/a
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#define STUDENT_NUMBER 68
#define ARRAY_LENGTH 10

struct node{
char Name,Surname;
int data,no;
struct node *left,*right,*datA;
};

typedef struct node node;

/*prototypes*/
void buildTree();
node* createNode(char[],char[],int);
//void insert(node,int,char,char);

node *root=NULL,*nod=NULL;
long ID,order,nodeNumber,depth=0;
char name[10],familyName[10];

int main()
{
buildTree();

return 0;
}
void buildTree(){
FILE *file;
if((file=fopen("data.txt","r"))==NULL){
printf("File couldn't be opened!\n");

}else{

while(!feof(file)){

fscanf(file,"%ld%ld%s%s",&order,&ID,name,familyNam e);

printf("order=%ld,ID=%ld,name=%s,familyName=%s\n", order,ID,name,familyName);
root=createNode(*familyName,*name,ID);/*HERE THERE IS A
PROBLEM:COMPILER WANTS CASTING BUT HOW WILL I DO IT?*/
}
}

fclose(file);
}


node* createNode(char srnm[],char nm[],int noo){
node* newNode;
newNode=(node*)(malloc(sizeof(node)));
newNode->Surname=*(srnm);
newNode->Name=*(nm);
newNode->no=noo;
newNode->left=NULL;
newNode->right=NULL;
return newNode;
}

void add(node *nd,long id[],char namE[],char surnamE[]){

while(pow(2,depth+1)!=STUDENT_NUMBER){
depth++;
}

if(depth%3==0){
*nod->datA=namE;/*HERE SAME PROBLEM AGAIN*/

}

if(depth%3==2){
*nod->datA=id; /*HERE SAME PROBLEM AGAIN*/

}

if(depth%3==0){
*nod->datA=surnamE; /*HERE SAME PROBLEM AGAIN*/

}

if(nod.datA>nd->no){
if(nd->right==NULL){
nd->right=createNode(namE,surnamE,id);
}else{
add(nd->right,id,namE,surnamE);
}
}
else
{
if(nd->left==NULL){
nd->left=createNode(namE,surnamE,id);
}else{
add(nd->left,id,namE,surnamE);
}
}
}

Dec 14 '06 #1
Share this Question
Share on Google+
3 Replies


P: n/a
iskeletor wrote:
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#define STUDENT_NUMBER 68
#define ARRAY_LENGTH 10

struct node{
char Name,Surname;
int data,no;
struct node *left,*right,*datA;
};

typedef struct node node;

/*prototypes*/
void buildTree();
node* createNode(char[],char[],int);
//void insert(node,int,char,char);

node *root=NULL,*nod=NULL;
long ID,order,nodeNumber,depth=0;
char name[10],familyName[10];

int main()
{
buildTree();

return 0;
}
void buildTree(){
FILE *file;
if((file=fopen("data.txt","r"))==NULL){
printf("File couldn't be opened!\n");

}else{

while(!feof(file)){

fscanf(file,"%ld%ld%s%s",&order,&ID,name,familyNam e);

printf("order=%ld,ID=%ld,name=%s,familyName=%s\n", order,ID,name,familyName);
root=createNode(*familyName,*name,ID);/*HERE THERE IS A
PROBLEM:COMPILER WANTS CASTING BUT HOW WILL I DO IT?*/

root = createNode (familyName, name, ID);
}
}

fclose(file);
}
<snip>
>
void add(node *nd,long id[],char namE[],char surnamE[]){

while(pow(2,depth+1)!=STUDENT_NUMBER){
depth++;
}

if(depth%3==0){
*nod->datA=namE;/*HERE SAME PROBLEM AGAIN*/
no it isn't, read your compiler diagnostics. This is a mess. *nod is
struct node *not* a struct node*. Get rid of the *. namE is char* but
datA is a struct node. struct node has no char* fields. Go back and
re-read the ptr section of your textbook. Then redesign your program.

Fix the layout (is your space key broken?). Don't have similar and
confusing names (nod, node), don't mix case in identifiers (namE).

<snip>

my compiler was *very* noisy. This is the output for a (slightly)
cleaned up version of your code.

G:\tmp\iskel.c(59) : error C2018: unknown character '0xad'
G:\tmp\iskel.c(62) : warning C4047: 'function' : 'char *' differs in
levels of indirection from 'char '
G:\tmp\iskel.c(62) : warning C4024: 'createNode' : different types for
formal and actual parameter 1
G:\tmp\iskel.c(62) : warning C4047: 'function' : 'char *' differs in
levels of indirection from 'char '
G:\tmp\iskel.c(62) : warning C4024: 'createNode' : different types for
formal and actual parameter 2
G:\tmp\iskel.c(101) : warning C4047: 'function' : 'char *' differs in
levels of indirection from 'char '
G:\tmp\iskel.c(101) : warning C4024: 'strcpy' : different types for
formal and actual parameter 1

this one is my fault...

G:\tmp\iskel.c(108) : error C2115: '=' : incompatible types
G:\tmp\iskel.c(115) : error C2115: '=' : incompatible types
G:\tmp\iskel.c(121) : error C2231: '.datA' : left operand points to
'struct', use '->'
G:\tmp\iskel.c(121) : warning C4047: '>' : 'struct node *' differs in
levels of indirection from 'int '
G:\tmp\iskel.c(123) : warning C4047: 'function' : 'int ' differs in
levels of indirection from 'long *'
G:\tmp\iskel.c(123) : warning C4024: 'createNode' : different types for
formal and actual parameter 3
G:\tmp\iskel.c(131) : warning C4047: 'function' : 'int ' differs in
levels of indirection from 'long *'
G:\tmp\iskel.c(131) : warning C4024: 'createNode' : different types for
formal and actual parameter 3
--
Nick Keighley

why isn't there an obfuscated C++ contest?

Dec 14 '06 #2

P: n/a

thank you very much =)

Dec 14 '06 #3

P: n/a
On 14 Dec 2006 00:57:33 -0800, "iskeletor" <zi********@gmail.com>
wrote:
>#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#define STUDENT_NUMBER 68
#define ARRAY_LENGTH 10

struct node{
char Name,Surname;
int data,no;
struct node *left,*right,*datA;
};

typedef struct node node;

/*prototypes*/
void buildTree();
node* createNode(char[],char[],int);
//void insert(node,int,char,char);

node *root=NULL,*nod=NULL;
long ID,order,nodeNumber,depth=0;
char name[10],familyName[10];

int main()
{
buildTree();

return 0;
}
void buildTree(){
Since the function returns nothing, how is anyone to know if it
succeeded or not.
FILE *file;
if((file=fopen("data.txt","r"))==NULL){
printf("File couldn't be opened!\n");

}else{

Why are you wasting all this vertical space. Most of us like to be
able to see a reasonable amount of code in one view without scrolling.
>
while(!feof(file)){
This will cause you to process the last set of data twice. feof
returns 1 only **after** you try to read past the end of file.
>
fscanf(file,"%ld%ld%s%s",&order,&ID,name,familyNam e);

printf("order=%ld,ID=%ld,name=%s,familyName=%s\n" ,order,ID,name,familyName);
root=createNode(*familyName,*name,ID);/*HERE THERE IS A
PROBLEM:COMPILER WANTS CASTING BUT HOW WILL I DO IT?*/
No the compiler does not want casting. The compiler wants you to pass
arguments that match the prototype. What is the type of the first
parameter in the createNode prototype? What is the type of
*familyName? Do you see the difference?

How many arguments are you supposed to pass to createNode? How many
are in the above statement?

createNode allocates memory. It returns the address of the allocated
memory. You assign this address to root. On the next iteration, you
replace the existing value of root with the new value returned by
createNode, thereby losing any chance of using the first allocated
area. This is called a memory leak.
>

}
}

fclose(file);
}


node* createNode(char srnm[],char nm[],int noo){
node* newNode;
newNode=(node*)(malloc(sizeof(node)));
Don't cast the return from malloc.
newNode->Surname=*(srnm);
Surname is a char. *srnm (with or without the parentheses) is also a
char so this is a legal assignment. What do you expect to do with
only one character from the name?
> newNode->Name=*(nm);
newNode->no=noo;
newNode->left=NULL;
newNode->right=NULL;
return newNode;
}

void add(node *nd,long id[],char namE[],char surnamE[]){
You never call this function.
>
while(pow(2,depth+1)!=STUDENT_NUMBER){
STUDENT_NUMBER is not a power of 3. This while never ends.
depth++;
}

if(depth%3==0){
*nod->datA=namE;/*HERE SAME PROBLEM AGAIN*/
What same problem? Did your compiler really ask for a cast here?

nod is a pointer to struct. *nod is the struct it points to. To
access a member of a struct, use the . operator, not the -one. If
you want to use the -. operator, the left operand must be a pointer to
struct. Drop the *.

datA is a pointer to struct. name is a pointer to char. The two are
incompatible. What are you really trying to accomplish?
>
}

if(depth%3==2){
*nod->datA=id; /*HERE SAME PROBLEM AGAIN*/
id is an array of long. In this context, it evaluates to the address
of id[0] with type pointer to long. This pointer is incompatible with
datA which is a pointer to struct. Did you perhaps want datA to be a
void* so it could point to any kind of data you want?
>
}

if(depth%3==0){
*nod->datA=surnamE; /*HERE SAME PROBLEM AGAIN*/
Consistency is a virtue. datA hasn't changed. surnameE has the same
type as namE. This should produce the same error.
>
}

if(nod.datA>nd->no){
datA is a pointer. no is an int. They are incompatible. What are
you trying to do?

You might want to use a little horizontal white space in an expression
like this.
> if(nd->right==NULL){
nd->right=createNode(namE,surnamE,id);
}else{
add(nd->right,id,namE,surnamE);
}
}
else
{
if(nd->left==NULL){
nd->left=createNode(namE,surnamE,id);
}else{
add(nd->left,id,namE,surnamE);
}
}
}

Remove del for email
Dec 15 '06 #4

This discussion thread is closed

Replies have been disabled for this discussion.