मुझे असंगत सूचक प्रकार से असाइनमेंट कहने की चेतावनी मिल रही है। मैं प्रोग्रामिंग के लिए नया हूं और अपनी पूरी कोशिश की लेकिन फिर भी इसे समझ नहीं पाया। मुझे निम्न त्रुटि मिल रही है: 20 6 डी: \ डीएस प्रोग्राम \ व्यावहारिक 2 \ कर्मचारी_स्ट्रक्चर_पॉइंटर। सी [चेतावनी] असंगत सूचक प्रकार से असाइनमेंट
/* Accept n employee details using structure and pointer and display their details. */
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
struct employee
{
int no,salary;
char name[10],desig[10];
}*ptr;
int main()
{
int i,n;
printf("Enter total number of employees: ");
scanf("%d",&n);
ptr = (int*)calloc(n,sizeof(struct employee));
printf("\nEnter employee details: \n");
for(i=0;i<n;i++)
{
printf("Enter employee number: ");
scanf("%d",&(ptr+i)->no);
printf("Enter name of the employee: ");
scanf("%s",(ptr+i)->name);
printf("Enter designation of the employee: ");
scanf("%s",(ptr+i)->desig);
printf("Enter salary of the employee: ");
scanf("%d",&(ptr+i)->salary);
printf("\n");
}
printf("Employee details are: \n");
for(i=0;i<n;i++)
{
printf("\nEmployee number is: %d",(ptr+i)->no);
printf("\nEmployee name is: %s",(ptr+i)->name);
printf("\nEmployee designation is: %s",(ptr+i)->desig);
printf("\nEmployee salary is: %d",(ptr+i)->salary);
}
return 0;
}
1 उत्तर
आप ptr
को struct employee
के सूचक के रूप में परिभाषित करते हैं:
struct employee
{
int no,salary;
char name[10],desig[10];
}*ptr;
फिर आप n
ऐसे स्ट्रक्चर्स के डायनेमिक ऐरे को होल्ड करने के लिए मेमोरी आवंटित करते हैं:
ptr = (int*)calloc(n,sizeof(struct employee));
फ़ंक्शन calloc
और malloc
एक पॉइंटर को शून्य पर लौटाते हैं, void *
। आपने उस सूचक को स्पष्ट रूप से एक सूचक को int
पर डाला। इस असाइनमेंट के दाईं ओर अब int *
टाइप है।
बाईं ओर एक struct employee *
की उम्मीद है। आपकी सूचक असंगति निहित है।
एक कारण है कि c
/malloc
एक void *
लौटाता है: C में, शून्य के लिए एक पॉइंटर बिना कास्ट के किसी भी पॉइंटर प्रकार को सौंपा जा सकता है। तो आपको कलाकारों की जरूरत नहीं है। आपकी स्मृति आवंटन बस होना चाहिए:
ptr = calloc(n, sizeof(struct employee));
या शायद
ptr = calloc(n, sizeof(*ptr));
दूसरी ओर, सी ++ को एक स्पष्ट कलाकार की आवश्यकता होती है, इसलिए कुछ लोग सी ++ कंपाइलर्स के अनुकूल होने के लिए वैसे भी कास्ट करते हैं। यदि आप ऐसा करते हैं, तो आपको सही सूचक प्रकार पर डालना होगा। (स्पष्ट कास्ट malloc
को C++ में काफी वर्बोज़ बनाता है, लेकिन आप आमतौर पर इसके बजाय new
का उपयोग करेंगे।)
ptr
एकstruct employee
का सूचक है, लेकिन आपने स्पष्ट रूप सेmalloc
का वापसी मान(int *)
पर डाला है, जो(struct employee *)
के लिए असंगत सूचक प्रकार है। आपको यहां कलाकारों की जरूरत नहीं है;malloc
एकvoid *
देता है, जो एक संगत असाइनमेंट है। तो:ptr = malloc(...);