ABA


"בעיה במבנים ושליחה של כתובת לפונקציה ב C"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #15665 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 15665
DarkMaster
חבר מתאריך 1.8.02
126 הודעות
   20:53   09.01.10   
אל הפורום  
  בעיה במבנים ושליחה של כתובת לפונקציה ב C  
 
   ערכתי לאחרונה בתאריך 09.01.10 בשעה 21:00 בברכה, DarkMaster
 
בעיה היא למה ללא האמפרסנט של ב CASE הראשון הוא לא שולח את הכתובת
של PARTS לפונקציה .

דבר שני : הוא שומר רק את המבנה האחרון שנכנס לו והוא הורג את השאר.


#include<stdio.h>
#include<malloc.h>

// -------- Structures --------------------------
typedef struct item_part
{
char name[30];
char type_car[20];
char catalog_number[10];
double price;
}
item;
// -------- Prototype Functions -----------------
item* add(item*,int);
item* del(item*,int,char*);
item* print_part(item*,int,char*);
// ---------------- Main ------------------------
void main()
{
int num=0,size=0;
item *parts,*p;
char name[10];

while(num!=4)
{
printf("1 - Add part to database\n");
printf("2 - Delete part from database\n");
printf("3 - View part by ID \n");
printf("4 - Exit\n");
flushall();
scanf("%d",&num);

switch(num)
{

case 1:
{
parts=add(parts,size);
size++;
break;
}
case 2:
{
printf("Enter Catalog Number to delate : ");
flushall();
gets(name);
p=del(parts,size,name);
if(p==NULL)
{
printf("The catalog number doesn't delated\n");
}
break;
}
case 3:
{
printf("Enter Catalog Number for View : ");
flushall();
gets(name);
p=print_part(parts,size,name);
size--;
if(p==NULL)
{
printf("The catalog number not found\n");
}
break;
}
case 4: exit(1);

default: printf("Error");

}
}


getch();
}

// ---------------- functions ------------------------
item* add(item *x, int size)
{
int i;
item *temp;
temp=(item*)malloc(sizeof(item)*size+1);
if(temp==NULL)
{
printf("memory");
exit(1);
}
strcpy(temp,x);
size++;
x=(item*)malloc(sizeof(item)*size);
strcpy(x,temp);
if(x==NULL)
{
printf("memory");
exit(1);
}
flushall();
printf("Enter name part : ");
gets(x[size-1].name);
flushall();
printf("Enter type car : ");
flushall();
gets(x[size-1].type_car);
flushall();
printf("Enter catalog number : ");
gets(x[size-1].catalog_number);
flushall();
printf("Enter price : ");
scanf("%lf",&x[size-1].price);

return x;
}

// ---------------- function 2 ------------------------
item* print_part(item *x,int size,char *name)
{
int i,j=-1;
for(i=0;i<size;i++)
{
if(strcmp(x[i].catalog_number,name)==0)
{
j=i;
break;
}
}
if(j!=-1)
{
printf("Name : %s\n",x[j].name);
printf("Car : %s\n",x[j].type_car);
printf("Catlog number : %s\n",x[j].catalog_number);
printf("Price : %.2lf\n",x[j].price);
return x;
}
else
{
return NULL;
}
}
// ---------------- function 3 ------------------------
item* del(item *x,int size,char *name)
{
int i,j=-1,k;
item *temp;

temp=(item*)malloc(sizeof(item)*size-1);
if(temp==NULL)
{
printf("memory");
exit(1);
}

for(i=0;i<size;i++)
{
if(strcmp(x[i].catalog_number,name)==0)
{
j=i;
break;
}
}
if(j==-1)
{
return NULL;
}
for(i=0,k=0;i<size;i++,k++)
{
if(i!=j)
{
temp[k]=x[i];
}
}
x=(item*)malloc(sizeof(item)*size-1);
if(x==NULL)
{
printf("memory");
exit(1);
}

for(i=0;i<size-1;i++)
{
x[i]=temp[i];
}
return x;
}


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  אתה יודע איך malloc עובד? Deuce  10.01.10 00:28 1
     *בתים ronen333  10.01.10 11:17 2
         אני מאמין שחסרה לו י'. בייטים, שזה אכן בתים ldan192  11.01.10 11:03 3

       
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   00:28   10.01.10   
אל הפורום  
  1. אתה יודע איך malloc עובד?  
בתגובה להודעה מספר 0
 
malloc(n) מקצה n ביטים ומחזיר מצביע לאיבר הראשון. אם אתה מעביר את parts ולא את הכתובת שלו, ואז אתה עושה malloc אז אתה מצביע למקום חדש לגמרי. לכן יש להעביר את האמפרסנד שלו ולהשתמש בכוכבית.

חוץ מזה כל המבנה שלך לא עובד טוב. כל פעם אתה עושה malloc מחדש, פותח זכרון מחדש ומקבל מצביע אליו, לכן כל המידע הישן נמחק. זאת ועוד שאין התייחסות בכלל ל-free אבל ניחא - זאת הבעייה הקטנה שלך.

כדי לאפשר מבנה של רשימה אתה צריך לבנות את ה-struct בצורה:


struct example
{
// Definitions
struct example * posNext;
}

בעיה היא למה ללא האמפרסנט של ב CASE הראשון הוא לא שולח את הכתובת
של PARTS לפונקציה .

דבר שני : הוא שומר רק את המבנה האחרון שנכנס לו והוא הורג את השאר.


#include<stdio.h>
#include<malloc.h>

// -------- Structures --------------------------
typedef struct item_part
{
char name[30];
char type_car[20];
char catalog_number[10];
double price;
}
item;
// -------- Prototype Functions -----------------
item* add(item*,int);
item* del(item*,int,char*);
item* print_part(item*,int,char*);
// ---------------- Main ------------------------
void main()
{
int num=0,size=0;
item *parts,*p;
char name[10];

while(num!=4)
{
printf("1 - Add part to database\n");
printf("2 - Delete part from database\n");
printf("3 - View part by ID \n");
printf("4 - Exit\n");
flushall();
scanf("%d",&num);

switch(num)
{

case 1:
{
parts=add(parts,size);
size++;
break;
}
case 2:
{
printf("Enter Catalog Number to delate : ");
flushall();
gets(name);
p=del(parts,size,name);
if(p==NULL)
{
printf("The catalog number doesn't delated\n");
}
break;
}
case 3:
{
printf("Enter Catalog Number for View : ");
flushall();
gets(name);
p=print_part(parts,size,name);
size--;
if(p==NULL)
{
printf("The catalog number not found\n");
}
break;
}
case 4: exit(1);

default: printf("Error");

}
}


getch();
}

// ---------------- functions ------------------------
item* add(item *x, int size)
{
int i;
item *temp;
temp=(item*)malloc(sizeof(item)*size+1);
if(temp==NULL)
{
printf("memory");
exit(1);
}
strcpy(temp,x);
size++;
x=(item*)malloc(sizeof(item)*size);
strcpy(x,temp);
if(x==NULL)
{
printf("memory");
exit(1);
}
flushall();
printf("Enter name part : ");
gets(x[size-1].name);
flushall();
printf("Enter type car : ");
flushall();
gets(x[size-1].type_car);
flushall();
printf("Enter catalog number : ");
gets(x[size-1].catalog_number);
flushall();
printf("Enter price : ");
scanf("%lf",&x[size-1].price);

return x;
}

// ---------------- function 2 ------------------------
item* print_part(item *x,int size,char *name)
{
int i,j=-1;
for(i=0;i<size;i++)
{
if(strcmp(x[i].catalog_number,name)==0)
{
j=i;
break;
}
}
if(j!=-1)
{
printf("Name : %s\n",x[j].name);
printf("Car : %s\n",x[j].type_car);
printf("Catlog number : %s\n",x[j].catalog_number);
printf("Price : %.2lf\n",x[j].price);
return x;
}
else
{
return NULL;
}
}
// ---------------- function 3 ------------------------
item* del(item *x,int size,char *name)
{
int i,j=-1,k;
item *temp;

temp=(item*)malloc(sizeof(item)*size-1);
if(temp==NULL)
{
printf("memory");
exit(1);
}

for(i=0;i<size;i++)
{
if(strcmp(x[i].catalog_number,name)==0)
{
j=i;
break;
}
}
if(j==-1)
{
return NULL;
}
for(i=0,k=0;i<size;i++,k++)
{
if(i!=j)
{
temp[k]=x[i];
}
}
x=(item*)malloc(sizeof(item)*size-1);
if(x==NULL)
{
printf("memory");
exit(1);
}

for(i=0;i<size-1;i++)
{
x[i]=temp[i];
}
return x;
}


ציטוט מאת: DarkMaster






                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   11:17   10.01.10   
אל הפורום  
  2. *בתים  
בתגובה להודעה מספר 1
 
   לא ביטים =].


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   11:03   11.01.10   
אל הפורום  
  3. אני מאמין שחסרה לו י'. בייטים, שזה אכן בתים  
בתגובה להודעה מספר 2
 


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net