<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic   in Intel® Fortran Compiler</title>
    <link>https://community.intel.com/t5/Intel-Fortran-Compiler/Mixed-Language-C-unsigned-char-return/m-p/974427#M97954</link>
    <description>&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;ian has dropped your stdcall specification, with good reason.&lt;/P&gt;</description>
    <pubDate>Mon, 03 Feb 2014 03:53:46 GMT</pubDate>
    <dc:creator>TimP</dc:creator>
    <dc:date>2014-02-03T03:53:46Z</dc:date>
    <item>
      <title>Mixed Language - C unsigned char return</title>
      <link>https://community.intel.com/t5/Intel-Fortran-Compiler/Mixed-Language-C-unsigned-char-return/m-p/974425#M97952</link>
      <description>&lt;P&gt;I have been trying to get returns from a a C sub, and seem to be going around in circles... I have tried IVF samples, suggestions from IVF forums and that I have similarly used before now, all to no avail.&amp;nbsp; Any assistance/guidance would be appreciated.&lt;/P&gt;

&lt;P&gt;The C routine:&lt;/P&gt;

&lt;H4&gt;Syntax&lt;/H4&gt;

&lt;DIV class="codesample"&gt;int _stdcall Data_Read(&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; unsigned char *pBuffer,&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; int iOffset,&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; int iBytesToRead,&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; int *pBytesRead,&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; int iFlags&lt;BR /&gt;
	);&lt;/DIV&gt;

&lt;H4&gt;Parameters&lt;/H4&gt;

&lt;UL&gt;
	&lt;LI&gt;[out] &lt;SPAN class="tech"&gt;pBuffer&lt;/SPAN&gt; - pointer to the buffer that should receive the data read.&lt;/LI&gt;
	&lt;LI&gt;[in] &lt;SPAN class="tech"&gt;iOffset&lt;/SPAN&gt; - the index of the first byte to read. Indices start at zero. If this value is negative, the function will treat it as if it were zero, and read from the start of the Data.&lt;/LI&gt;
	&lt;LI&gt;[in] &lt;SPAN class="tech"&gt;iBytesToRead&lt;/SPAN&gt; - the number of bytes to read. If this value is negative, the function will return an error.&lt;/LI&gt;
	&lt;LI&gt;[out, optional] &lt;SPAN class="tech"&gt;pBytesRead&lt;/SPAN&gt; - pointer to a variable that receives the number of bytes read.&lt;/LI&gt;
	&lt;LI&gt;[in] &lt;SPAN class="tech"&gt;iFlags&lt;/SPAN&gt; - set this parameter to &lt;SPAN class="tech"&gt;GET_Data_SIZE&lt;/SPAN&gt; (1, or &lt;SPAN class="tech"&gt;BIT0&lt;/SPAN&gt; set) to get the total size of the Data in the variable pointed to by &lt;SPAN class="tech"&gt;pBytesRead&lt;/SPAN&gt;. The buffer that &lt;SPAN class="tech"&gt;pBuffer&lt;/SPAN&gt; points to remains unmodified. Pass zero to perform a read with no special behaviour.&lt;/LI&gt;
&lt;/UL&gt;

&lt;P&gt;My Fortran module:&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; interface&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; function Data_READ(Ret_Str, Int1, Int2, Data_Bytes, Int3)&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !DEC$ ATTRIBUTES STDCALL,DECORATE,ALIAS:"Data_Read" :: Data_READ&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; integer :: Data_READ&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; character*(*) :: Ret_Str&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; integer :: Int1, Int2, Data_Bytes, Int3&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !DEC$ ATTRIBUTES REFERENCE :: Ret_Str, Int1, Int2, Data_Bytes, Int3&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end function Data_READ&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end interface&lt;/P&gt;

&lt;P&gt;My Fortran routine:&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use, intrinsic :: iso_c_binding, only: c_int&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; implicit none&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; character(len=50) :: Ret_Str&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; integer :: iRet&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; integer(C_int) :: iOut_1, iOut_2, Data_Bytes, iOut_3&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; iOut_1 = 0 ; iOut_2 = 50 ; iOut_3 = 0&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; iRet = Data_Read(Ret_Str, iOut_1, iOut_2, Data_Bytes, iOut_3)&lt;/P&gt;

&lt;P&gt;The data in pbuffer (from the C sub) can be up to 512 bytes... I currently have 34 characters stored in the area that the C sub reads, and am trying to get those into my program.&lt;/P&gt;

