מצביע למערך - שפת C

Yaniv Bl

New member
מצביע למערך - שפת C

#include <stdio.h>
#include <stdlib.h>


int arr[5]={1,2,3,4,5};
int newA[5]={0};

int s1,s2,s3,s4,s5,s6, *p;

int main()
{
p = arr;

for (int i=0;i<5;i++)
{
newA=*(p+i);
}

//s1=*(p+0);
//s2=*(p+1);
//s3=*(p+2);
//s4=*(p+3);
//s5=*(p+4);

return 0;
}

אני מנסה להעתיק ע"י פויינטר ממערך אחד למערך שני.
הקומפילציה עוברת אבל הבעיה היא שני מריץ סימולציה יש התראה על חריגת זיכרון מהשורה
newA=*(p+i);

מה לא תקין בשורה הזו ?

תודה.
 

nocgod

New member
הבעיה...

אם אתה משתמש בVS וסיומת הקובץ אותו אתה מקמפל היא *.c (זה יוצא הפוך...) אז הבעיה שלך היא בכך שאתה עושה בתוך הfor הכרזה של i... זה דיי בעייתי כי ברגע שאתה בVS מנסה לקמפל קובץ עם סיומת .c הקומפיילר מחמיר עם הקוד ומקמפל אותו לפי התקנים של C. אם הקובץ שלך הוא עם סיומת cpp אז זה אמור לעבוד יופי.

שים לב להבדלים בקוד
#include <stdio.h>
#include <stdlib.h>

int main()
{
int arr[5]={1,2,3,4,5};
int newA[5]={0};
int i;

int s1,s2,s3,s4,s5,s6, *p;
p = arr;

for (i=0;i<5;i++)
{
newA=*(p+i);
}

s1=*(p+0);
s2=*(p+1);
s3=*(p+2);
s4=*(p+3);
s5=*(p+4);

return 0;
}


וזה הoutput שאני מקבל...
1>------ Build started: Project: blabla, Configuration: Debug Win32 ------
1> main.c
1>c:\users\nocgod\documents\visual studio 2010\projects\blabla\blabla\main.c(13): warning C4101: 's6' : unreferenced local variable
1> blabla.vcxproj -> c:\users\nocgod\documents\visual studio 2010\Projects\blabla\Debug\blabla.exe
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========


שים לב הקובץ הוא בעל סיומת *.c ושאין הכרזה על i בתוך הלולאה אלא מחוץ ללולאה בראש הפונקציה main.
 

Yaniv Bl

New member
הבעיה לא נפתרה

אני מקמפל בסביבת IAR.
נסיתי את מה שכתבת אבל עדיין זה ל עובד.
זה הפלט שמתקבל:

Address: 0x00100000 Instruction: STCLGT Opcode: 0xCDCDCDCD
Sun Aug 19 12:47:20 2012: Warning: Undefined instruction at:
Address: 0x00100004 Instruction: STCLGT Opcode: 0xCDCDCDCD
Sun Aug 19 12:47:20 2012: Warning: Undefined instruction at:
Address: 0x00100008 Instruction: STCLGT Opcode: 0xCDCDCDCD
 

nocgod

New member
לא מכיר את הסביבת עבודה הזאת

אבל אני כן יודע שהקוד ששלחתי לך עובד כי קימפלתי והרצתי אותו בVS2010...
יש מצב הסביבת עבודה לא מוגדרת? ניסית באמצעות קומפיילר אחר? אלוי החבר'ה הקצת יותר hardcore ממני ב C יוכלו לעזור לך קצת יותר...
 

Yaniv Bl

New member
קצת בעייתי

ארבעה חודשים לא נגעתי בC.כרגע אני כותב חלק מפרוייקט ומנסה לקמפל חלקים ממנו אך ללא הצלחה יתרה.
הקוד שאני כותב הוא חלק ממע' מפרוטוקול התקשורת וניסיתי לסמלץ CS וקצת להזכר בעבודה עם פויינטרים.

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

פרסאוס

New member
חומר למחשבה

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