שאלה קטנה על קוד C

nocgod

New member
שאלה קטנה על קוד C

היי, אני לומד קצת עבודה עם processes ו pipes וכל שאר הסלט. מצאתי קוד קצר באינטרנט שאמור להדגים קצת איך עובדים עם pipes, רק שהוא מציג לי warning שלעולם לא ראיתי
והאמת אני לא מצליח להבין ממה הם נגרמים.
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main(void)
{
int fd[2], nbytes;
pid_t childpid;
char string[] = "Hello, world!\n";
char readbuffer[80];

pipe(fd);

if((childpid = fork()) == -1)
{
perror("fork");
exit(1);
}

if(childpid == 0)
{
/* Child process closes up input side of pipe */
close(fd[0]);

/* Send "string" through the output side of pipe */
write(fd[1], string, (strlen(string)+1));
exit(0);
}
else
{
/* Parent process closes up output side of pipe */
close(fd[1]);

/* Read in a string from the pipe */
nbytes = read(fd[0], readbuffer, sizeof(readbuffer));
printf("Received string: %s", readbuffer);
}

return(0);
}


implicit declaration of function ‘strlen’ [-Wimplicit-function-declaration]
incompatible implicit declaration of built-in function ‘exit’ [enabled by default]
incompatible implicit declaration of built-in function ‘strlen’ [enabled by default]


ניסיתי להוסיף את הספריות stdlib.h, string.h ועוד כמה זה לא נראה כאילו שינה משהו...יש רעיונות?
 

nocgod

New member
קבלו ביטול

קפריץ של eclipse, אחרי restart זה עובד...אייי כמה שאני אוהב אותו...
 

BravoMan

Active member
אני אפילו לא אשאל מה גרם לך להשתמש

ב-eclipse לפיתוח ב-C.

אבל סתם לידע כללי אם תרם גיגלת זאת:
implicit declaration משמעותו שהקומפיילר רואה בקוד קריאה לפונקציה שתרם הוכרזה.

להפתעתי (ונתקלתי בזה כמה פעמים בעבר כששכחתי להוסיף header או טעיתי בכמות פרמטרים), זה חוקי לחלוטין ב-C, והתוכנה תעבוד, אם ה-linker רק יצליח למצוא פונקציה מתאימה.

ו-strlen אכן מוכרזת בקובץ string.h ו-exit מוכרזת ב-stdlib.h
אני לא יודע על איזו מערכת אתה עובד, אבל man 3 בתוספת שם הפונקציה עושה פלאים בעניין הזה.

וכמובן, אתה בטח שמעת על המתכנת שעישן:
שאלו אותו: תגיד, אתה לא רואה את האזהרה של משרד הבריאות על הקופסה שסיגריות גורמות לסרטן?
והמתכנת כמובן ענה: במקצוע שלי מתעלמים מאזהרות ומתייחסים רק לשגיאות
 

nocgod

New member
לצערי

במכללה שלי דואגים להוריד נקודות על אזהרות, גם אם זה בגלל לא קשור אלי. פחים נו מה נעשה...
בקשר לבעיה, כמו שאמרתי - קפריז של אקליפס, כנראה הוא לא עשה ייבא את הheaders אחרי ריסטרט ובילד זה עבד יופי טופי :)
וכן גיגלתי את זה ותיארתי לעצמי שזה הסיפור, רק לא הבנתי ממה זה נובע כי אני כן הכנסתי את ההאדרים, נו מילא...
למה אקליפס? נראה לך יש לי כוח לכתוב 1000 שורות קוד בnano? לעשות debug בterminal עם gdb? האקליפס עושה את זה בשבילי בסביבה שאני מכיר קצת יותר (יצא לי לעבוד יותר בJAVA מאשר בכל שפה אחרת)
אני מבסוט רק על כלי אחד בטרמינל וזה על וואלגרינד... כל השאר אפשר להמנע, אז נמנעים. אקליפס משלים לי שמות(ואני נותן שמות מאוד אינפורמטיביים) ואשכרה מונע ממני לעשות man כל חצי שניה על כל שטות שאני לא זוכר.
יש לזה פלוסים :)

אגב לא, לא שמעתי על המתכנת המעשן, עכשיו אני שומע...וזה לא רע בכלל...
 

BravoMan

Active member
לא רק במכללה שלך.

אחד הטיפים שלמדתי בזמנו עבור קורס במערכות הפעלה הוא שכשעובדים עם gcc לא מספיק לתת פרמטר Wall- שהמרצים הסבירו עליו אלא גם מומלץ להוסיף ansi- (כי זו לא גרסת סטנדרט ברירת מחדל של הקומפיילר אבל לפיה מלמדים בד"כ) ו-pedantic- כדי שממש יתעקש על כל דבר קטן שבגללו עשויים לאבד איזו נקודה.

בכל אופן, בין Eclipse ל-nano יש עוד המון דברים כגון Anjuta ו-Jeany הקלילה יותר.
(לא שאני מסנה לשכנע אותך לעבור)

לעניין הקפריז: למיטב ידיעתי, Eclipse למעשה משתמש כמו כולם ב- gcc (לא ניסיתי להשתמש בו לפיתוח ב-C בפועל), ואין לו שום צורך "לייבא" את ההידרים.
מה שאומר, שייתכן שנוצר מצב בו גרסת הקובץ שראית בעורך היא לא גרסת קובץ שנשמרה על הדיסק ונשלחה למהדר.

לא נתקלתי במקרה כזה באופן אישי (לפחות לא שאני זוכר), אבל זה יכול לגרום לכל מיני תופעות הזויות, לא רק משהו שקשור להידרים.

בכל מקרה, בהצלחה עם הפרויקט!
 
למעלה