עבור לתוכן

עזרה ב-C

Featured Replies

פורסם

אוקיי, נניח ויש לי תוכנה כזו:

#include<stdio.h>
int main(void)
{
int a1,a2,a3;
a(*) = 1;
a(*+1) = 2;
a(*+2) = 3;
printf("%d,%d,%d",a(*),a(*+1),a(*+2));
return 0;
}

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

למשל, הגדרתי משתנה n = 1. אני רוצה לפנות ל-a1 בתור 'a'n ואז התוכנה תדע לפנות ל-a1.

אפשרי לעשות את זה חוץ משימוש במערך?

תודה!

פורסם

אם אתה רוצה להשתמש במשתנה עבור האינדקס, אתה חייב מערכים. תזכור שלאחר שהתכנית מתקמפלת, השמות של המשתנים כבר חסרי משמעות (אין יותר a1,a2,a3, אלא רק "המשתנה הראשון", "המשתנה השני" וכן הלאה).

פורסם

א) מה שאתה רוצה זה לא הרבה משתנים, אלא משתנה אחד שהוא מערך.

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

ג) הקוד כמו שכתבת לא קרוב להתקמפל. זה לא C ואי אפשר לעשות בדיוק את מה שאתה רוצה ב-C. אבל אפשר לעשות משהו דומה שהוא נכון יותר. ראה (א).


#include<stdio.h>
int main(void)
{
int a[3];
a[0] = 1;
a[1] = 2;
a[2] = 3;
printf("%d,%d,%d",a[0],a[1],a[2]);

return 0;
}

פורסם
  • מחבר

הייתה לי הרגשה שזה לא אפשרי. אגב, היה לי ברור שזה לא יתקמפל. זה היה רק בשביל הדוגמה :lol:

יש לי סיבה לא להשתמש במערך כי כבר יש לי קוד בערך כזה:

#define io_1 DIG_OUT_IO1
#define io_2 DIG_OUT_IO2
.
.
#define io_16 DIG_OUT_IO16

אלה יציאות של בקר ואני צריך לפנות בפונקציה מסויימת ליציאה שמתקבלת ממשתנה חיצוני. אין לי אפשרות לשנות את הקוד הזה כדי שזה יהיה מוגדר כמערך. חיפשתי דרך קצת יותר אלגנטית מלעשות 16 CASE-ים.

פורסם

טוב אני מניח שאתה יכול לעשות מערך של מצביעים ל-16 משתנים אמיתיים...

פורסם
  • מחבר

לא חשבתי על הרעיון עם המצביעים [הרמה שלי ב-C לא גבוהה במיוחד], אני מניח שזה מה שאני אעשה ואז אני לא אצטרך CASE-ים.. זה גם יכול להיות שימושי בהמשך התוכנה.

ושאלה אחרת: אם אני מבקש ממשתמש להכניס ערך (ע"י scanf), האם יש לי אפשרות לעשות הבחנה בין 0 ל- 0- (מינוס אפס. כן, אני יודע שאין כזה דבר..)

פורסם

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

פורסם
  • מחבר

כן, אבל אני צריך לקלוט תחום גדול של מספרים ואני רוצה לעשות על המספר הנתון מניפולציות כמו על int. זה בכל זאת אפשרי עם משתנה מסוג char? [או שאני בכלל לא בכיוון וזה לא מה שהתכוונת?]

פורסם

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

פורסם
  • מחבר

בסוף התמודדתי עם זה כך:

  char a[2];
scanf("%s",&a);
if (a[0]=='-')
{
switch(a[1])
{
case '0':
printf("-0");
break;
default:
printf("NEGATIVE");
break;
}
}
else
{
printf("POSITIVE");
}

וכאשר אני רוצה לבצע מניפולציות על הערך הנ"ל, יש את הפקודה הזאת:

http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/

תודה על העזרה!

נ.ב.

אם יש למישהו דרך טובה יותר, אנא, האר את עיניי.

פורסם

הרעיון התיאורטי שלך סבבה, אבל יש לך שגיאות במימוש: על מנת לאכלס מחרוזת, גודל המערך שלך צריך להיות לפחות 1 יותר מאורך המחרוזת המקסימלי (המקום הנוסף הוא בשביל ה-null terminator).

אם אתה מראש יודע שהמשתמש עומד להכניס מספר, אתה יכול לעשות עוד משהו - קרא תו אחד מהקלט באמצעות getc או getchar. אם התו הוא '-' אז תרשום לך את זה, ותקרא את שאר המספר עם scanf. אם התו הוא לא מינוס, תחזיר אותו לקלט באמצעות ungetc ואז תקרא את כל המספר עם scanf.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים