CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C]Fonction scanf + espaces

DasHuhn
DasHuhn
Niveau 10
27 septembre 2004 à 18:33:29

" enfin dashuhn, perso je préfers faire des fonction de 3 lignes qui gère correctemet la mémoire..."
=> Justemment c´est ce que je fait, et je te reproche de t´être pris la tête pour un problème aussi simple :0

" Ben quand tu t´ammuseras avec des listes chaînées doublement circulaires imbriquées, tu seras bien obligé de gérer correctement la mémoire, parce que tu auras vite fait de la saturer pendant les phases de tests ! "
=> J´ai pas dit le contraire, mais là c´est juste pour lire l´adresse d´un fichier XD

dnob700
dnob700
Niveau 10
27 septembre 2004 à 19:11:24

" => Justemment c´est ce que je fait, et je te reproche de t´être pris la tête pour un problème aussi simple :0 "

mais quel que soit la taille de la fonction, il est primordial de ne pas faire de truc comme mathieu en avait fait c´est a dire ou la mémoire disparait à chaque appel.

même si on fonction fait 2 lignes et que pour protégé de ce problème il faille écrire 100 lignes de plus, alors ça vaut le coup.

par contre, ce que tu m´a dit c´est qu´il vaut mieu faire court que économe en mémoire ( en fait ce n´était pas un problème d´être économe, mais de ne pas la jeter par la fenêtre), je pense au contraire qu´il faut toujours privilégier le bon usage de la mémoire que la quantéti de ligne qu´on écrit.

DasHuhn
DasHuhn
Niveau 10
27 septembre 2004 à 19:15:39

Bin tout le code que tu écriras ira en mémoire à un moment donné... et plus tu feras d´appels plus ton programme sera lent. Dans de nombreux cas en effet vaut mieux bien gérer la mémoire que faire court pour faire court. Mais là je pense que c´est pas la peine de tant s´embêter.

MathieuN7
MathieuN7
Niveau 10
27 septembre 2004 à 20:16:20

le 39em message je sais pas si vous l´avez lu... revenez à la page précédente svp :)

dnob700
dnob700
Niveau 10
27 septembre 2004 à 20:47:43

euh...
je suis pas super fort, mais ej te passe un bout de code que j´ai écrit pour que tu vois

http://rafb.net/paste/results/H0rNKY12.html

mais comem tu le vois dans le commentaire, je me suis posé la même question que pour toi.
sauf que dans le mien, je croit que en fait la variable se détruit toute seul si j´attend trop longtemps ( se qui n´est pas bon non plus).

sinon, j´ai fait ça grâce au tuto de JYY : http://perso.numericable.fr/~fvirtman/info/tuto/pointeur.cpp en y allant doucement et en se disant tout le temps ce & c´est l´adresse de et * c´est ce qui est pointé par et donc que &(*truc)=truc et *(&)=truc et ça marche.

DasHuhn
DasHuhn
Niveau 10
27 septembre 2004 à 21:32:10

Mathieun> Si, jlavais vu mais j´ai pas le niveau quoi :)

jarose
jarose
Niveau 10
27 septembre 2004 à 21:59:33

http://walljv.free.fr/index.php?to=view&id=42 oui oui je sais...

dnob700
dnob700
Niveau 10
27 septembre 2004 à 22:36:35

connaissait pas le walljv.free.fr

par contre il ets vraiment pas beau, et il supporte pas le basic ( ou VB). MECHANT !

jarose
jarose
Niveau 10
27 septembre 2004 à 22:41:02

/ * et il supporte pas le basic ( ou VB) */

Tant mieux =)

DasHuhn
DasHuhn
Niveau 10
28 septembre 2004 à 19:01:44

Spa moi qui l´ai dit. Puis pour un développeur...

MathieuN7
MathieuN7
Niveau 10
28 septembre 2004 à 19:13:13

Bon j´ai trouvé, il "suffisait" de mettre *chaine entre parenthèses :rire:

Merci Jarose je vais étudier cette fonction de près :)

MathieuN7
MathieuN7
Niveau 10
09 octobre 2004 à 18:45:30

Re-salut tout le monde! :)
Alors voilà j´ai essayé de faire une fonction scanf qui ne prend en paramètre qu´un pointeur nul, et qui allouie à ce pointeur la taille juste qui correspond à la chaine saisie. Je vous montre ma fonction, qui merde un peu apparemment:

void myscanf(char **Pptr, FILE *flux)
{
*Pptr = ( char *)malloc(sizeof(char *));
int size_s = sizeof(char *);
char current;

if(*Pptr == NULL)
printf("Probleme lors de l´allocation du bloc memoire.\n");
else
{
while((current = fgetc(flux)) ! = ´\n´)
{
size_s += sizeof(char *);
*Pptr = ( char *)realloc(*Pptr, size_s);
strcat(*Pptr, &);
}
}
}

Voilà, alors si qqn pouvait me dire à quel endroit je fais qqch de mal, ça serait très sympa!!

