פלט מפורמט ++c

פלט מפורמט ++c

נתקלתי בספר המדריך לשפת ++c של טום סוואן המכילים קבצי כותר בסיומת HPP הכוללות פונקציה המזכירה את printf.
רק הבעיה שאף תוכנית לא עובדת בקודבלוקס.
דוגמה בקובץ המצורף
 

פרסאוס

New member
ו?

אנחנו אמורים לנחש את השאר?
איפה הקובץ? לינק, משהו?
איך אפשר לדעת מה הטעות בקובץ שלא מקבלים?
הממ...
 
מוזר, אני רואה את הקובץ המצורץ

TAND.CPP .2.3 תדפיס
1: // tand.cpp -- Test program for bitwise AND
2:
3: #include <stream.hpp>
4:
5: main()
6: {
7: unsigned int v1, v2, v3;
8:
9: cout << "Enter values to AND: (ex: 1234 15) ";
10: cin >> v1 >> v2;
11:
12: v3 = v1 & v2;
13:
14: cout << form(" %5u %#06x %016b\n", v1, v1, v1);
15: cout << form("AND %5u %#06x %016b\n", v2, v2, v2);
16: cout << "=====================================\n";
17: cout << form(" %5u %#06x %016b\n", v3, v3, v3);
18: }
(ראה AND בסיביות לפעולה משתמשת בכללים הנוגעים לאופרטור TAND.CPP- שורה 12 ב
משפט זה .v2- ו v1 ( בלי סימן מטיפוס שלם ) unsigned int לוח 2.3 ) כדי לחבר שני ערכים שהם
17 מציגות את שלושת - שורות 14 .v3 , גם מציב את התוצאה של חיבור זה במישתנה שלישי
כדי להציג את הצורות ההקסדצימלית והבינרית בלי סימן של כל form- הערכים, תוך שימוש ב
.AND ערך ואת התוצאה של החיבור באמצעות האופרטור
 
צירפת הכל חוץ מאשר את מה שצריך - מה הודעת השגיאה שאתה מקבל?
- מה הוא הקובץ stream.hpp ? זה לא משהו סטנדרטי.
 

פרסאוס

New member
לזה התכוון המשורר

כששאל איפה הקובץ...
 
כעת להודעת השגיאה

\vfd.cpp|1|error: stream.hpp: No such file or directory|
\vfd.cpp||In function 'int main()':|
\vfd.cpp|7|error: 'cout' was not declared in this scope|
\vfd.cpp|8|error: 'cin' was not declared in this scope|
\vfd.cpp|11|error: 'form' was not declared in this scope|
||=== Build finished: 4 errors, 0 warnings ===|


אחרי שכללתי גם את iostream והשתמשתי ב ;using namespace std קיבלתי
\vfd.cpp|1|error: stream.hpp: No such file or directory|
\vfd.cpp||In function 'int main()':|
\vfd.cpp|12|error: 'form' was not declared in this scope|
||=== Build finished: 2 errors, 0 warnings ===|

אני סה"כ רוצה להוסיף פלט מפורמט כמו ב printf
 
אתה סך הכל משתמש במשהו שלא קיים הודעת השגיאה מדברת בעד עצמה:
stream.hpp: No such file or directory

לא מותקן על המחשב שלך קובץ בשם stream.hpp, ולכן הקומפיילר לא מבין מה אתה רוצה מהחיים שלו. הקומפיילר לא קרא את הספר שאתה קראת. הוא מבין רק שלושה דברים: קבצים שהם חלק מהגדרת השפה, קבצים שמותקנים אצלו כחלק מספריות חיצוניות (למשל boost), וקבצים שאתה עצמך כתבת. ככל הנראה השם "stream.hpp" לא נופל באף אחת מהקטגוריות: הוא לא חלק מהשפה, הוא לא מותקן אצלך במחשב, ואתה לא כתבת אותו בעצמך. אז מאיפה בדיוק אתה רוצה שהקומפיילר יכיר אותו?

אתה בסך הכל קורה להוסיף פלט מפורמט, תתכבד בבקשה ותשתמש בספריות שמותקנות אצלך על המחשב, ולא רק כאלו שקראת עליהן בספר. או שתשתמש ב iostream סטנדרטי שמגיע כחלק מהשפה (חפש בגוגל ותמצא המון דוגמאות), או שתקרא יותר בעיון בספר ושיסביר לך מה זה הספריות שהוא משתמש בהן ומאיפה אפשר להוריד ולהתקין אותן.
 
