<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">To be more specific as to the reason, this is the C idiom - it you pass it as a pointer to a pointer, you have to cast it as a void pointer to a pointer.  If it is just a void *, C views this as an anonymous pointer, and you can use the address - as in<div class=""><br class=""><div class="">  int *intp;</div><div class=""><br class=""></div><div class="">  MPI_Alloc_mem(1000, MPI_INFO_NULL, &intp);</div><div class=""><br class=""></div><div class="">If baseptr is a void**, you need to do this:</div><div class=""><br class=""></div><div class="">  MPI_Alloc_mem(1000, MPI_INFO_NULL, (void **)&intp);</div><div class=""><br class=""></div><div class="">I don’t like it either, but this is the choice in C.</div><div class=""><br class=""></div><div class="">Bill</div><div class=""><br class=""><div class="">
<div style="color: rgb(0, 0, 0); letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div style="color: rgb(0, 0, 0); letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div style="color: rgb(0, 0, 0); letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div style="color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;">William Gropp<br class="">Director and Chief Scientist, NCSA<br class="">Thomas M. Siebel Chair in Computer Science<br class="">University of Illinois Urbana-Champaign</div><br class="Apple-interchange-newline"></div></div><br class="Apple-interchange-newline"></div><br class="Apple-interchange-newline"></div><br class="Apple-interchange-newline"><br class="Apple-interchange-newline">
</div>
<div><br class=""><blockquote type="cite" class=""><div class="">On Oct 14, 2020, at 12:01 PM, Anthony Skjellum via mpi-forum <<a href="mailto:mpi-forum@lists.mpi-forum.org" class="">mpi-forum@lists.mpi-forum.org</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">Folks, I know we have had this function for a long time, and I've implemented ports of MPI that actually use it (e.g., with pre-pinned memory).  But, I am trying to understand the logic for why baseptr is passed by value, instead of by reference.  In C, everything is by value, so the last argument in normal C programs would be void **baseptr.  <div class=""><br class=""></div><div class="">The standard has:<br clear="all" class=""><div class=""><pre style="" class="">int MPI_Alloc_mem(MPI_Aint size, MPI_Info info, void *baseptr);</pre><pre style="" class="">Now, MPICC/GCC takes this with </pre><pre style="" class=""><span style="font-family:Arial,Helvetica,sans-serif" class="">void *memory = (void *)0;</span><br class=""></pre><pre style="" class=""><pre class="">int error = MPI_Alloc_mem(1024, MPI_INFO_NULL, &memory);</pre><pre class="">and you get the memory allocated properly.</pre><pre class="">What is more, this is incorrect:</pre><pre class="">int error = MPI_Alloc_mem(1024, MPI_INFO_NULL, memory);<pre class=""></pre></pre><pre class=""></pre></pre><pre style="" class="">although it compiles fine because that is, indeed, the API.</pre><pre style="" class="">Why would we have the pointer going in by value, when it is coming out
as an OUT argument?</pre><pre style="" class="">Isn't this plain wrong?  void **baseptr means ---> I am passing you the </pre><pre style="" class="">address of a void pointer.</pre><pre style="" class="">Every viable implementation must do *(void **)baseptr = ...</pre><pre style="" class="">when providing the "malloc'd/special" memory.  So... why did we fudge </pre><pre style="" class="">the C API.  Is there some tie-in with the Fortran API?</pre><pre style="" class="">Thanks in advance,</pre><pre style="" class="">Tony Skjellum</pre><pre style="" class=""><br class=""></pre><pre style="" class=""><br class=""></pre></div>-- <br class=""><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr" class="">Anthony Skjellum, PhD<br class=""><a href="mailto:skjellum@gmail.com" target="_blank" class="">skjellum@gmail.com</a><br class="">Cell: +1-205-807-4968<div class=""><br class=""><div class=""><br class=""></div></div></div></div></div></div>
_______________________________________________<br class="">mpi-forum mailing list<br class=""><a href="mailto:mpi-forum@lists.mpi-forum.org" class="">mpi-forum@lists.mpi-forum.org</a><br class="">https://lists.mpi-forum.org/mailman/listinfo/mpi-forum<br class=""></div></blockquote></div><br class=""></div></div></body></html>