Я не знаю ваше приложение, потому что вы новичок в StackOverflow, поэтому я изменил некоторый код для вашей карты в случайном порядке. Я удалил дублирование enum, а также добавил метод отображения в классе Card. Я сгенерировал случайное число из заданного диапазона с проверкой повторения. Я надеюсь, что это сработает для вас.
public enum SuitEnum
{
Hearts,
Diamonds,
Clubs,
Spades
}
public enum ValueEnum
{
Ace = 1,
Two = 2,
Three = 3,
Four = 4,
Five = 5,
Six = 6,
Seven = 7,
Eight = 8,
Nine = 9,
Ten = 10,
Jack = 11,
Queen = 12,
King = 13
}
public class Card
{
SuitEnum Suit { get; set; }
ValueEnum Value { get; set; }
public Card(SuitEnum cardSuit, ValueEnum cardValue)
{
Suit = cardSuit;
Value = cardValue;
}
public string Display()
{
return Suit + "" + Value.ToString();
}
}
public class Deck
{
public List<Card> Cards { get; set; }
public Deck()
{
Random rand = new Random();
Cards = new List<Card>();
List<int> possibleSuit = Enumerable.Range(1, 4).ToList();
List<int> listNumberSuite = new List<int>();
for (int i = 0; i < 4; i++)
{
int index = rand.Next(0, possibleSuit.Count);
listNumberSuite.Add(possibleSuit[index]);
SuitEnum suit = (SuitEnum)possibleSuit[index];
possibleSuit.RemoveAt(index);
List<int> possibleDeck = Enumerable.Range(1, 13).ToList();
List<int> listNumberDeck = new List<int>();
for (int j = 0; j < 13; j++)
{
int indexDeck = rand.Next(0, possibleDeck.Count);
listNumberDeck.Add(possibleDeck[indexDeck]);
ValueEnum deck = (ValueEnum)possibleDeck[indexDeck];
Cards.Add(new Card(suit, deck));
possibleDeck.RemoveAt(indexDeck);
}
}
foreach (Card c in Cards)
{
Console.WriteLine(c.Display());
}
}
}
Просто использование:
bar(x, y, z);
X, Y, и Z уже являются указателями - просто передают их непосредственно.
Помните - указатель является местоположением в памяти. Местоположение не изменяется. При разыменовании указателя (использующий *x =...), Вы устанавливаете значение в том местоположении. Но когда Вы передаете его в функцию, Вы просто передаете местоположение в памяти. Можно передать то же самое местоположение в другую функцию, и это хорошо работает.
В foo_function x y и z уже являются указателями (интервал*), таким образом, можно сделать панель (x, y, z).
Вы ничего не должны делать, они уже - ссылки.
int foo_function(int* x, int* y, int* z) {
bar(x, y, z);
return 0;
}
int bar(int* x, int* y, int* z) {
//some stuff
}
int foo_function(int* x, int* y, int* z) {
*x = *y * *z;
/* x, y and z are pointers to int
&x, &y and &z are pointers to pointer to int
bar expects pointers to int, so call bar as:
*/
bar(x, y, z);
return 0;
}
C не имеет никакого понятия передачи ссылкой. Параметры всегда передаются значением. Однако при использовании указателей, это значение является на самом деле указателем на фактическое значение.
Но с чем Вы делаете
foo_function(&x, &y, &z);
на самом деле пытается получить адрес указателя, который чрезвычайно бессмыслен (Вы передали бы int**
вместо int*
).
Так,
foo_function(x, y, z);
был бы корректный вызов, как x
, y
и z
уже указатели, и Вы не должны делать указывающую цепочку больше :)