הורדתי את המהדר Zortech

ואכן מצאתי את קבצי הכותר. ובתוכם הצהרות

// Output formatting routines

extern char *dec(long, int = 0);
extern char *oct(long, int = 0);
extern char *hex(long, int = 0);
extern char *str(const char *, int = 0);
extern char *chr(int, int = 0);
extern char *form(const char * ...);

class istream;
(מופיע ריבוע שחור עם FF)
class ostream
{
streambuf *bp;
state_value state;

friend istream;

public:
ostream& flush() { bp->overflow(); return *this; }
ostream& put(char);

ostream& operator<<(const streambuf&);
ostream& operator<<(const whitespace&);
ostream& operator<<(const char*);
ostream& operator<<(long);
ostream& operator<<(int a) { return *this << (long) a; }
// ostream& operator<<(char c) { return put(c); }
ostream& operator<<(char c) { return *this << (int) c; }
ostream& operator<<(double);


מה הלאה?

בספר התייחסו שמהדרי ++turbo c ישתמשו ב ostream.h ובמהדרים אחרים צריך לכתוב קובץ כותר בשם disp.h ולספק פונקציות שקולות עבור שגרות תצוגה המתחילות ב _disp

איך אוכל להכריח את קודבלוקס להתייחס לפונקצות הללו?
הורדתי גם את קבצי ה lid האם זה עוזר במשהו?

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

selalerer

New member
Zortech? זה לא שם של איזה כוכב במדריך?

לא שמעתי על זה בחיים. אם זה מה שכתוב בספר, זה כנראה ספר קצת תמוה עם מידע תמוה.

אולי כדאי ללמוד ממקום אחר.
 
הספר ישן

וכנ"ל גם המהדר. ואפילו אין כל איזכור של הספר באתר של המו"ל.
את המהדר מצאתי בגוגל. והורדתי את הספריות בלבד. אף שאני לא יודע להשתמש בהם
 

selalerer

New member
עקרונות אפשר כמובן ללמוד גם עם ספרים ישנים,

אבל נראה לי שחבל.

אפשר לנצל את הזמן ללמוד משהו שבאמת יותר קרוב למה שמשתמשים היום בתעשייה.

בנוסף יכול להיות שהוא יכניס לך הרגלים רעים. לא רק הטכנולוגיה התפתחה, גם שיטות העבודה מאוד השתנו וכך גם הפילוסופיה מסביב לנושא פיתוח תוכנה.
 
הבעיה שאני לא מסתדר עם iostream

מה שאני מקבל ב printf עבור %8.4d אני זקוק ל3 פונקציות בתוך cout כדי לקבל פלט מפורמט.
()setw() setfill ו ()setprecision

אם אני לא טועה, ב #c חזרו לפלט מפורמט אף כי בצורה שונה. כנראה שכתיבה בצורה זו נוחה יותר.
 

selalerer

New member
כל עוד אתה כותב לעצמך, אתה יכול להשתמש....

....ב-printf. אין שום מניעה להשתמש בו בקוד ++C, רק צריך לא לערבב בין iostream ל-stdio הישן והטוב.

החסרון העיקרי של printf (והפונקציות הדומות לה) הוא הנושא של בדיקת פרמטרים. אף אחד לא בודק של-d% באמת העברת int או שהעברת את מספר הפרמטרים הנכון. אבל גם בנושא הזה יש היום קומפיילרים שמטפלים בעזרת warnings.

אין צורך לפנות לכל מיני ספריות איזוטריות מספר שנכתב לפני עשרים שנה.
 
לשם בהירות

האם הדוגמה שהבאתי נקראת ערבוב בין iostream ל-stdio? בהיות וב stream.hpp הם הצהירו על stdio.h. (חשבתי שהם המציאו גלגל חדש)

איך השימוש ב stdio? האם בתוספת הסיומת h? או שרק מקדימים את האות c כגון cstdio?
בהיות שחלק מהפונקציות השגרתיות אינם עובדים עם ה stdio הישן והטוב. כגון exit ו getch.
 

selalerer

New member
הדרך הסטנדרטית בתוכנית ++C היא להוסיף c בהתחל

getch מעולם לא הייתה חלק מ-stdio זו תוספת של קומפיילרים ישנים ולא סטנדרטיים.
 
למעלה