Re: byte copy

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, Oct 20, 2014 at 12:12:06AM +0200, Bogdan Cristea wrote:
> 
> > On 20 Oct 2014, at 00:10, John de la Garza <john@xxxxxxxxx> wrote:
> > 
> > On Sun, Oct 19, 2014 at 11:42:26PM +0200, Bogdan Cristea wrote:
> >> 
> >>> On 19 Oct 2014, at 23:32, John de la Garza <john@xxxxxxxxx> wrote:
> >>> 
> >>> Can anone see why these two pieces of code would behave differently?
> >>> They are used in a mergesort merge
> >>> 
> >>> the top one ends up with c (cp points to an offset in c)
> >>> 1 2 3 1
> >>> 
> >>> the bottom one (not commented out)
> >>> results in 1 2 3 4 (correct)
> >>> 
> >>>       /*
> >>>       if (alen == 0)
> >>>               memcpy(cp, bp, blen);
> >>>       else if (blen == 0){
> >>>               memcpy(cp, ap, alen);
> >>>       }
> >>>       */
> >>>       if (alen == 0)
> >>>               while (blen--)
> >>>                       *cp++ = *bp++;
> >>>       else
> >>>               while (alen--)
> >>>                       *cp++ = *ap++;
> >>> 
> >>> 
> >>> if you want to read it with more context see below
> >>> ---------------------------------------------------
> >>> 
> >>> #include <stdio.h>
> >>> #include <string.h>
> >>> #include <stdlib.h>
> >>> 
> >>> void pr_array(int *a, int len)
> >>> {
> >>> 	int i;
> >>> 	for (i = 0; i < len; i++)
> >>> 		printf("%d ", a[i]);
> >>> 	printf("\n");
> >>> }
> >>> void merge(int *a, int alen, int *b, int blen, int *c)
> >>> {
> >>> 	int *ap = a;
> >>> 	int *bp = b;
> >>> 	int *cp = c;
> >>> 
> >>> 	while (alen && blen) {
> >>> 		if (*ap <= *bp) {
> >>> 			*cp++ = *ap++;
> >>> 			alen--;
> >>> 		} else{
> >>> 			*cp++ = *bp++;
> >>> 			blen--;
> >>> 		}
> >>> 	}
> >>> 	if (alen == 0)
> >>> 		memcpy(cp, bp, blen);
> >>> 	else if (blen == 0){
> >>> 		memcpy(cp, ap, alen);
> >>> 	}
> >>> 	/*
> >>> 	if (alen == 0)
> >>> 		while (blen--)
> >>> 			*cp++ = *bp++;
> >>> 	else
> >>> 		while (alen--)
> >>> 			*cp++ = *ap++;
> >>> 	*/
> >>> }
> >>> 
> >>> void msort(int *arr, int len)
> >>> {
> >>> 	int mid = len / 2;
> >>> 	int llen = mid;
> >>> 	int rlen = len - mid;
> >>> 	int *l = malloc(llen);
> >>> 	int *r = malloc(rlen);
> >>> 	int i;
> >>> 
> >>> 	if (len <= 1)
> >>> 		return;	
> >>> 	for (i = 0; i < llen; i++)
> >>> 		l[i] = arr[i];
> >>> 	for (i = mid; i < mid + rlen; i++)
> >>> 		r[i-mid] = arr[i];
> >>> 	msort(l, llen);
> >>> 	msort(r, rlen);
> >>> 	merge(l, llen, r, rlen, arr);
> >>> 	free(l);
> >>> 	free(r);
> >>> }
> >>> int main()
> >>> {
> >>> 	int arr[] = {4,3, 2, 1};
> >>> 	int len = sizeof(arr) /sizeof(int);
> >>> 	int x[] = {1,3,5,7};
> >>> 	int y[] = {2,4,6,8};
> >>> 
> >>> 	msort(arr, len);
> >>> 	pr_array(arr, len);
> >>> 	return(0);
> >>> }
> >> 
> >> memcpy does not work for overlapping memory, use memmove instead
> >> 
> > Where does it overlap?  I found a big problem, I was passing in size
> > instead of size * sizeof(int).
> 
> My intention was to point a possible error source, I haven’t looked carefully at your code.
> 
thanks

I just ran valgrind and realized I made the same mistake in many places
--
To unsubscribe from this list: send the line "unsubscribe linux-c-programming" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Assembler]     [Git]     [Kernel List]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [C Programming]     [Yosemite Campsites]     [Yosemite News]     [GCC Help]

  Powered by Linux