Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在不同函数中更改结构中的值_C++_C_Arrays_Struct - Fatal编程技术网

C++ 在不同函数中更改结构中的值

C++ 在不同函数中更改结构中的值,c++,c,arrays,struct,C++,C,Arrays,Struct,好的,我想学习一些基本的c语言,因为在我的工作中我需要知道这一点。我已经习惯了Java,在访问和更改结构成员的值时遇到了一些麻烦 我试图建立的程序是一个简单的扑克客户端。 我有以下结构: typedef struct kort{ int draget; char farg; int nummer; struct kort *next; }kort; ` 我还有一个名为“blandaKort()”的函数,它创建了结构的52个成员,并将它们添加到

好的,我想学习一些基本的c语言,因为在我的工作中我需要知道这一点。我已经习惯了Java,在访问和更改结构成员的值时遇到了一些麻烦

我试图建立的程序是一个简单的扑克客户端。 我有以下结构:

typedef struct kort{
      int draget;
      char farg;
      int nummer;
      struct kort *next;
  }kort; `
我还有一个名为“blandaKort()”的函数,它创建了结构的52个成员,并将它们添加到一个数组中,分配了一个suit和number。代码如下:

void blandaKort(){

   char farg[4]={'S','K','R','J'};
   int nummer[14]={0,2,3,4,5,6,7,8,9,10,11,12,13,14};
   kort kortArray[52]; 
   int tempRaknare=0;
   int i;
   int j;
   kort *huvud=NULL;

   for(i=0; i<=3; i++){
           for(j=1; j<=13; j++){
           kort *huvud=NULL;
            //  kort k;

              kort *k;
              k=(kort*)malloc(sizeof(kort));

              k->farg=farg[i];
              k->nummer=nummer[j];
              k->draget=0;
              huvud=k;

            //  k.farg=farg[i];
            //  k.nummer=nummer[j];
              kortArray[tempRaknare]=*k;
              tempRaknare++;  
         }
 }
 tempRaknare, i, j =0;

 delaHand(kortArray);
void delaHand(kort kortArray[]){

 srand(time(NULL));
 int x = rand() % 52 + 1;
 int y = rand() %52+1;

 kort *k;
 k=(kort*)malloc(sizeof(kort));

 kort kortHand[2];
 //if(kortArray[x].draget!=1){
     kortHand[0]=kortArray[x];
     *k=kortArray[x];
     k->draget=1;
     kortArray[x]=*k;

   //  }
 //if(kortArray[y].draget!=1){
     kortHand[1]=kortArray[y];
     kortArray[y].draget=1;

当我打印
kortHand[]
的成员时,它会显示正确的套装和号码,但变量
draget
保持不变。
值得庆幸的是,C中的对象不是通过引用访问的。所以当你这样做的时候:

kortHand[0] = kortArray[x];

您已经创建了基础对象的副本(如Java中的
clone
)。因此,对
Kortaray[x]
的任何进一步更改都不会影响
sortHand[0]

以下功能等同于您发布的代码。不过,我已经做了一些修改,所以请指出任何需要澄清的地方

typedef struct _kort {
    int draget;
    char farg;
    int nummer;
    struct _kort *next;
} kort;

void blandaKort(void){

    char farg[4] = { 'S', 'K', 'R', 'J' };
    kort kortArray[52];
    int i;

    for(i = 0; i < 52; i++){
        kortArray[i].farg   = farg[i / 13];
        kortArray[i].nummer = i % 13 + 2;
        kortArray[i].draget = 0;
    }

    delaHand(kortArray);
}

void delaHand(kort kortArray[]){

    srand(time(NULL));
    int x = rand() % 52 + 1;
    int y = rand() % 52 + 1;

    // Note: the valid indexes of kortArray are 0 - 51.
    // x and y will have values that range from 1 - 52.
    // This is probably not what you want.

    kortArray[x].draget = 1;
    kortArray[y].draget = 1;

    // ...
}
typedef结构{
int draget;
查尔法格;
国际货币基金组织;
结构_kort*下一步;
}科特;
无效布兰达科特(无效){
char-farg[4]={'S','K','R','J'};
kort-Kortaray[52];
int i;
对于(i=0;i<52;i++){
Kortaray[i].farg=farg[i/13];
Kortaray[i].nummer=i%13+2;
Kortaray[i].draget=0;
}
德拉汉德(科尔塔雷);
}
void delaHand(kort Kortaray[]){
srand(时间(空));
int x=rand()%52+1;
int y=rand()%52+1;
//注:Kortaray的有效指标为0-51。
//x和y的值范围为1-52。
//这可能不是你想要的。
Kortaray[x].draget=1;
Kortaray[y].draget=1;
// ...
}

您的基本问题是复制一个结构,而您只想复制指针。例如,
*k=kortArray[x]复制结构的值,这样您就有了指向恰好具有相同值的两个结构的指针。相反,
k=&(kortaray[x])
将导致两个指针都指向内存中的同一个结构。上面的代码通过总是直接引用数组来避免这个问题。

有人建议我删除delaHand()中的k变量,因此我将代码改为:kortaray[x]。draget=1;kortHand[0]=Kortaray[x];并且知道它很好用。我必须承认,我在理解c中的整个引用处理时遇到了一些问题(无论何时使用指针、*或&):)