[C] Problème de pointeur

Problème de pointeur [C] - C - Programmation

Marsh Posté le 23-04-2020 à 14:54:48    

Bonjour !  
 
Je dois faire un jeux, jouable à 2 ou 3 joueurs, pour cela j'ai besoin d'une structure que j'ai nommé Player.  
J'ai voulu demander le nombre de "joueurs" à l'utilisateur, et faire une boucle for pour générer des joueurs en fonction du nombre qu'il entre, comme ceci :  
 

Code :
  1. int playerNumbers = 0;
  2. while (playerNumbers != 2 || playerNumbers != 3)
  3. {
  4.  printf("How many players are you ? 2 or 3 ? : \n" );
  5.  scanf_s("%d", playerNumbers);
  6. /* Erreur ici : Exception non gérée à 0x7A72F2F6 (ucrtbased.dll) dans Wheel.exe : Un paramètre non valide a été passé à une fonction qui considère les paramètres non valides comme une cause d'erreur irrécupérable.*/
  7. }
  8.           // La boucle se répète 2 ou 3 fois
  9. for (int i = 0; i < playerNumbers; i++)
  10. {
  11.  Player* player;
  12.  if (i == 0)
  13.  {
  14.   player = &j1;
  15.  }
  16.  else if (i == 1)
  17.  {
  18.   player = &j2;
  19.  }
  20.  player = &j3;
  21.  char tempo[50];
  22.  printf("Enter your name : " );
  23.  fgets(tempo, BUFFER_SIZE, stdin);
  24.  i = 0;
  25.  while (tempo[i] != '\n') {
  26.   i++;
  27.  }
  28.  player->name = malloc(i * sizeof(char));
  29.  strncpy_s(player->name, i, tempo, i);
  30.  player->bank = 0;
  31.  player->score = 0;
  32.  player->ExtraTurn = 0;
  33.  player->win = 0;
  34. }


 
MAIS ! Problème : Erreur à ma ligne scanf_s (voir le commentaire), et enfin j'ai une fenêtre qui s'ouvre et qui me dit en gros que dans un fichier "input.h" à la ligne 1567  
Expression : result_pointer != nullptr
 
Je n'ai jamais eu à faire avec ces erreurs, et je me demandais s'il n'y avais pas besoin d'un double pointeur ?
Merci d'avance pour vos réponses,
Cordialement.

Reply

Marsh Posté le 23-04-2020 à 14:54:48   

Reply

Marsh Posté le 23-04-2020 à 15:21:04    

Il suffit de lire la doc...

Citation :

The scanf_s function reads data from the standard input stream, stdin, and writes it into argument. Each argument must be a pointer to a variable type that corresponds to the type specifier in format. If copying occurs between strings that overlap, the behavior is undefined.


(encore une doc pas terrible : chaque argument doit être l'adresse d'une zone mémoire inscriptible de taille compatible avec celle d'une variable du type spécifié dans le format)
Donc scanf_s("%d", &playerNumbers); devrait améliorer les choses.
 
A+,


Message édité par gilou le 23-04-2020 à 15:25:11

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 23-04-2020 à 15:29:58    

Autre chose: Une bonne pratique c'est de vérifier la valeur de malloc (!=NULL) et aussi tu utilises BUFFER_SIZE pour fgets mais ton tableau est déclaré autrement (valeur fixe de 50). Si tu veux d'autres conseils du genre poste le code complet compilable.
 
Et j'espère que tu as activé les warnings sur ton compilateur? C'est obligatoire! (dans le sens "Une TRÈS bonne idée, surtout quand on débute mais pas que" )

Reply

Marsh Posté le 23-04-2020 à 15:53:44    

Merci déjà pour les réponses !  
 
J'ai changé mon code, et aussi la condition qui était fausse  :pt1cable: :
 

Code :
  1. void PlayerNumbers() {
  2. int playerNumbers = 0;
  3. while (playerNumbers != 2 && playerNumbers != 3)
  4. {
  5.  printf("How many players are you ? 2 or 3 ? : \n" );
  6.  scanf_s("%d", &playerNumbers);
  7. }
  8. for (int i = 0; i < playerNumbers; i++)
  9. {
  10.  Player* player;
  11.  if (i == 0)
  12.  {
  13.   player = &j1;
  14.  }
  15.  else if (i == 1)
  16.  {
  17.   player = &j2;
  18.  }
  19.  else
  20.  {
  21.   player = &j3;
  22.  }
  23.  char tempo[50];
  24.  printf("Enter your name : " );
  25.  fgets(tempo, BUFFER_SIZE, stdin);
  26.  i = 0;
  27.  while (tempo[i] != '\n') {
  28.   i++;
  29.  }
  30.  player->name = malloc(i * sizeof(char));
  31.  strncpy(player->name, tempo);
  32.  player->bank = 0;
  33.  player->score = 0;
  34.  player->ExtraTurn = 0;
  35.  player->win = 0;
  36. }
  37. if (playerNumbers == 2)
  38. {
  39.  wheelTurn(&j1, &j2);
  40. }
  41.  wheelTurn2(&j1, &j2, &j3);
  42. }


 
ET VOICI LA STRUCTURE PLAYER :  
 

Code :
  1. typedef struct Player Player;
  2. struct Player {
  3.  char name;
  4.  int bank;
  5.  int score;
  6.  int ExtraTurn;
  7.  int win;
  8. };


 
Malheureusement, je voudrais enfaîte, faire la boucle for, et à chaque itération, entrer le nom du joueur, sauf que ici, je ne peux même pas entrer de caractère puisque j'ai une violation d'accès :( !
 
Je voulais entrez un prénom, et utiliser strncpy(destination, source) pour allouer à mon player->name, un pseudo.
Le problème est-il dans le fait que player->name est un char, alors que tempo est un tableau de char ?
 
J'espère ne pas avoir embrouillé vos cerveaux.  
Je sens que j'utilise mal la fonction strncpy(), mais je ne trouve pas  

Reply

Marsh Posté le 23-04-2020 à 16:56:55    

Ton code ne compile pas. Il manque j1, j2, BUFFER_SIZE, wheelTurn() et wheelTurn2(). Si tu veux de l'aide il faut toujours faciliter la tâche aux aidants et donner un code qui compile.
 
Sinon, pour ton problème: Soit dans ta structure tu déclares un tableau (soit char name[BUFFER_NAME]) soit un pointeur vers un espace mémoire que tu réserves avec malloc(). Pour s'entraîner 2) c'est très bien, sinon faire simple et prendre la première méthode.
 
Essaye et si tu n'y arrives pas poste ton code complet.
 
PS: C'est quel compilateur ça? scanf_s il ne connait pas le GCC.

Reply

Marsh Posté le 23-04-2020 à 17:40:04    

C'est le compilateur de Visual Studio, scanf ne marche quasiment jamais, scanf_s est la vesion " sécurisée" de la fonction !
 
Je vais essayer toutes vos réponses !

Reply

Marsh Posté le 23-04-2020 à 18:46:00    

Pour utiliser scanf, il faut jouter /D _CRT_SECURE_NO_WARNINGS dans la ligne de commande de compilation.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed