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