OneDreamCloser Δημοσ. 16 Ιανουαρίου 2010 Δημοσ. 16 Ιανουαρίου 2010 καλημερα, προσπαθω να τρεξω τον μικρο κωδικα που εμφανιζεται παρακατω, αλλα μου εμφανιζει segmentation fault στη γραμμη 192, μηπως εχει κανει καμια ιδεα για το πως μπορω να ξεπερασω το προβλημα αυτο ? >#include <stdio.h> #include <stdint.h> #include <stdlib.h> #include <string.h> #include <math.h> #define N 10000 #define ITER 10 uint64_t rdtsc( void ) ; void bs2(int *, int) ; void bs2_CET(int *, int) ; int l_search(int [], int, int) ; int l_search_CET(int [], int, int) ; void sobel(char *, char *, char, unsigned, unsigned) ; inline int edge_detected(char, char) ; void sobel_CET(char *, char *, char, unsigned, unsigned) ; inline int edge_detected_CET(char, char) ; void median(char *, char *, unsigned, unsigned) ; void median_CET(char *, char *, unsigned, unsigned) ; int main( void ) { FILE *dat ; char *dat_file = "/DEBUG.dat" ; uint64_t start, stop ; long long int cycles ; int *matrix, i, visit, key ; double avg, var, dev ; char array1[(int)(sqrt(N))] ; char array2[(int)(sqrt(N))] ; matrix = (int *)malloc( sizeof(int)*N ) ; /* bs2 */ // for( i=0; i<N; i++ ) matrix[i] = (N-1)-i ; // WCET // for( i=0; i<N; i++ ) matrix[i] = i ; // BCET for( i=0; i<sqrt(N); i++ ) array1[i] = i ; if( (dat = fopen(dat_file, "a")) == NULL ) { fprintf(stderr, "ERROR : Cannot open file 'DEBUG.dat' for writing ... \n") ; fprintf(stderr, "NOTE : 'cet' is based on the filename - '%s' \n", dat_file) ; exit( EXIT_FAILURE ) ; } /* l_search */ // for( i=0; i<N; i++ ) matrix[i] = i ; // for( key=0; key<N; key+=250 ) // { avg = 0 ; var = 0 ; dev = 0 ; for( visit=1; visit<=ITER; visit++ ) { start = rdtsc() ; // bs2_CET(matrix, N) ; // l_search_CET(matrix, N, key) ; median_CET(array1, array2, (unsigned int)(sqrt(N)), (unsigned int)(sqrt(N))) ; stop = rdtsc() ; cycles = (long long int)(stop-start) ; avg = (double)(((visit-1)*avg + cycles)/visit) ; var = (double)(pow((cycles-avg), 2)) ; dev = (double)(sqrt((((visit-1)*dev + var)/visit))) ; fprintf(dat, "%d \t %lld \t %g \t %g \t %g \n", visit, cycles, avg, var, dev) ; } // } if( fclose(dat) ) { fprintf(stderr, "ERROR : Cannot close file 'DEBUG.dat' ... \n") ; } free( matrix ) ; return 0 ; } uint64_t rdtsc( void ) { uint32_t low, high ; asm( "rdtsc" : "=a" (low), "=d" (high) ) ; return ( low | (uint64_t)high << 32 ) ; } /* *********** */ /* Bubble Sort */ /* *********** */ void bs2 (int* List, int sz) { int tmp; int i,j; for (i=sz; i>=0; i--) { for (j=1; j<i; j++) { if (List[j-1] > List[j]) { tmp = List[j-1]; List[j-1] = List[j]; List[j] = tmp; } } } } void bs2_CET(int* List, int sz) { int i, j ; int src, dst ; for(i=sz; i>=0; i--) { for(j=1; j<i; j++) { src = List[j-1] ; dst = List[j] ; List[j-1] = (src <= dst) ? src : dst ; List[j] = (src > dst) ? src : dst ; } } } /* ************* */ /* Linear Search */ /* ************* */ int l_search(int array[], int n, int key) { int i ; for( i=0; i<n; i++ ) if( array[i] == key ) return i ; return -1 ; } int l_search_CET(int array[], int n, int key) { int i, index = -1 ; for( i=0; i<n; i++ ) index = (array[i] == key) ? i : index ; return index ; } /* ****** */ /* Median */ /* ****** */ void median(char* imageIn, char* imageOut, unsigned width, unsigned height) { const int matrix_size = 9; char values [matrix_size]; int i; memset(imageOut, 0, width); // scan the picture starting at second row for (i = width; i < width * (height - 1); i++) { // copy first pixels into matrix memcpy ((char*)&values, &imageIn[i-width-1], 3); memcpy ((char*)&values+3, &imageIn[i-1], 3); memcpy ((char*)&values+6, &imageIn[i+width-1], 3); // insertion sort with the matrix { int x, min; char tmp; for (x=0; x<9; x++) { tmp = values[x]; min = x; while ( (min>0) && (values[min-1]>tmp) ) { values[min] = values [min-1]; min--; } values[min] = tmp; } } // end of insertion sort with the matrix // store median value in pixel considered imageOut[i] = values[4]; memset(imageOut+i, 0, width); } } void median_CET(char* imageIn, char* imageOut, unsigned width, unsigned height) { const int matrix_size = 9 ; char values[matrix_size] ; int i ; memset(imageOut, 0, width) ; // scan the picture starting at second row for (i = width; i < width * (height - 1); i++) { // copy first pixels into matrix memcpy((char*)&values, &imageIn[i-width-1], 3) ; memcpy((char*)&values+3, &imageIn[i-1], 3) ; memcpy((char*)&values+6, &imageIn[i+width-1], 3) ; // insertion sort with the matrix { int x, min ; char tmp ; for( x=0; x<9; x++ ) { tmp = values[x] ; for( min=x; min>0; min-- ) values[min] = (values[min-1]>tmp) ? values[min-1] : values[min] ; values[min] = tmp ; } } // end of insertion sort with the matrix // store median value in pixel considered imageOut[i] = values[4] ; memset(imageOut+i, 0, width) ; } }
virxen75 Δημοσ. 16 Ιανουαρίου 2010 Δημοσ. 16 Ιανουαρίου 2010 > char array1[Ν];//(int)(sqrt(N))] ; char array2[Ν];//(int)(sqrt(N))] ; έχει να κάνει με την διάσταση του πίνακα.
OneDreamCloser Δημοσ. 16 Ιανουαρίου 2010 Μέλος Δημοσ. 16 Ιανουαρίου 2010 σε ευχαριστω virxen75 για το ενδιαφερον, το Ν εχει τιμη 10000, που σημαινει οτι οταν θα εκανα initialize τον πινακα char στη γραμμη 40 (overflow) θα ειχα invalid write, οποτε το λαθος δεν ειναι εκει ο εν λογω πινακας εχει μεγεθος sqrt(10000)=100<1byte το λαθος ειναι στην memcpy που οντως παιζει κατι με το μεγεθος του πινακα, αλλα δε ξερω ακριβως τι αλλο ειναι
jstark Δημοσ. 16 Ιανουαρίου 2010 Δημοσ. 16 Ιανουαρίου 2010 σε ευχαριστω virxen75 για το ενδιαφερον, το Ν εχει τιμη 10000, που σημαινει οτι οταν θα εκανα initialize τον πινακα char στη γραμμη 40 (overflow) θα ειχα invalid write, οποτε το λαθος δεν ειναι εκει ο εν λογω πινακας εχει μεγεθος sqrt(10000)=100<1byte το λαθος ειναι στην memcpy που οντως παιζει κατι με το μεγεθος του πινακα, αλλα δε ξερω ακριβως τι αλλο ειναι To μέγεθος των πινάκων array1 και array2 είναι 100, ενώ εσύ κάνεις loop με index >for (i = width; i < width * (height - 1); i++) { O virxen75 νομίζω έχει δίκιο.
Evgenios1 Δημοσ. 16 Ιανουαρίου 2010 Δημοσ. 16 Ιανουαρίου 2010 "segmentation fault στη γραμμη 192" break point εκει και δες τι γινετε με step over. Απλα υπαρχουν μερικα πραματα που δεν τα βλεπεις με γυμνο ματι πχ > #include <stdlib.h> #include <cstring> char *str = "Hello"; int main() { char buffer1[10]; char buffer2[10]; memset(buffer2,'?',10); memcpy(buffer1-10,str,6); printf("%s",buffer2); getchar(); return 0; }
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.