Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
867 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [C] Problème de pointeur

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] Problème de pointeur

n°2352396
xameal
Posté le 23-04-2020 à 14:54:48  profilanswer
 

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.

mood
Publicité
Posté le 23-04-2020 à 14:54:48  profilanswer
 

n°2352398
gilou
Modérateur
Modzilla
Posté le 23-04-2020 à 15:21:04  profilanswer
 

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é!  --
n°2352399
rat de com​bat
attention rongeur méchant!
Posté le 23-04-2020 à 15:29:58  profilanswer
 

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" )

n°2352403
xameal
Posté le 23-04-2020 à 15:53:44  profilanswer
 

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  

n°2352407
rat de com​bat
attention rongeur méchant!
Posté le 23-04-2020 à 16:56:55  profilanswer
 

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.

n°2352414
xameal
Posté le 23-04-2020 à 17:40:04  profilanswer
 

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 !

n°2352418
Trap D
Posté le 23-04-2020 à 18:46:00  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [C] Problème de pointeur

 

Sujets relatifs
Problème de saisie clavier sur Windows 10Membre non static en pointeur sur fonction pour callback
Compter le nombre de caractères en CProbleme avec socket et SDL
Probleme avec SDL_ttfprobleme execution docker-compose en script bash
[C++] Eviter les .h dans les .hProblème avec "GtkFileChooserButton"
Problème procédures imbriquées[C] probleme sprintf et pointeur :S
Plus de sujets relatifs à : [C] Problème de pointeur


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR