Je vous écris car je débute en langage C, je me forme sur OCR, via le cours de Mathieu Nebra.
Dans le programme ci-dessous, je cherche à créer une liste de personnes en indiquant leurs nom, prénom et âge.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Personne Personne;
struct Personne
{
char nom[100];
char prenom[100];
int *age;
};
int main ()
{
int x = 0;
printf("Combien de joueurs ? \n");
scanf ("%d", &x); // Saisir le nombre de joueurs
int i = 0;
Personne joueurs[x];
for (i = 0; i < x; i++)
{
printf ("Quel est le nom du joueur %d ? \n", i+1);
scanf ("%s", joueurs[i].nom); // Ici, ça coince, le programme ne renvoie pas la chaîne de caractères.
printf ("Quel est le prenom du joueur %d ? \n", i+1);
scanf ("%s", joueurs[i].prenom); // Idem, le programme ne renvoie pas la chaîne de caractères.
// Après tests, cela vient du \n après le %s ... //
printf ("Quel age a le joueur %d ? \n", i+1);
scanf ("%d", &joueurs[i].age);
}
for (i = 0; i < x; i++) // Séparer les deux étapes "for" pour d'abord enregistrer les joueurs et ensuite les nommer à l'écran //
{
printf ("Le joueur %d s'appelle %s %s \n", i+1, joueurs[i].prenom, joueurs[i].nom);
}
// Le programme s'arrête après le joueur 1, impossible de lui faire prendre un autre joueur.
return 0;
}
Ces erreurs ne concernent pas ton code en lui-même: le 1er message, c'est le compilateur qui te dit qu'il n'a pas su créer un fichier, le second c'est le linker qui te dit qu'il n'a pas pu linker ton programme avec les librairies nécessaires (dû au 1er message).
As-tu les droits pour écrire dans le répertoire ? Le fichier que le compilateur souhaite créer n'est-il pas ouvert ailleurs ?
Edit: orthographe
- Edité par edgarjacobs 13 octobre 2021 à 18:23:35
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
D'abord, ta variable age n'est pas définie correctement. Il faut écrire int age et non int *age. C'est déjà une bonne raison pour faire planter le programme. Mets-tu des espaces dans ton nom et ton prénom? Parce que %s s'arrête au premier "white space". C'est-à-dire espace tab, newline, return, etc.
Tu utilises une VLA (Variable Length Array) pour définir ton tableau. Ce n'est pas souhaitable.
Mais je suppose que tu n'as pas vu la mémoire dynamique avec malloc ...
- Edité par PierrotLeFou 13 octobre 2021 à 18:12:33
Le Tout est souvent plus grand que la somme de ses parties.
As-tu les droits pour écrire dans le répertoire ? Le fichier que le compilateur souhaite créer n'est-il pas ouvert ailleurs ?
J'ai bien les droits pour écrire dans le répertoire. Je précise d'ailleurs que c'est le seul programme, parmi tous ceux que j'ai faits jusqu'à présent, qui me met ce message d'erreur.
PierrotLeFou a écrit:
D'abord, ta variable age n'est pas définie correctement. Il faut écrire int age et non int *age. C'est déjà une bonne raison pour faire planter le programme. Mets-tu des espaces dans ton nom et ton prénom? Parce que %s s'arrête au premier "white space". C'est-à-dire espace tab, newline, return, etc.
Tu utilises une VLA (Variable Length Array) pour définir ton tableau. Ce n'est pas souhaitable.
Mais je suppose que tu n'as pas vu la mémoire dynamique avec malloc ...
Je vais corriger ce souci avec la variable age. Pour être très honnête, j'ai vraiment beaucoup de mal à comprendre les pointeurs et leur fonctionnement.
J'ai vu l'allocation dynamique aujourd'hui mais après avoir écrit ce code. Idem, j'ai encore du mal avec malloc ... Idéalement, il me faudrait un prof pour que je puisse bien tout assimiler mais en l'état, c'est pas possible.
- Edité par NicolasTorelli 13 octobre 2021 à 18:55:18
Les pointeurs, c'est drôlement compliqué. Je serais toi, je n'utiliserais les pointeurs que pour faire des passages par adresse, en tout cas dans un premier temps. L'allocation dynamique, ça aussi c'est compliqué (de nombreux plantages en proviennent). Je te suggère donc de continuer à suivre le cours même si tu n'as pas bien compris les pointeurs. Ça ne t'empêchera de lire et écrire dans des fichiers, par exemple : ils ont le type FILE*, mais il n'est pas indispensable de savoir pourquoi il y a une étoile (il faut juste ne pas l'oublier). Et tu n'auras qu'à manipuler des tableaux statiques.
(Ce que je dis est très personnel, c'est au cas où NicolasTorelli aurait les mêmes difficultés que j'ai eues à mes débuts en C, langage que j'ai d'abord détesté parce que je me prenais tout le temps des erreurs de segmentation...)
Salut, pour éviter d'utiliser une VLA tu peux définir une taille maximale de ton tableau et proposer à l'utilisateur de quitter la boucle quand il en a envie en faisant attention de ne pas dépasser la taille maximale. Sinon tu n'as pas besoin de manipuler des pointeurs ici mais tu dois quand même connaître un minimum la notion d'adresse car tu utilises ce concept avec scanf()
(...) Le fichier que le compilateur souhaite créer n'est-il pas ouvert ailleurs ?
+1
Comme le dit edgardjacob, si le fichier est ouvert, le compilateur ne peut le créer. Cela arrive si ton exécutable est toujours lancé au moment où tu tentes de créer une nouvelle version de ton programme.
Tu peux avoir oublié de fermer ton programme, ou, éventuellement ton programme n'est plus visible, mais s'il a crashé et ne s'est pas terminé correctement, et il peut être resté résident en mémoire.
Je suis d'accord avec l'idée de définir untableau de longueur fixe. Supposons que tu le mets de longueur 1000, ça fera environ 200000 octets en mémoire (200 Kb) Ce n'est pas la fin du monde. Et je crois que tu vas te fatiguer avant le programme ... Alors, si tu mets une longueur de 100 personnes, ce sera très bien pour avancer dans ton projet. Il y a plusieurs sites sur le web qui parlent des pointeurs. En voici un: https://web.maths.unsw.edu.au/~lafaye/CCM/c/cpoint.htm Tu peux faire une recherche avec les mots clés: langage C pointeurs etc. Je n'ai pas mis celui de Zeste de Savoir, je le trouve trop technique pour un débutant (c'est mon avis ...)
Le Tout est souvent plus grand que la somme de ses parties.
Tableau de personnes avec nom et âges
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.