2016-01-20 3 views
2

Я делаю проект, который случайным образом перемешивает 10 карт (12), но он не работает с моим кодом.Невозможно случайно перетасовать карты

#include <stdio.h> 
#include <time.h> 
#include <stdlib.h> 

void show(int[],int); 

void shuffle(int[],int,int); 

int main (void) 
{ 
    int karten[]={1,2,3,4,5,6,7,8,9,10}; 
    int n = sizeof(karten)/sizeof(int); 
    //printf("%d",n); 
    int s=12; 

    srand(time(NULL)); 
    printf("Karten vor dem Mischen: \n"); 
    show(karten,n); 
    shuffle(karten,n,s); 
    printf("Karten nach dem Mischen:\n"); 
    show(karten,n); 
    return 0; 
} 
void show(int karten[],int n) 
{ 
    for(int i=0;i<n;i++) 
    { 
     printf("%d,",karten[i]); 
    } 
    printf("\n"); 
} 
void shuffle(int karten[],int n,int s) 
{ 
    int i=0; 
    int d=0; 
    int v[]={(int)malloc(sizeof(karten))}; 
    for(int z=0;z<=s;z++) 
    { 
     i=rand()%10; 
     d=rand()%10; 
     //printf("%d-->%d\n",i,d); 
     v[i]=karten[i]; 
     v[d]=karten[d]; 
     karten[d]=v[i]; 
     karten[i]=v[d]; 

    } 
    printf("Es wurden %d Vertauschungen gemacht\n",s); 
    free(v); 
} 

Ошибка

(((process returned 255))) 

и программа разбился.

ответ

2

sizeof(karten) не указывать длину массива, см. sizeof array clarification. Просто переписать код вроде этого (не нужен другой массив):

void shuffle(int karten[],int n,int s) 
{ 
    int i=0, vi; 
    int d=0, vd; 
    for(int z=0;z<=s;z++) 
    { 
     i=rand()%10; 
     d=rand()%10; 
     vi=karten[i]; 
     vd=karten[d]; 
     karten[d]=vi; 
     karten[i]=vd; 
    } 
    printf("Es wurden %d Vertauschungen gemacht\n",s); 
} 
+0

Я думаю, вы должны объяснить * почему *. В конце концов, 'sizeof (karten)' в main действителен и, вероятно, запутан. – user694733

3

void shuffle(int karten[],int n,int s) эквивалентно
void shuffle(int *karten,int n,int s)
так int v[]={(int)malloc(sizeof(karten))}; выделяет только размер karten
, который является указателем на междунар, так 4 байта (в большинстве систем).
Из-за этого вы пытаетесь получить доступ к нераспределенной памяти.