Ошибка указателя при изменении с помощью точки указателя для изменения поля структуры - PullRequest
0 голосов
/ 15 сентября 2018

Я пытаюсь изменить поля внутри структуры, для этого я использую ->, но мой компилятор выдает ошибку, которая предлагает мне использовать ->. Я не совсем уверен, почему. Возможно, я неправильно создал экземпляр своей структуры?

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

typedef enum suit_s {DIAMONDS, CLUBS, HEARTS, SPADES} Suit;
enum suit_s nCard;

int rankR;
int suit1;

typedef struct card_s {
  int rank;
  Suit suit;
} *Card;

int randCard(Card* rCard);
int getSuitName(Card* rCard);

int main(int argc, char *argv[]){
  Card *rCard;
  srand( (unsigned)time( NULL ) );
  randCard(rCard);
  getSuitName(rCard) ;
  return 0;
}


int randCard(Card* rCard) {
  int max_number = 10;
  int minimum_number = 2;
  rankR =  rand() % (max_number + 1 - minimum_number) + minimum_number;
  suit1 =  rand() % (4 + 1 - 1) + 1;
  if (suit1 == 1){
    nCard = DIAMONDS;
  }else if (suit1 == 2){
    nCard = CLUBS;
  }else if (suit1 == 3){
    nCard = HEARTS;
  }else if (suit1 == 4){
    nCard == SPADES;
  }
  rCard->rank = rankR; // error here
  rCard->suit = nCard; // error here

}

Журнал компилятора:

main.c: In function 'randCard':
main.c:42:8: error: '*rCard' is a pointer; did you mean to use '->'?
   rCard->rank = rankR;
        ^~
        ->
main.c:43:8: error: '*rCard' is a pointer; did you mean to use '->'?
   rCard->suit = nCard;
        ^~
        ->

Ответы [ 2 ]

0 голосов
/ 15 сентября 2018

Поскольку у вас теперь должен быть выделенный объект Card в главном блоке, вам необходимо передать адрес rCard в функцию, поэтому необходимо обновить ваш вызов randCard и getSuitName.

Ваш оригиналссылка:

randCard(rCard);

Становится:

randCard(&rCard);

Незначительная точка, но кое-что нужно иметь в виду.

0 голосов
/ 15 сентября 2018

Вы получаете эти ошибки, потому что rCard имеет тип Card *, а Card равен typedef для указателя на struct card_s:

typedef struct card_s {
  int rank;
  Suit suit;
} *Card;
  ^^

В randCard () типпараметра rCard равен Card *, что делает указатель rCard на указатель на struct card_s.

Чтобы устранить эту проблему, либо объявите параметр rCard типа Card, либо измените typedefкак это:

typedef struct card_s {
  int rank;
  Suit suit;
} Card;

Card теперь является псевдонимом struct card_s.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...