&lt;P&gt;I have other routines that read similarly read strings from C routines, but I cannot figure what I have done wrong or am missing (I know something is not right/missing, but not what nor where).&amp;nbsp; At present the returns I get are 0 for iRet (0 indicates success), 0 for Data_Bytes, and Ret_Str is blank.&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 03 Feb 2014 02:40:57 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Fortran-Compiler/Mixed-Language-C-unsigned-char-return/m-p/974425#M97952</guid>
      <dc:creator>Keith_Stewart</dc:creator>
      <dc:date>2014-02-03T02:40:57Z</dc:date>
    </item>
    <item>
      <title>Your Fortran specifies Int1,</title>
      <link>https://community.intel.com/t5/Intel-Fortran-Compiler/Mixed-Language-C-unsigned-char-return/m-p/974426#M97953</link>
      <description>&lt;P&gt;Your Fortran specifies Int1, Int2 and Int3 as pass by reference - when the C declaration says they are by value.&lt;/P&gt;

&lt;P&gt;It is also possible that the calling conventions for the assumed length character string trip you up (this can change with compile options).&lt;/P&gt;

&lt;P&gt;For what its worth, if I had to write a Fortran interface for this C function (guessing a little as to the behaviour beyond what your documentation provides and calling "bytes" INTEGER(C_SIGNED_CHAR)) I'd do it something like:&lt;BR /&gt;
	[fortran]&lt;/P&gt;

&lt;P&gt;MODULE MakeCallingDataReadFromFortranEasy&lt;BR /&gt;
	&amp;nbsp; IMPLICIT NONE&lt;BR /&gt;
	&amp;nbsp; PRIVATE&lt;BR /&gt;
	&amp;nbsp;&lt;BR /&gt;
	&amp;nbsp; PUBLIC :: GetTotalSizeOfData&lt;BR /&gt;
	&amp;nbsp; PUBLIC :: ReadSomeData&lt;BR /&gt;
	&amp;nbsp; PUBLIC :: ReadItAllAtOnce&lt;BR /&gt;
	&amp;nbsp;&lt;BR /&gt;
	&amp;nbsp; INTERFACE&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; FUNCTION Data_Read(pBuffer, iOffset, iBytesToRead, pBytesRead, iFlags)&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_INT, C_PTR&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IMPLICIT NONE&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TYPE(C_PTR), INTENT(IN) :: pBuffer&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; INTEGER(C_INT), INTENT(IN) :: iOffset&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; INTEGER(C_INT), INTENT(IN) :: iBytesToRead&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; INTEGER(C_INT), INTENT(OUT) :: pBytesRead&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !DEC$ ATTRIBUTES REFERENCE :: pBytesRead&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; INTEGER(C_INT), INTENT(IN) :: iFlags&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; INTEGER(C_INT) :: Data_Read&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !DEC$ ATTRIBUTES STDCALL :: Data_Read&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !DEC$ ATTRIBUTES ALIAS:'Data_Read' :: Data_Read&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !DEC$ ATTRIBUTES DECORATE :: Data_Read&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; END FUNCTION Data_Read&lt;BR /&gt;
	&amp;nbsp; END INTERFACE&lt;BR /&gt;
	CONTAINS&lt;BR /&gt;
	&amp;nbsp; SUBROUTINE GetTotalSizeOfData(total_size, result)&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_INT, C_LOC, C_NULL_PTR&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; INTEGER(C_INT), INTENT(OUT) :: total_size&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; INTEGER(C_INT), INTENT(OUT) :: result&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; !****&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; ! Assume that buffer&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; result = Data_Read( C_NULL_PTR, 0_C_INT, 0_C_INT, total_size,&amp;nbsp; &amp;amp;&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1_C_INT )&lt;BR /&gt;
	&amp;nbsp; END SUBROUTINE GetTotalSizeOfData&lt;BR /&gt;
	&amp;nbsp;&lt;BR /&gt;
	&amp;nbsp; SUBROUTINE ReadSomeData(data, offset, bytes_to_read, bytes_read, result)&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_INT, C_LOC, C_SIGNED_CHAR&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; INTEGER(C_SIGNED_CHAR), INTENT(OUT), TARGET :: data(*)&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; INTEGER(C_INT), INTENT(IN) :: offset&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; INTEGER(C_INT), INTENT(IN) :: bytes_to_read&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; INTEGER(C_INT), INTENT(OUT) :: bytes_read&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; INTEGER(C_INT), INTENT(OUT) :: result&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; !****&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; result = Data_Read( C_LOC(data), offset, bytes_to_read, bytes_read,&amp;nbsp; &amp;amp;&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0_C_INT )&lt;BR /&gt;
	&amp;nbsp; END SUBROUTINE ReadSomeData&lt;BR /&gt;
	&amp;nbsp;&lt;BR /&gt;
	&amp;nbsp; SUBROUTINE ReadItAllAtOnce(data, result)&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_INT, C_LOC, C_SIGNED_CHAR&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; INTEGER(C_SIGNED_CHAR), INTENT(OUT), ALLOCATABLE :: data(:)&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; INTEGER(C_INT), INTENT(OUT) :: result&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; !----&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; INTEGER(C_INT) :: total_size&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; INTEGER(C_INT) :: bytes_read&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; !****&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; CALL GetTotalSizeOfData(total_size, result)&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; IF (result /= 0) RETURN&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; ALLOCATE(data(total_size))&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; CALL ReadSomeData(data, 0_C_INT, total_size, bytes_read)&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; IF (result /= 0) RETURN&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; IF (total_size /= bytes_read)&amp;nbsp; &amp;amp;&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ERROR STOP 'Total size isn''t bytes_read!'&lt;BR /&gt;
	&amp;nbsp; END SUBROUTINE ReadItAllAtOnce&lt;BR /&gt;
	END MODULE MakeCallingDataReadFromFortranEasy&lt;/P&gt;

&lt;P&gt;[/fortran]&lt;/P&gt;

&lt;P&gt;(But I wouldn't double space things...)&lt;/P&gt;</description>
      <pubDate>Mon, 03 Feb 2014 03:22:00 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Fortran-Compiler/Mixed-Language-C-unsigned-char-return/m-p/974426#M97953</guid>
      <dc:creator>IanH</dc:creator>
      <dc:date>2014-02-03T03:22:00Z</dc:date>
    </item>
    <item>
      <title> </title>
      <link>https://community.intel.com/t5/Intel-Fortran-Compiler/Mixed-Language-C-unsigned-char-return/m-p/974427#M97954</link>
      <description>&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;ian has dropped your stdcall specification, with good reason.&lt;/P&gt;</description>
      <pubDate>Mon, 03 Feb 2014 03:53:46 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Fortran-Compiler/Mixed-Language-C-unsigned-char-return/m-p/974427#M97954</guid>
      <dc:creator>TimP</dc:creator>
      <dc:date>2014-02-03T03:53:46Z</dc:date>
    </item>
    <item>
      <title>Quote:Tim Prince wrote:</title>
      <link>https://community.intel.com/t5/Intel-Fortran-Compiler/Mixed-Language-C-unsigned-char-return/m-p/974428#M97955</link>
      <description>&lt;P&gt;&lt;/P&gt;&lt;BLOCKQUOTE&gt;Tim Prince wrote:&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;ian has dropped your stdcall specification, with good reason.&lt;/P&gt;

&lt;P&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;P&gt;&lt;/P&gt;

&lt;P&gt;I agree, but I didn't mean to (and I don't think I did).&lt;/P&gt;</description>
      <pubDate>Mon, 03 Feb 2014 03:57:59 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Fortran-Compiler/Mixed-Language-C-unsigned-char-return/m-p/974428#M97955</guid>
      <dc:creator>IanH</dc:creator>
      <dc:date>2014-02-03T03:57:59Z</dc:date>
    </item>
    <item>
      <title>Many thanks Ian - I</title>
      <link>https://community.intel.com/t5/Intel-Fortran-Compiler/Mixed-Language-C-unsigned-char-return/m-p/974429#M97956</link>
      <description>&lt;P&gt;Many thanks Ian - I transposed parts of your suggested code into my module and routine, and it now works - I can return the read bytes and data area content exactly as I had hoped to.&lt;/P&gt;

&lt;P&gt;I never would have got it myself as I have not found anything on how to address unsigned/signed characters to a buffer - many thanks again.&lt;/P&gt;</description>
      <pubDate>Mon, 03 Feb 2014 05:49:42 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Fortran-Compiler/Mixed-Language-C-unsigned-char-return/m-p/974429#M97956</guid>
      <dc:creator>Keith_Stewart</dc:creator>
      <dc:date>2014-02-03T05:49:42Z</dc:date>
    </item>
  </channel>
</rss>

