GeorgeMame
BANNED | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Реализация алгоритма Джонсона-Троттера для генерации перестановок под Linux'ом проходит нормально (icc): 123 132 231 321 312 213 , а под виндами получаю ошибку: для icl Код: jt_perm.c jt_perm.c(86): error: expression must be a pointer to a complete object type memcpy(h->buffer, array + h->elems[i].integer * h->size, h->size); ^ jt_perm.c(87): error: expression must be a pointer to a complete object type memcpy(array + h->elems[i].integer * h->size, ^ jt_perm.c(88): error: expression must be a pointer to a complete object type array + h->elems[j].integer * h->size, h->size); ^ jt_perm.c(89): error: expression must be a pointer to a complete object type memcpy(array + h->elems[j].integer * h->size, h->buffer, h->size); | ^ а для cl Код: jt_perm.c(86) : error C2036: void *: неизвестный размер jt_perm.c(87) : error C2036: void *: неизвестный размер jt_perm.c(88) : error C2036: void *: неизвестный размер jt_perm.c(89) : error C2036: void *: неизвестный размер | main.c: Код: #include <stdio.h> #include <stdlib.h> #include "jt_perm.h" void print(int *test, int n) { int i; for(i = 0; i < n; ++i) printf("%d", test[i]); printf("\n"); } int main(int argc, char *argv[]) { int myArray[] = { 1, 2, 3 }; size_t n_elems = sizeof(myArray) / sizeof(int); size_t size_of_elem = sizeof(int); jt_handle_t *h = jt_create(n_elems, size_of_elem); do { print(myArray, n_elems); } while(jt_next_perm(h, myArray)); jt_free(h); return 0; } | jt_perm.c: Код: #include <stdio.h> #include <stdlib.h> #include <string.h> #include "jt_perm.h" #define LEFT -1 //Directed integer internal structure typedef struct { int integer; //Original index in the array int dir; //-1 or 1 } directed_int; //Handle structure struct jt_handle { size_t n; //Number of elements directed_int *elems; //n directed integers size_t size; //Size of an element in the array void *buffer; //Zone of memory used to swap values }; //Malloc with error checking void *emalloc(size_t size) { void *p = malloc(size); if(!p) { fprintf(stderr, "Memory allocation failed(emalloc).\n"); exit(-1); } return p; } //Allocates memory and initializes the handle jt_handle_t *jt_create(size_t n, size_t size) { jt_handle_t *h = (jt_handle_t*) emalloc(sizeof(jt_handle_t)); h->n = n; h->size = size; h->elems = (directed_int*) emalloc(sizeof(directed_int) * n); h->buffer = emalloc(size); int i; for(i = 0; i < n; ++i) { h->elems[i].integer = i; h->elems[i].dir = LEFT; } return h; } //Check if it's a mobile integer int is_mobile_integer(jt_handle_t *h, int index) { int neighbor = index + h->elems[index].dir; //If the neighbor index is not in range if(neighbor < 0 || neighbor >= h->n) return 0; return (h->elems[index].integer > h->elems[neighbor].integer); } //Finds the largest mobile integer int largest_mobile_integer(jt_handle_t *h) { int i, k = -1; for(i = 0; i < h->n; ++i) if(is_mobile_integer(h, i) && ( k == -1 || h->elems[i].integer > h->elems[k].integer)) k = i; return k; } //Swap the values in the handle and in the array void swap_values(jt_handle_t *h, void *array, int i, int j) { directed_int swap_di = h->elems[i]; h->elems[i] = h->elems[j]; h->elems[j] = swap_di; memcpy(h->buffer, array + h->elems[i].integer * h->size, h->size); memcpy(array + h->elems[i].integer * h->size, array + h->elems[j].integer * h->size, h->size); memcpy(array + h->elems[j].integer * h->size, h->buffer, h->size); } int jt_next_perm(jt_handle_t *h, void *array) { int k = largest_mobile_integer(h); int neighbor = k + h->elems[k].dir; //If no mobile integers left if(k == -1) return 0; //Reverse direction for all integers > k's integer int i; for(i = 0; i < h->n; ++i) if(h->elems[i].integer > h->elems[k].integer) h->elems[i].dir *= -1; //Swap k with neighbor in h->elems and in array swap_values(h, array, k, neighbor); return 1; } void jt_free(jt_handle_t *h) { free(h->elems); free(h->buffer); free(h); } | jt_perm.h: Код: /* #ifndef JT_PERM_H #define JT_PERM_H /* Handle used to save the current state of the algorithm. */ typedef struct jt_handle jt_handle_t; /* * Create the handle used to generate the permutation for an *array of *n* elements, each element having the size *size*. */ jt_handle_t *jt_create( size_t n, size_t size ); /* * Make the next permutation in *array* by swapping only 2 values. * Returns 1 if a permutation was made. * Returns 0 if no permutation was made(i.e. the last permutation was *reached last call). */ int jt_next_perm( jt_handle_t *h, void *array ); /* * Frees the memory used by the handle. */ void jt_free( jt_handle_t *h ); #endif /*JT_PERM_H*/ | Попытка замены void на int для массива array не увенчалась успехом. | Всего записей: 141 | Зарегистр. 24-07-2015 | Отправлено: 16:24 29-09-2017 | Исправлено: GeorgeMame, 16:27 29-09-2017 |
|