मुझे असंगत सूचक प्रकार से असाइनमेंट कहने की चेतावनी मिल रही है। मैं प्रोग्रामिंग के लिए नया हूं और अपनी पूरी कोशिश की लेकिन फिर भी इसे समझ नहीं पाया। मुझे निम्न त्रुटि मिल रही है: 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;
}
0
Atharva Dongare 30 पद 2020, 21:24
2
ptr एक struct employee का सूचक है, लेकिन आपने स्पष्ट रूप से malloc का वापसी मान (int *) पर डाला है, जो (struct employee *) के लिए असंगत सूचक प्रकार है। आपको यहां कलाकारों की जरूरत नहीं है; malloc एक void * देता है, जो एक संगत असाइनमेंट है। तो: ptr = malloc(...);
 – 
M Oehm
30 पद 2020, 21:28
कृपया इसे उत्तर दें, यह एकदम सही है।
 – 
the busybee
31 पद 2020, 13:14

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 का उपयोग करेंगे।)

0
M Oehm 31 पद 2020, 16:26