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

MathieuN7
MathieuN7
Niveau 10
26 septembre 2004 à 18:50:23

jmen fous que mon code soit bourrin, au moins je le comprends celui là :)

Et puis merci dnob jcommence à comprendre, jvais ptet utiliser ta méthode, bien qu´elle soit très peu différente de la mienne dans mon cas.

dnob700
dnob700
Niveau 10
26 septembre 2004 à 19:01:39

oui, mais c´est important de désallouer la mémoire que tu aloue sinon, si ton programme debvient gros et que tu fait souvent appel à cette fonction, ça peut devenir catastrophique ( et puis c´est une bonne habitude à prendre).

La règle numéro un du bon programeur : la mémoire tu ne gachera pas.

MathieuN7
MathieuN7
Niveau 10
26 septembre 2004 à 19:11:41

Bon... si tu me prends par les sentiments à parler comme Maître Yoda...
Jvais suivre ton conseil :-)

Yoda_Software
Yoda_Software
Niveau 30
26 septembre 2004 à 19:20:19

Si je me souviens bien, la grosse différence entre le C et le Pascal en ce qui concerne la gestion de la mémoire, c´est qu´en Pascal, quand tu ferme le programme, la mémoire utilisée est totalement libérée, ce qui n´est pas le cas avec un programme en C.

Yoda_Software
Yoda_Software
Niveau 30
26 septembre 2004 à 19:21:12

Enfin, pas totalement !

dnob700
dnob700
Niveau 10
26 septembre 2004 à 19:26:28

si si, windows ( c´est indépendant du langage) fait ça très bien et libère toute le mémoire.

mais ce n´est pas propre et puis il faut espérer ne pas dépasser la mémoire pendant l´exécution du programme.

Yoda_Software
Yoda_Software
Niveau 30
26 septembre 2004 à 19:29:31

Je parlais en dehors de Windows, bien sûr.
Mes souvenirs de Turbo Pascal et mes notions de C datent de 92/93, et le Turbo C 2.0 ne tournait pas sous Windows, c´était une Appli Ms-Dos.

dnob700
dnob700
Niveau 10
26 septembre 2004 à 20:01:00

ah oui, avec d´autre OS, j´en sais rien, je te fait confiance.

c´est un réflexe de windowsien que de ne penser qu´a windows en premier lieu pour ce genre de question ( même si je suppose que mathieu bosse sous windows).

Yoda_Software
Yoda_Software
Niveau 30
26 septembre 2004 à 20:06:11

En fait, c´est Windows qui se charge de libérer la mémoire en fin de programme, mais s´il compile son prog sous dos, linux ou autre OS, il risque effectivement de laisser des trucs dans la mémoire.

DasHuhn
DasHuhn
Niveau 10
26 septembre 2004 à 20:34:31

" La règle numéro un du bon programeur : la mémoire tu ne gachera pas."
=> Tu préfères faire des fonctions de 50 lignes pour un problème qui peut être réglé en trois ?

" il risque effectivement de laisser des trucs dans la mémoire."
=> Non, pas pour les Unix en tout cas.

dnob700
dnob700
Niveau 10
26 septembre 2004 à 20:39:49

" Tu préfères faire des fonctions de 50 lignes pour un problème qui peut être réglé en trois ? "

je comprend pas le rapport ?
pourquoi économiser la mémoire implique-t-il de faire des grosses fonctions ?

Yoda_Software
Yoda_Software
Niveau 30
26 septembre 2004 à 20:45:54

Bien gérer la mémoire ( allouer et libérer la mémoire uniquement quand on en a besoin) nécessite un peu de code.

DasHuhn
DasHuhn
Niveau 10
26 septembre 2004 à 20:46:08

Bin dans ce cas là je préfère mon code ( même si il devrait prévoir la taille de la mémoire, mais sais plus faire d´allocation dynamique) qui est quand même tout petit ( et getchar() est généralement la plus rapide).

Yoda_Software
Yoda_Software
Niveau 30
26 septembre 2004 à 21:04:51

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 !

dnob700
dnob700
Niveau 10
26 septembre 2004 à 22:37:10

enfin dashuhn, perso je préfers faire des fonction de 3 lignes qui gère correctemet la mémoire...

Yoda_Software
Yoda_Software
Niveau 30
26 septembre 2004 à 22:46:27

Autant faire le boulot correctement plutôt que d´être obligé d´y revenir parce que ça a causé un bug. Comme on dit, " il vaux mieux prévenir que guérir ! " .

Et puis c´est une question d´habitude, je n´aime pas bâcler le boulot !

MathieuN7
MathieuN7
Niveau 10
26 septembre 2004 à 22:59:25

ben maintenant y a plus rien qui fonctionne:

void my_scanf(char *chaine)
{
int i = 0, j;
char *buffer = ( char *)calloc(sizeof ( char*), 500);
while((buffer[i] = getchar()) ! = ´\n´)
++i;
chaine = ( char *)calloc(sizeof ( char*), i+1);
for(j = 0; j < i; chaine[j++] = *buffer++);
free(buffer);
}

----------------------------------------
char *pathf = NULL;
my_scanf(pathf);

quand je fais printf("%s", pathf); ça affiche ( null) :snif:

dnob700
dnob700
Niveau 10
26 septembre 2004 à 23:19:17

normal,

il faut que tu déclare :

void my_scanf(char **chaine)

c´est donc un pointeur vers un pointeur, ce qui te permet de modifer le pointeur !

mais la bonne méthode serait :

void my_scanf(char *chaine, int *Size)

le pointeur est DEJA aloué avant d´appeler la fonction, il est alloué pour size octets et à la fin, Size contient le nombre d´octet qui ont été écrit dans la variable.

s´il n´ya pas assez d´octet dans chaine alors c´est pas grave la fonction donne ceux qu´elle peut et tant pis pour le reste.

paradox-
paradox-
Niveau 6
27 septembre 2004 à 09:45:01

warning, possible loss of data :ok:

MathieuN7
MathieuN7
Niveau 10
27 septembre 2004 à 17:05:25

jvais déjà essayer avec le pointeur de pointeur, mais j´arrive pas à m´imaginer ce que je vais devoir traiter, et surtout comment je vais le traiter:

Je passe en paramètre le pointeur d´un pointeur. Donc dans mon programme je définis un char *pathf qui est le pointeur qui va pointer vers la chaine, donc je l´initialise à NULL, et je définis un char **ppath, qui pointe vers le pointeur pathf. Donc je l´initialise à?... &? :doute:
Ensuite, quand je vais devoir allouer la mémoire pour la chaine, je fais *chaine ( donc chaine est le pointeur qui pointe vers pathf, d´où *chaine = pathf) donc *chaine = ( char *(??? pas sûr??))calloc(sizeof(char *), i+1);

Éclairez moi svp, parce que j´ai un peu de mal à comprendre ce casse-tête!

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