Помогите откомпилировать код

ребята, огромная просьба откомпилировать следующий код и выложить сюда то, что он выдаёт, а также версию компилятора и ОС. Сразу говорю: программировать я пока только учусь, но по-моему что-то тут не так.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
void xchg(void *one, void *two, size_t size){
        void *tmp = malloc(size);
        memcpy(tmp,one,size);
        memcpy(one,two,size);
        memcpy(two,tmp,size);
        free(tmp);
}
void shuffle(void *ptr, size_t size, int num){
        int i;
        void *dst;
        void *wrk;
        void *tmp = malloc(size);
                        
        wrk = ptr;
        srand((unsigned int)time(NULL));
        for(i=0;i<num;i++){
            dst = ptr + (rand() % num)*size;
            xchg(wrk,dst,size);
            wrk+=size;
        }
        free(tmp);
}
int main(){
    int **twodim;
    int *onedim;
    
    int i,j;
    int w=3,h=3;
    twodim=calloc(h,sizeof(int*));
    for(i=0;i<h;i++)
        twodim[i]=calloc(w,sizeof(int));
    onedim = calloc(h*w,sizeof(int));
    for(i=0;i<h*w;i++)
        onedim[i]=i;
    shuffle(onedim,sizeof(int),w*h);
    for(j=0;j<h;j++)
        for(i=0;i<w;i++){
            twodim[i,j]=onedim[j*w+i];
            printf("%d ",twodim[i,j]);
        }
    
    puts("\n");    
    for(j=0;j<h;j++)
        for(i=0;i<w;i++)
            printf("%d ",twodim[i,j]);
    puts("\n");
    for(j=0;j<h;j++){
        for(i=0;i<w;i++){
            printf("%d ",twodim[i,j]);
        }
        putchar('\n');
    }
    free(onedim);
    free(twodim);
    return 0;
}
аналог строчки на перл? :)
а зачем memcpy в xchg?????
такие дела.
cucullus
а зачем memcpy в xchg?????
другого способа перенести данные из одной области памяти в другую мне в голову не пришло. Можно было бы конечно что-то вроде *one++=*two++; но одно другого не лучше. Но не в этом суть. Там почему-то коряво переносятся данные из двумерного массива в одномерный. Почему - я так и не смог понять. Собственно, в этом и вопрос.
overmind88
аналог строчки на перл? :)
не совсем. Код перед тобой. Программа перемешивает элементы одномерного массива и переносит их в двумерный. Только получается это почему-то очень криво. Переносится только каждый третий элемент (для случая 3x3, видимо каждый элемент кратный w). Единственное, что сейчас приходит в голову - грехи компилятора, но в MSVS у знакомых такая же фигня получается.
а если просто поменять местами указатели?
такие дела.
cucullus
а если просто поменять местами указатели?
а разве в двумерном массиве элементы подряд идут? Тоесть разве между строками нет промежутков?
amoralyrr
Ты неправильно работаешь с двумерными массивами.
Их нужно адресовать так: array. В твоем же случае работает оператор запятая, который возвращает значение справа от себя.
eXire, 0o спасибо! Блин, я долго над этим голову ломал. Спасибо огромное. /me полгода ничего на C не писал, вот оно и забылось.
amoralyrr
а разве в двумерном массиве элементы подряд идут? Тоесть разве между строками нет промежутков?
конечно. а Вы как думали? ;)

*(Array+y*XSize+x)
такие дела.
 
Зарегистрироваться или войдите чтобы оставить сообщение.