Ah oui, et je voulais aussi savoir comment, avec gcc, je compile par exemple le fichier main.c, qui inclu myscanf.h, qui contient le prototype de myscanf, et est définie dans un fichier myscanf.c, parce que je croyais qu´il suffisait de compiler main.c, mais ça foire, et donc je créé deux objets à partir de main.c et myscanf.c, mais myscanf.h dans l´histoire? il sert à quoi? :question:

Voilà merci à vous pour vos réponses!

MathieuN7
MathieuN7
Niveau 10
09 octobre 2004 à 19:02:30

Bon, j´ai fait une petite modification:

  1. include " myscanf.h"

int myscanf(char **Pptr, FILE *flux)
{
*Pptr = ( char *)malloc(sizeof(char *));
int size_s = sizeof(char *), nbchars = 0;
char current;

if(*Pptr == NULL)
printf("Probleme lors de l´allocation du bloc memoire.\n");
else
{
while((current = fgetc(flux)) ! = ´\n´)
{
size_s += sizeof(char *);
*Pptr = ( char *)realloc(*Pptr, size_s);
if(nbchars == 0)
strcpy(*Pptr, &);
else
strcat(*Pptr, &);
nbchars++;
}
}
return nbchars;
}

Et quand j´entre " Mathieu", ça m´affiche " Ma?t?h?i?e?u?"

où chaque ? est un caractère spécial différent

Voilà :) j´espère que vous pourrez m´aider!

MathieuN7
MathieuN7
Niveau 10
09 octobre 2004 à 20:00:01

re-bon, j´ai trouvé une méthode qui me renvoie bien &,Mathieu", mais est-ce que c´est propre? à vous de me le dire...

  1. include " myscanf.h"

int myscanf(char **Pptr, FILE *flux)
{
*Pptr = ( char *)malloc(sizeof(char *));
int size_s = sizeof(char *), nbchars = 0;
char current;

if(*Pptr == NULL)
printf("Probleme lors de l´allocation du bloc memoire.\n");
else
{
while((current = fgetc(flux)) ! = ´\n´)
{
size_s += sizeof(char *);
*Pptr = ( char *)realloc(*Pptr, size_s);
if(nbchars == 0)
strcpy(*Pptr, &);
else
strncat(*Pptr, &, sizeof(char));
nbchars++;
}
}
return nbchars;
}

LGV
LGV
Niveau 28
09 octobre 2004 à 20:20:34

non, ce n´est pas propre, c´est meme ignoble :D

déjà au niveau de la nomenclature, ça prete à confusion, flux pour un FILE * ( on s´attendrait à un istream par exemple avec ce nom), size_s pour un int ( les size_bidule sont souvent utilisés pour des types définis par le compilo ou la plateforme, comme le size_t ou le size_w); Sur la forme, le fait d´allouer la mem dans la fonction n´est pas super intuitif d´un point de vue externe : si qqun utilise cette fonction, va-t-il penser à faire le free ou alors à appeler la fonction qui le fait ; mais surtout, faire des realloc en concatenant des caractère un par un, ça c´est pas bon DU TOUT :/

voilà voilà...

MathieuN7
MathieuN7
Niveau 10
09 octobre 2004 à 20:56:02

bon pour les noms ça se change, le FILE *flux vient de jarose, et je suis le seul à utiliser cette fonction donc je penserais à utiliser les free.
le size_s, size pour taille, s pour string, la taille de la chaine...

Et pkoi c pas bien les realloc?

j´en conclus que c´est pas si dégueu que ça :rire:

jarose
jarose
Niveau 10
09 octobre 2004 à 21:55:45

Les entrées/sorties standard sont des fichiers, je ne vois pas en quoi ce nom de variable est mal choisi...

Pour ce qui est des realloc à chaque char, il faut vraiment aimer le gruyère, et à trop forte dose, ça devient dégeulasse et on vomi ( :

Pourquoi tu t´obstines à traiter char par char ? C´est lent.

MathieuN7
MathieuN7
Niveau 10
09 octobre 2004 à 22:23:04

et ben donne moi une solution :)

LGV
LGV
Niveau 28
09 octobre 2004 à 22:43:30

justement, ce sont des fichiers, pas des flux...
appelle " ptr" une référence et c´est du pareil au meme.

meme si t´es le seul à utiliser ta fonction, ça n´empeche pas de la penser dans une bonne optique d´utilisation.

oui on devine que size_s est la taille de ta chaine, dans le contexte de la fonction, mais si tu utilisais à coté les types size_t, size_w, size_c et autres, tu verrais que ça prete à confusion. Appelle là string_size ou lenght ou ce que tu veux d´autre ; c´est un peu comme si tu appeler un float " integer".

au lieu de realloquer, lis tout dans un buffer suffisemment grand et parse le texte depuis la memoire.

MathieuN7
MathieuN7
Niveau 10
09 octobre 2004 à 22:56:36

Ok LGV jvais suivre ton conseil pour size_s :)
Mais pour le realloc à chaque fois jvois pas comment faire... un buffer de 5 chars ou autre? que je copie régulièrement? ´fin jsais pas

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Internet
  • Macintosh
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment