amoralyrr |
|
Темы:
3
Сообщения:
24
Участник с: 23 марта 2008
|
ребята, огромная просьба откомпилировать следующий код и выложить сюда то, что он выдаёт, а также версию компилятора и ОС. Сразу говорю: программировать я пока только учусь, но по-моему что-то тут не так.#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; } |
overmind88 |
|
Темы:
0
Сообщения:
278
Участник с: 15 июля 2007
|
аналог строчки на перл? :) |
cucullus |
|
Темы:
257
Сообщения:
3438
Участник с: 06 июня 2007
|
а зачем memcpy в xchg?????
такие дела.
|
amoralyrr |
|
Темы:
3
Сообщения:
24
Участник с: 23 марта 2008
|
cucullusдругого способа перенести данные из одной области памяти в другую мне в голову не пришло. Можно было бы конечно что-то вроде *one++=*two++; но одно другого не лучше. Но не в этом суть. Там почему-то коряво переносятся данные из двумерного массива в одномерный. Почему - я так и не смог понять. Собственно, в этом и вопрос. |
amoralyrr |
|
Темы:
3
Сообщения:
24
Участник с: 23 марта 2008
|
overmind88не совсем. Код перед тобой. Программа перемешивает элементы одномерного массива и переносит их в двумерный. Только получается это почему-то очень криво. Переносится только каждый третий элемент (для случая 3x3, видимо каждый элемент кратный w). Единственное, что сейчас приходит в голову - грехи компилятора, но в MSVS у знакомых такая же фигня получается. |
cucullus |
|
Темы:
257
Сообщения:
3438
Участник с: 06 июня 2007
|
а если просто поменять местами указатели?
такие дела.
|
amoralyrr |
|
Темы:
3
Сообщения:
24
Участник с: 23 марта 2008
|
cucullusа разве в двумерном массиве элементы подряд идут? Тоесть разве между строками нет промежутков? |
exire |
|
Темы:
5
Сообщения:
181
Участник с: 25 ноября 2006
|
amoralyrr Ты неправильно работаешь с двумерными массивами. Их нужно адресовать так: array. В твоем же случае работает оператор запятая, который возвращает значение справа от себя. |
amoralyrr |
|
Темы:
3
Сообщения:
24
Участник с: 23 марта 2008
|
eXire, 0o спасибо! Блин, я долго над этим голову ломал. Спасибо огромное. /me полгода ничего на C не писал, вот оно и забылось. |
cucullus |
|
Темы:
257
Сообщения:
3438
Участник с: 06 июня 2007
|
amoralyrrконечно. а Вы как думали? ;) *(Array+y*XSize+x)
такие дела.
|