menmas Δημοσ. 2 Αυγούστου 2009 Δημοσ. 2 Αυγούστου 2009 #include <stdio.h> #include <stdlib.h> //#include <time.h> #include <math.h> #include <string.h> #define LENCHAIN1 6 #define LENCHAIN2 4 #define NUMOF_SCANCHAIN1 5 #define NUMOF_SCANCHAIN2 4 struct node{ char str[25*LENCHAIN1]; int xnum; //plh8os x int posx; // 8esh ston pinaka deiktvn int posy; //8esh sth lista toy pinaka int merge; //an to sygkekrimeno exei ginei merge int mergex; int mergey; int x_tmpnum; int afmx; int check; struct node *next; }; ................. diafora strurcts...... int MergedTable[NUMOF_SCANCHAIN1]; int main(void) { ....................... } Είναι δυνατό να ορίσω τις τιμές των define μέσα απο την main,με κάποιο τρόπο; Δοκίμασα να τα έχω global και να τα διαβάζω στην main. Το πρόβλημα δημιουργείται στο struct και στον πίνακα τα οποία ο compiler βγάζει λάθος γιατί δεν υπάρχει σταθερή τιμή. (Λογικό!) Υπάρχει τρόπος να το "κοροιδέψω"; Να σημειώσω πως και τον πινακα και η δομή τα χρειάζομαι global.
teo64x Δημοσ. 2 Αυγούστου 2009 Δημοσ. 2 Αυγούστου 2009 Το #define δεν είναι run-time εντολή, είναι μια οδηγία που εκτελείται πριν γίνει το compile. Γι' αυτό που θες, το πιο λογικό που μπορώ να σκεφτώ είναι να χρησιμοποιήσεις δυναμικό πίνακα και να τον προσαρμόσεις εκ των υστέρων στο μέγεθος που θέλεις.
bxenos Δημοσ. 2 Αυγούστου 2009 Δημοσ. 2 Αυγούστου 2009 > struct node { char *str int xnum; //plh8os x int posx; // 8esh ston pinaka deiktvn int posy; //8esh sth lista toy pinaka int merge; //an to sygkekrimeno exei ginei merge int mergex; int mergey; int x_tmpnum; int afmx; int check; struct node *next; }; struct node *allocNode(size_t LENCHAIN1){ struct node *p = (struct node *)malloc(sizeof(*p)); if(p){ p->str = (char *)malloc(25 * LENCHAIN1 * sizeof(p->str[0])); if(p->str==NULL){ free(p); p = NULL; } } return p; } ................. diafora strurcts...... int *MergedTable; ...main...{ ... MergedTable = (int *)malloc(NUMOF_SCANCHAIN1 * sizeof(*MergedTable)); ... } υπάρχει και άλλος τρόπος με δέσμευση μεταβλητού μεγέθους node, αλλα θα έχεις defines για την προσβαση στις μεταβλητές, εκτός αν το str[] είναι τελευταια μεταβλητη στο struct.
menmas Δημοσ. 2 Αυγούστου 2009 Μέλος Δημοσ. 2 Αυγούστου 2009 Το δοκιμάζω με δυναμικό πίνακα int *MergedTable=(int *)malloc(MAX*sizeof(int)); // global int main () { for(i=0;i<NUMOF_SCANCHAIN1;i++) MergedTable=-1; for(i=NUMOF_SCANCHAIN1;i<=MAX;i++) free((void *)MergedTable); ....... } Μέχρι και το γέμισμα του πίνακα όλα καλά. Τον χρησιμοποι'ω κανονικα και σε άλλες συναρτησεις. Όταν προσπαθώ να κάνω free τις θέσεις που δεν χρειάζομαι τότε έχω πρόβλημα!!Κάτι σαν segmentation Χρησιμοποιώ Visual Studio και όταν πάω να δω το error ανοιγει ένα αρχειο dbgheap.c και δειχνει ότι χτυπάει σε extern "C" static int __cdecl CheckBytes( unsigned char * pb, unsigned char bCheck, size_t nSize ) { int bOkay = TRUE; while (nSize--) { if (*pb++ != bCheck) { /* Internal error report is just noise; calling functions all report results - JWM */ /* _RPT3(_CRT_WARN, "memory check error at 0x%p = 0x%02X, should be 0x%02X.\n", */ /* (BYTE *)(pb-1),*(pb-1), bCheck); */ bOkay = FALSE; } } return bOkay; } Τι κάνω λάθος?? Πως αλλιώς να ελευθερώσω τις θέσεις που δεν χρειάζομαι? ---------- Το μήνυμα προστέθηκε στις 19:25 ---------- Το δοκιμάζω με δυναμικό πίνακα int *MergedTable=(int *)malloc(MAX*sizeof(int)); // global int main () { for(i=0;i<NUMOF_SCANCHAIN1;i++) MergedTable=-1; for(i=NUMOF_SCANCHAIN1;i<=MAX;i++) free((void *)MergedTable); .......................... } Μέχρι και το γέμισμα του πίνακα όλα καλά. Τον χρησιμοποι'ω κανονικα και σε άλλες συναρτησεις. Όταν προσπαθώ να κάνω free τις θέσεις που δεν χρειάζομαι τότε έχω πρόβλημα!!Κάτι σαν segmentation Χρησιμοποιώ Visual Studio και όταν πάω να δω το error ανοιγει ένα αρχειο dbgheap.c και δειχνει ότι χτυπάει σε extern "C" static int __cdecl CheckBytes( unsigned char * pb, unsigned char bCheck, size_t nSize ) { int bOkay = TRUE; while (nSize--) { if (*pb++ != bCheck) { /* Internal error report is just noise; calling functions all report results - JWM */ /* _RPT3(_CRT_WARN, "memory check error at 0x%p = 0x%02X, should be 0x%02X.\n", */ /* (BYTE *)(pb-1),*(pb-1), bCheck); */ bOkay = FALSE; } } return bOkay; } Τι κάνω λάθος?? Πως αλλιώς να ελευθερώσω τις θέσεις που δεν χρειάζομαι?
bxenos Δημοσ. 2 Αυγούστου 2009 Δημοσ. 2 Αυγούστου 2009 τα malloc/free είναι ζευγάρια. γκόμενες/νοι δεν προβλέπονται. δηλαδή αν κάνεις malloc το int *x = malloc(32 * sizeof(*x)); πρέπει να κάνεις free το x πίνακα ολόκληρο. Δεν μπορείς να ελευθερώσεις τμήματα του (οι γκόμενες που λέγαμε).
menmas Δημοσ. 2 Αυγούστου 2009 Μέλος Δημοσ. 2 Αυγούστου 2009 > for(i=NUMOF_SCANCHAIN1;i<=MAX;i++) free((void *)MergedTable[i]); Δεν κατάλαβα πολύ καλά. Αυτό το κομμάτι δεν κάνει free? Μπορείς να με βοηθήσεις με τη σύνταξη? Πως να το κάνω το free?
bxenos Δημοσ. 3 Αυγούστου 2009 Δημοσ. 3 Αυγούστου 2009 > int *MergedTable=(int *)malloc(MAX*sizeof(int)); if(MergedTable){ .... free(MergedTable); } else fprintf(stderr,"memory full\n"); ---------- Το μήνυμα προστέθηκε στις 02:41 ---------- τι σημαίνει για σένα θέσεις που δεν χρειάζεσαι; αν πρέπει δυναμικά να προσθέτεις και να αφαιρείς στοιχεία στον πίνακα τότε πρέπει να κάνεις είτε realloc, είτε συνδεδεμένη λίστα. Μην ξεχνάς: μπορείς να κάνεις free ότι σου ήρθε σαν επιστροφη απο συνάρτηση alloc,malloc,calloc,realloc (και φυσικά να μην ήταν NULL). Αν π.χ. με malloc(5000) δεσμεύσεις 5000 bytes, μόνο μια free μπορείς να καλέσεις για να τα ελευθερώσεις (και τα 5000). Δεν ξέρω τι θέλεις να κάνεις αρα δεν μπορώ να σου πω τι σφάλμα έχεις στη λογική του αλγορίθμου σου. Ασχετο, αλλά μήπως δούλευες vb παλιότερα;
menmas Δημοσ. 3 Αυγούστου 2009 Μέλος Δημοσ. 3 Αυγούστου 2009 Έχεις δίκιο,καλύτερα να σου πω το σκεπτικό μου μηπως έτσι μπορείς να με βοηθήσεις. Αυτός ο πίνaκας οMergedTable[NUMOF_SCANCHAIN] τον χρειάζομαι global. To NUMOF_SCANCHAIN είναι μια τιμή που θα δίνεται απο το πληκτρολόγιο. Επείδη κάθε φορά μπορεί το NUMOF_SCANCHAIN να είναι διαφορετικό (4 loops)το #define NUMOF_SCANCHAIN δεν βολεύει. Μου πρότειναν να τον κάνω δυναμικό πίνακα Σκέφτομαι αν δεσμέυσω πχ 100 θέσεις και το NUMOF_SCANCHAIN έρθει 10 τις άλλες θεσεις να τις ελευθερώσω.Αυτό προσπαθούσα να κάνω . Τώρα βέβαια με έβαλες και σε άλλες σκέψεις. Όταν θα έρθει το δεύτερο NUMOF_SCANCHAIN πως θα κάνω τη δουλεια ?Εφόσον ο πινακας είναι global και το NUMOF_SCANCHAIN μπορεί να ειναι μεγαλύτερο απο το πρώτο,οπότε αν εχώ κάνει free απο το 10 και κάτω θα πρέπει να ξαναμαζέψω θέσεις!! Ελπίζω να μην σε μπέρδεψα πολύ. Το ερώτημα είναι πως μπορώ να κάνω διαχείρηση του μεγέθους ενός global πίνακα χωρίς όμως να σπαταλήσω μνήμη?(αλλιώς θα τον έκανα κανονικά με μεγάλο define NUMOF_SCANCHAIN) Καμια ιδέα? Σε Ευχαριστώ πολύ πάντως! ---------- Το μήνυμα προστέθηκε στις 09:59 ---------- Ξέχασα να σου απαντήσω όχι δεν έχω δούλεψει σε vb
bxenos Δημοσ. 3 Αυγούστου 2009 Δημοσ. 3 Αυγούστου 2009 > int *MergeTable = NULL; int main(void){ int i; for(i=0;i<10;i++){ {//δεσμευσε μόνο την επιθυμιτη διασταση στον πίνακα int *newtable = realloc(MergeTable,i * 100 * sizeof(*MergeTable)); if(newtable == NULL){ fprintf(stderr,"not enough memory\n"); break; } MergeTable = newtable; } //τωρα ο πίνακας έχει ι*100 στοιχεια } free(MergeTable); return 0; } ΣΣ: 1) η realloc αν το πρωτο όρισμα είναι NULL συμπεριφέρεται σαν την malloc. 2) Ο λόγος που χρησιμοποιώ sizeof(*MergeTable) είναι για τον υπολογισμό των bytes που πρέπει να δεσμεύσω. sizeof(*MergeTable) είναι ισο με sizeof(int) στην περίπτωση αυτή, αλλα είναι πιο ασφαλές αν κάποια φορά αλλάξω τον τύπο της MergeTable απο int * σε long *, γιατί αυτόματα το sizeof(*MergeTable) θα γίνει ίσο με sizeof(long) χωρις να χρειαστεί να το διορθώσω και μέσα στη realloc.
menmas Δημοσ. 4 Αυγούστου 2009 Μέλος Δημοσ. 4 Αυγούστου 2009 Καλησπέρα! Φίλε bxenos σε ευχαριστώ πολύ για τη βοήθεια!! Το δοκίμασα αυτό που μου έγραψες σε ενα τεστ αρχειο και δειχνει οκ!! Φαντάζομαι ότι θα παιξει καλά και όταν το κολλήσω στο κανονικό .c που δουλεύω (έχω κάποιες διορθώσεις ακόμα να κάνω για να το κολλήσω τελικά) Ευχαριστώ πολύ!! Άσχετο!Αλλά ρε παιδιά ποτε θα έρθουν διακοπές!!Έλεος!
bxenos Δημοσ. 4 Αυγούστου 2009 Δημοσ. 4 Αυγούστου 2009 Άσχετο!Αλλά ρε παιδιά ποτε θα έρθουν διακοπές!!Έλεος! ήρθαν και φύγαν... με την ταχύτητα του φωτός!
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.