Προς το περιεχόμενο

memcpy ... related


OneDreamCloser

Προτεινόμενες αναρτήσεις

Δημοσ.

καλημερα,

 

προσπαθω να τρεξω τον μικρο κωδικα που εμφανιζεται παρακατω,

αλλα μου εμφανιζει 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 για το ενδιαφερον,

 

το Ν εχει τιμη 10000, που σημαινει οτι οταν θα εκανα initialize τον πινακα char στη γραμμη 40 (overflow) θα ειχα invalid write, οποτε το λαθος δεν ειναι εκει

ο εν λογω πινακας εχει μεγεθος sqrt(10000)=100<1byte

 

το λαθος ειναι στην memcpy που οντως παιζει κατι με το μεγεθος του πινακα,

αλλα δε ξερω ακριβως τι αλλο ειναι

Δημοσ.
σε ευχαριστω 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 νομίζω έχει δίκιο.

Δημοσ.

"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;
}

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...