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++] Utilisation de void*

spidey15
spidey15
Niveau 13
15 novembre 2021 à 06:20:29

Salut,
Je dois écrire une fonction en C++ qui contient dans ses paramètres plusieurs pointeurs void
int allGatherBroadcast(void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm)

On est sensé pouvoir y insérer des pointeurs vers des arrays de n'importe quel type, d'oû l'utilisation du void.
Le problème c'est que dans la fonction, je n'arrive pas à accéder aux valeurs de cet array, j'ai toujours des erreurs du genre :
error: ‘void*’ is not a pointer-to-object type
Mais donc, je suis sensé changer comment les valeurs de l'array dans ce cas-là, sachant que j'ai quand même la bonne adresse ?

Merci

godrik
godrik
Niveau 30
15 novembre 2021 à 06:40:28

fondamentalement tu peux caster en char* pour acceder aux donne un octet a la fois, ou en int32 pour acceder 4 octets a la fois. Mais en l'occurence pour reimplementer/etendre les fonctions de MPI, tu n'en as pas forcement besoin. memcpy et write prennent des void* aussi.

DengJu
DengJu
Niveau 6
15 novembre 2021 à 17:15:12

Le 15 novembre 2021 à 06:20:29 spidey15 a écrit :
j'ai toujours des erreurs du genre :
error: ‘void*’ is not a pointer-to-object type

les résultats du moteur de recherche n'étaient pas satisfaisants ? :(

You are dereferencing the void * before casting it to a concrete type.

spidey15
spidey15
Niveau 13
15 novembre 2021 à 22:49:39

Le 15 novembre 2021 à 06:40:28 :
fondamentalement tu peux caster en char* pour acceder aux donne un octet a la fois, ou en int32 pour acceder 4 octets a la fois. Mais en l'occurence pour reimplementer/etendre les fonctions de MPI, tu n'en as pas forcement besoin. memcpy et write prennent des void* aussi.

Je savais pas qu'on pouvait faire ça avec char*, je vais tester pour voir. Après on m'impose d'utiliser des fonctions MPI pour faire la communication (Isend et Irecv) donc je peux pas utiliser memcpy

godrik
godrik
Niveau 30
16 novembre 2021 à 01:52:56

irecv and isend prennent aussi des void*

gatias
gatias
Niveau 6
16 novembre 2021 à 11:22:56

Un pointer void* est un juste un pointer pouvant pointer sur n'importe quoi.
Il faut absolument le cast pour pouvoir l'utiliser.

Dans ta fonction tu as 2 MPI_Datatye qui sont sans doute des enums pour décrire le type du pointer.
Tu dois faire un switch dessus et faire un cast en fonction de la valeur.

switch(sendtype) {
  case MPI_Datatype::eInt:
    auto sendBuffer = static_cast<int*>(sendbuf);
}

C'est étonnant d'avoir ce genre de fonction en C++, pourquoi toujours coder en C++ comme en C ?

En C++, tu devrais utiliser des templates.

Pour moi, les seules raisons d'utiliser des void* c'est pour avoir un container contenant plusieurs types ou pour utiliser une api C qui t'y force.
Les void* sont plus lents (des indirections pour cast sur le bon type) et sont dangereux à utiliser.

godrik
godrik
Niveau 30
16 novembre 2021 à 15:43:52

C'est étonnant d'avoir ce genre de fonction en C++, pourquoi toujours coder en C++ comme en C ?

MPI est fondamentalement une interface C pour faire du reseau de (relativement) bas niveau. C'est justement l'un des endroits ou tu veux utiliser l'interfacage du C parceque tu peux avoir besoin d'utiliser des fonctions systemes pour placer tes buffer en memoire. Et en general dans MPI tu te fous du types des choses parceque tu deplaces des buffers. MPI gere les questions de representation des valeures memoire (par exemple quand tu passes d'une machine little endian a bigendian). Mais par construction MPI ne fonctionne que sur des buffers contigue en memoire. Du coup une representation pointer+length est exactement ce que tu veux.

MapReduce-MPI est aussi construit comme ca. Tu manipules des buffers complexes et de type arbitraire (et des fois decider au runtime). Tu fais c'est beaucoup plus simple de travailler sur des buffers au niveau de la lib et de laisser l'interpretation des buffers a la couche applicative que d'essayer de mettre ca dans dans la lib de reseau.

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