לוגו אתר Fresh          
 
 
  אפשרות תפריט  ראשי     אפשרות תפריט  צ'אט     אפשרות תפריט  מבזקים     אפשרות תפריט  צור קשר     חץ שמאלה ‎print ‎"Hello World!"; if‎ ‎not rules.‎know ‎then rules.‎read(); חץ ימינה  

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



  #1  
ישן 12-05-2007, 12:54
  סנאיקס סנאיקס אינו מחובר  
 
חבר מתאריך: 05.11.06
הודעות: 45
פוינטר ב C

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

אז,עובד, אבל אם אני "מבטל" את

קוד:
// ppos point on positives numbers in arr >>>> problematic part if in split() for(i=j=0 ; i<size ; i++) if(arr[i]>=0) ppos[j++]=arr[i];
mainב-


ומפעיל את
קוד:
// ppos point on positives numbers in arr /*for(i=j=0 ; i<sz ; i++) { if(v[i]>=0) p_ppos[j++]=&v[i]; }*/


בתוך הפונקציה זה עובר קומפילציה, רץ, אבל אני מקבל שגיעה ביציאה של התוכנית
(stack around the variable ppos was corrupted)
אבל זאת לא בעיה של אלוקציה כי זה עובד כל עוד החלק הזה מחוץ לפונקציה.

אני מעריך שיש לי בעיה בסינטקס פה
p_ppos[j++]=&v[i];


הנה כל התוכנית ,כדי להריץ יש כאלה שצריכים להוריד את
#include "stdafx.h"
קוד:
#include "stdafx.h" #include <stdlib.h> #include <string.h> void split(int **,int *,int *,int *,int); void main() { int arr[100],size=0,*ppos=NULL,pos_cnt,neg_cnt,i,j; puts("Please, Fill up to 100 natural numbers."); do//filling the array (until 100 or input 0) { scanf("%d",&arr[size++]); } while(size<100 && arr[size-1]); split(&ppos,&pos_cnt,&neg_cnt,arr,size); // ppos point on positives numbers in arr >>>> problematic part if in split() for(i=j=0 ; i<size ; i++) if(arr[i]>=0) ppos[j++]=arr[i]; puts("The positive numbers are:"); for(i=0;i<pos_cnt;i++) printf("%d ",ppos[i]); fflush(stdin); getchar(); } void split(int **p_ppos,int *p_pos_cnt,int *p_neg_cnt,int *v,int sz) { int i,j; //how many positives nums in arr(in main - "v" here) for(*p_pos_cnt=*p_neg_cnt=i=0 ; i<sz ; i++) { if(v[i]<0) (*p_neg_cnt)++; else (*p_pos_cnt)++; } //allocation for ppos (in main), for positives numb *p_ppos=(int *)malloc(*p_pos_cnt*sizeof(int *)); // ppos point on positives numbers in arr /*for(i=j=0 ; i<sz ; i++) { if(v[i]>=0) p_ppos[j++]=&v[i]; }*/ }


תודה
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #3  
ישן 13-05-2007, 21:09
  סנאיקס סנאיקס אינו מחובר  
 
חבר מתאריך: 05.11.06
הודעות: 45
בתגובה להודעה מספר 1 שנכתבה על ידי סנאיקס שמתחילה ב "פוינטר ב C"

קודם כל תודה...
(אגב, מצאתי את הפתרון...)

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

כי איך שכתבתי בהתחלה זו רק חלק מתרגיל, ובהמשך יש מצב ש i מתקדם ולא j , בעצם j מתקדם רק שהערך חיובי...
הנה אותו חלק מתוקן... אפשר גם לראות את הצורך באינדקסים שונים...
קוד:
for(i=j=k=0 ; i<sz ; i++) { if(v[i]>=0) (*p_ppos)[j++]=v[i]; else (*p_pneg)[k++]=v[i]; }


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

קוד:
// split.c : Defines the entry point for the console application. // #include "stdafx.h" #include <stdlib.h> #include <string.h> void split(int **,int **,int *,int *,int *,int); void main() { int arr[100],size=0,*ppos=NULL,*pneg=NULL,pos_cnt,neg_cnt,i; puts("Please, Fill up to 100 natural numbers, finish by zero"); do{ //filling the array (until 100 or input 0) scanf("%d",&arr[size++]); }while(size<100 && arr[size-1]); size-=1; split(&ppos,&pneg,&pos_cnt,&neg_cnt,arr,size); puts("The positives numbers are:"); for(i=0;i<pos_cnt;i++) printf("%d ",ppos[i]); puts("\n\nThe negatives numbers are:"); for(i=0;i<neg_cnt;i++) printf("%d ",pneg[i]); free(ppos); free(pneg); fflush(stdin); getchar(); } void split(int **p_ppos,int **p_pneg,int *p_pos_cnt,int *p_neg_cnt,int *v,int sz) { int i,j,k,temp; int *p_buff,*n_buff; //how many pos/neg nums in were filled in arr for(*p_pos_cnt=*p_neg_cnt=i=0 ; i<sz ; i++) { if(v[i]<0) (*p_neg_cnt)++; else (*p_pos_cnt)++; } //allocation for ppos/pneg (in main), for positives numb p_buff=(int *)malloc(*p_pos_cnt*sizeof(int *)); if(p_buff!=NULL) *p_ppos=p_buff; n_buff=(int *)malloc(*p_neg_cnt*sizeof(int *)); if(n_buff!=NULL) *p_pneg=n_buff; //Sorting arr for(i=sz-1;i>0;i--) for(j=0;j<i;j++) if(v[j]>v[j+1]) { temp=v[j]; v[j]=v[j+1]; v[j+1]=temp; } // Filling ppos and pneg for(i=j=k=0 ; i<sz ; i++) { if(v[i]>=0) (*p_ppos)[j++]=v[i]; else (*p_pneg)[k++]=v[i]; } }


תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

כלי אשכול חפש באשכול זה
חפש באשכול זה:

חיפוש מתקדם
מצבי תצוגה דרג אשכול זה
דרג אשכול זה:

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

קוד vB פעיל
קוד [IMG] פעיל
קוד HTML כבוי
מעבר לפורום



כל הזמנים המוצגים בדף זה הם לפי איזור זמן GMT +2. השעה כעת היא 00:11

הדף נוצר ב 0.04 שניות עם 12 שאילתות

הפורום מבוסס על vBulletin, גירסא 3.0.6
כל הזכויות לתוכנת הפורומים שמורות © 2024 - 2000 לחברת Jelsoft Enterprises.
כל הזכויות שמורות ל Fresh.co.il ©

צור קשר | תקנון האתר