Seuls les membres ayant 30 points peuvent parler sur le chat.

Forum Casio - Autres questions


Index du Forum » Autres questions » allocation dynamique
Darkjura Hors ligne Membre Points: 277 Défis: 0 Message

allocation dynamique

Posté le 22/11/2020 10:44

Bonjour !

Considérez ce code :
int handle=0,taille;
char*s=NULL;

handle=Bfile_OpenFile(LivreTXT,_OPENMODE_READ);
taille=Bfile_GetFileSize(handle);

s=malloc(taille+1);

Bfile_ReadFile(handle,s,taille,-1);
Bfile_CloseFile(handle);

free(s);


Je programme en C, avec le SDK.
Il n'y a aucun problème au niveau du fichier ouvert, car ça marchait sans allocution dynamique (avec une taille de tableau fixe, du coup).
Pour ceux auxquels le code pourrait paraître flou, j'essaye en fait de créer un tableau de char de la taille du fichier ouvert. Mais le SDK renvoie ces deux erreurs lors de la compilation :
C:\Users\acjur\OneDrive\Documents\CASIO\fx-9860G SDK\Dragons\DRAGONS.c(72) : C2225 (E) Undeclared name "NULL"
C:\Users\acjur\OneDrive\Documents\CASIO\fx-9860G SDK\Dragons\DRAGONS.c(77) : C2222 (E) Type not compatible for "="


(Evidemment les numéros de ligne ne sont pas les bons, je ne vous ai pas donné tout le code !)

Ca m'énerve vraiment, parce que je suis sûr que j'ai fait une erreur débile. Alors si quelqu'un pourrait me la situer, je le remercierais beaucoup

Merci d'avance


Lephenixnoir Hors ligne Administrateur Points: 18801 Défis: 142 Message

Citer : Posté le 22/11/2020 10:50 | #


Oh mais tout va bien là. C'est que des erreurs banales.

Le SDK a un compilateur coincé au C89, et donc pas très flexible.

NULL c'est une macro, tu dois inclure <stddef.h> pour qu'elle soit définie. (<stdio.h> et <stdlib.h> incluent déjà <stddef.h>. Comme malloc() et free() sont déclarés dans <stdlib.h>, tu devrais déjà avoir NULL. Vérifie que tu as inclus <stdlib.h>.)
malloc() ne sait pas quel type de données tu veux utiliser et du coup renvoie un void *, c'est un "pointeur universel". Les versions suivantes de C te permettent de stocker un void * dans n'importe quel pointeur mais C89 est assez chiant. Tu es obligé de cast explicitement :

s = (char *)malloc(taille+1);

PS. Allocation (on alloue des ressources), pas allocution.
Darkjura Hors ligne Membre Points: 277 Défis: 0 Message

Citer : Posté le 22/11/2020 10:59 | #


Non, je n'avais pas inclus <stdlib.h>...

Je le rajoute, et, sans modifier la ligne du malloc, la compilation réussit !
Comment c'est possible ???
(plus exactement, j'ai rajoute #include "stdlib.h". Et donc au passage, c'est quoi le différence entre <> et " " ?)
Potter360 Hors ligne Membre Points: 266 Défis: 0 Message

Citer : Posté le 22/11/2020 10:59 | #


Lephenixnoir a écrit :
PS. Allocation (on alloue des ressources), pas allocution.

N'empêche, Macron loue les ressources de la télé pour faire des allocutions, et pas des allocations
Une signature...
Lephenixnoir Hors ligne Administrateur Points: 18801 Défis: 142 Message

Citer : Posté le 22/11/2020 11:02 | #


Darkjura a écrit :
Je le rajoute, et, sans modifier la ligne du malloc, la compilation réussit !
Comment c'est possible ???

Ah, c'est parce que sans <stdlib.h> le compilateur a essayé de deviner le prototype de malloc() et dans ce cas il considère toujours que la valeur de retour est de type int (c'est encore vrai avec les compilateurs modernes). Et int/char * ça passe pas trop bien.

Donc my bad, tu peux bien assigner un void * à n'importe quel pointeur. Je me souviens d'un problème de ce genre mais ça devait être une autre situation.

(plus exactement, j'ai rajoute #include "stdlib.h". Et donc au passage, c'est quoi le différence entre <> et " " ?)

C'est subtil mais en gros "" est approprié pour inclure un en-tête dans le dossier où se trouve ton fichier source et <> est approprié pour les en-têtes standard et installés dans le système. Utilise toujours <> pour les en-têtes standard.
Darkjura Hors ligne Membre Points: 277 Défis: 0 Message

Citer : Posté le 22/11/2020 11:04 | #


OK, merci Lephé !!

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
Pour coloriser votre code, cliquez ici.
Sinon cliquez sur le bouton ci-dessous.
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2020 | Il y a 62 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd