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] Explication d'un cast.

romtrep
romtrep
Niveau 8
04 juillet 2016 à 14:46:51

Voilà un cast que j'ai besoin de faire et qui fonctionne, mais que je ne comprend pas. Pouvez-vous m'expliquer ce qu'il fait exactement?

char* buffer = malloc(100);

API_function(  (const char**)&buffer ); //< 
Message édité le 04 juillet 2016 à 14:48:30 par romtrep
fluxies
fluxies
Niveau 17
04 juillet 2016 à 15:34:25

Salut, je ne suis pas un pro, mais voici mon avis.

Déjà as-tu essayé en faisant plutôt :

 API_func( (const char*) buffer );

Ensuite, je pense que la fonction s'attends juste à une chaine de caractère, le const étant la pour dire qu'elle ne la modifiera pas. Tu peux surement lui envoyer un char* déclaré sur la stack (pas en allocation dynamique, donc sans malloc)

Et pour être précis dans la description, voilà ce que je pense qu'il se passe dans ton cast, comme tu l'a écris.

0. char* buffer = malloc(100); Tu as un pointeur sur une adresse mémoire, cette adresse et ses 99 prochains octets sont réservés pour ton utilisation.

1. &buffer, c'est l'adresse de la variable te servant de pointeur, donc l'adresse de ta variable déclarée statiquement (pas dynamiquement, juste l'adresse de "buffer", et pas de ce que pointe "buffer")

2. (const char**) (&buffer), tu dis que &buffer est un pointeur pointant sur un pointeur de const char. Ce qui est vrai, mais redondant, d'où la restructuration que je te propose plus haut.

romtrep
romtrep
Niveau 8
04 juillet 2016 à 15:50:02

Je précise que le paramètre passé à la fonction doit être de type: const char**.

Déjà as-tu essayé en faisant plutôt :

API_func( (const char*) buffer );

J'ai esseyé et voilà l'erreur que le compilateur me donne:

error: expected 'const char * const*' but argument is of type 'const char *'
Nicolch
Nicolch
Niveau 10
04 juillet 2016 à 16:20:42

Ta fonction attends un char **, d'où le cast. Tu aurais aussi pu malloc directement un char ** sans le caster.

const char **buffer = malloc(sizeof(char *) * 48)
 
API_func(&buffer)

évite les mallocs de 100 aussi, préfère des puissances de 2. Et je sais ce que fais ta fonction mais le mieux serait de rajouter NULL à la fin de ton buffer pour éviter d'aller trop loin.

LGV
LGV
Niveau 28
04 juillet 2016 à 17:04:03

La vraie question c'est d'expliquer a quoi peut servir un ** pointeur de pointeur en parametre -

Concretement c'est utile lorsque le pointeur (et non pas la zone pointee) est lui-meme l'element qu'on souhaite faire modifier par la fonction. Ca sert donc surtout quand la fonction va modifier le pointeur (et non pas la donnee pointee) pour le faire pointer ailleurs. Ex typique : la fonction s'occupe elle-meme de malloc/new pour construire une structure complexe.

En pseudo code un truc du style :

ErrorCode Foo(Bar **_ptr)
{
(*_ptr) = malloc / new Bar[];
return errorCode();
}

Bar *ptr = null;
Foo(&ptr);

Le pointeur est declare en dehors de la fonction mais non-initialise, et est initialise dans la fonction. J'ai rajoute un pseudo-errorCode pour montrer que la valeur de retour n'est pas toujours disponible pour ce genre de manipulation qui serait pourtant plus intuitive sous la forme : Bar *ptr = Foo();

Message édité le 04 juillet 2016 à 17:07:43 par LGV
RoadAndCo
RoadAndCo
Niveau 8
04 juillet 2016 à 17:38:43

évite les mallocs de 100 aussi, préfère des puissances de 2

pk pk ??

VIeRepublique
VIeRepublique
Niveau 20
05 juillet 2016 à 08:43:46

char ** c'est l'équivalent d'un tableau de chaînes de caractères: char buffer[][] mais comment ta fonction ne semble rien retourner ou du moins ne retourne pas le buffer traité il faut donc passer un pointeur.

As tu essayé de ne pas lui allouer de mémoire ? Peut être que la fonction s'en charge en interne ? Puisque c'est elle qui semble le remplir de données.

1234_bou
1234_bou
Niveau 9
05 juillet 2016 à 15:24:18

Le 04 juillet 2016 à 17:38:43 RoadAndCo a écrit :

évite les mallocs de 100 aussi, préfère des puissances de 2

pk pk ??

Pour des raisons d'alignement mémoire.

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