<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/255402</link>
    <title>MATLAB Central Newsreader - Segmentation violation due to MEX code</title>
    <description>Feed for thread: Segmentation violation due to MEX code</description>
    <language>en-us</language>
    <copyright>&amp;copy;1994-2012 by MathWorks, Inc.</copyright>
    <webmaster>webmaster@mathworks.com</webmaster>
    <generator>MATLAB Central Newsreader</generator>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <ttl>60</ttl>
    <image>
      <title>MathWorks</title>
      <url>http://www.mathworks.com/images/membrane_icon.gif</url>
    </image>
    <item>
      <pubDate>Mon, 06 Jul 2009 12:43:24 -0400</pubDate>
      <title>Segmentation violation due to MEX code</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/255402#662876</link>
      <author>Jose Antonio</author>
      <description>Hi again&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
I am trying to implement a very simple subroutine embeding a CMEX code in Matlab.&lt;br&gt;
&lt;br&gt;
Does anybody know if it is possible that I get a &quot;Segmentation violation&quot; error even if I don't go beyond the iput arrays' limits?&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
I have checked the code with small inputs, and works fine. But when I send a rather huge array, it crashes.&lt;br&gt;
&lt;br&gt;
This is the code:&lt;br&gt;
#include &quot;mex.h&quot;&lt;br&gt;
&lt;br&gt;
/*&lt;br&gt;
&amp;nbsp;* Calculate_I_Values.c&lt;br&gt;
&amp;nbsp;* Used to speed up the I mapping calculations &lt;br&gt;
&amp;nbsp;*&lt;br&gt;
&amp;nbsp;* This is a MEX-file for MATLAB.&lt;br&gt;
*/&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
/* The gateway function */&lt;br&gt;
void mexFunction( int nlhs, mxArray *plhs[],&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int nrhs, const mxArray *prhs[])&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* variable declarations here */&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;double *e, *x, *y, *I;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int eRows, eCols, xRows, xCols, yRows, yCols, index, ySize;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int m, i, j;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;double num, den;&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e = mxGetPr(prhs[0]);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;eRows = mxGetN(prhs[0]);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;eCols = mxGetM(prhs[0]);&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;x = mxGetPr(prhs[1]);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;xRows = mxGetN(prhs[1]);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;xCols = mxGetM(prhs[1]);&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;y = mxGetPr(prhs[2]);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;yRows = mxGetN(prhs[2]);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;yCols = mxGetM(prhs[2]);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ySize = mxGetNumberOfElements(prhs[2]);&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* Allocate output memory */&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plhs[0] = mxCreateDoubleMatrix(1, 256, mxREAL);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;I = mxGetPr(plhs[0]);&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* code here */&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&quot;The xNumRow is: %d\n&quot;, (int)xRows);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&quot;The xNumCol is: %d\n\n&quot;, (int)xCols);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&quot;The yNumRow is: %d\n&quot;, (int)yRows);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&quot;The yNumCol is: %d\n\n&quot;, (int)yCols);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&quot;The ySize is: %d\n\n&quot;, (int)ySize);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&quot;The eNumRow is: %d\n&quot;, (int)eRows);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&quot;The eNumCol is: %d\n\n&quot;, (int)eCols);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (m = 0; m &amp;lt;= 255; m++)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&quot;m = %d -&amp;gt;  &quot;, (int)m);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;num = 0;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;den = 0;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (i = 0; i &amp;lt; yRows; i++)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (j = 0; j &amp;lt; yCols; j++)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;index = i * yCols + j;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (index &amp;gt;= ySize)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&quot;Wrong\n&quot;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else if (m == y[index])&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;num += e[j] * x[i];&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;den++;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (den == 0) I[m] = num;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else I[m] = num / den;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
It is actually pretty simple, but...&lt;br&gt;
&lt;br&gt;
I call the function by:&lt;br&gt;
Calculate_I_Values(exposures.', x.', y.');&lt;br&gt;
&lt;br&gt;
Obviously after compiling.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
The first printf lines give me:&lt;br&gt;
The xNumRow is: 361862&lt;br&gt;
The xNumCol is: 1&lt;br&gt;
&lt;br&gt;
The yNumRow is: 361862&lt;br&gt;
The yNumCol is: 16&lt;br&gt;
&lt;br&gt;
The ySize is: 5789792&lt;br&gt;
&lt;br&gt;
The eNumRow is: 1&lt;br&gt;
The eNumCol is: 16&lt;br&gt;
&lt;br&gt;
So everyting is as it should be. But then I get the segmentation violation error.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
I have commented different parts of the program, and concluded that the error is when I do y[index]. So I guess I am trying to access a memory address which is shouldn't...&lt;br&gt;
&lt;br&gt;
But I have already controlled that the index does not exceed the size of the input array! (ySize)&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Any clue would be appreciated :)&lt;br&gt;
&lt;br&gt;
Thanks in advance&lt;br&gt;
Jose</description>
    </item>
    <item>
      <pubDate>Mon, 06 Jul 2009 13:34:17 -0400</pubDate>
      <title>Re: Segmentation violation due to MEX code</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/255402#662901</link>
      <author>Jose Antonio</author>
      <description>I am pretty sure the problem has to do with memory allocation when calling the function.&lt;br&gt;
&lt;br&gt;
I think so because I have tried to make it work with arrays with up to 4000 values and it performs correctly...&lt;br&gt;
&lt;br&gt;
Any idea if what I say makes sense?&lt;br&gt;
&lt;br&gt;
If so, how can I increase the memory assigned to the MEX function?&lt;br&gt;
&lt;br&gt;
Thanks!</description>
    </item>
    <item>
      <pubDate>Mon, 06 Jul 2009 19:52:02 -0400</pubDate>
      <title>Re: Segmentation violation due to MEX code</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/255402#663018</link>
      <author>James Tursa</author>
      <description>Jose Antonio &amp;lt;juriguen@gmail.com&amp;gt; wrote in message &amp;lt;28112995.79623.1246887287751.JavaMail.jakarta@nitrogen.mathforum.org&amp;gt;...&lt;br&gt;
&amp;gt; I am pretty sure the problem has to do with memory allocation when calling the function.&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; I think so because I have tried to make it work with arrays with up to 4000 values and it performs correctly...&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Any idea if what I say makes sense?&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; If so, how can I increase the memory assigned to the MEX function?&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Thanks!&lt;br&gt;
&lt;br&gt;
Compiled and ran without seg fault a dozen times with random data using your specified sizes. So I can't reproduce your error. Are all of your inputs double class?&lt;br&gt;
&lt;br&gt;
James Tursa</description>
    </item>
    <item>
      <pubDate>Mon, 06 Jul 2009 20:17:02 -0400</pubDate>
      <title>Re: Segmentation violation due to MEX code</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/255402#663033</link>
      <author>Jose Antonio</author>
      <description>Woah&lt;br&gt;
&lt;br&gt;
It was that! Thanks so much.&lt;br&gt;
&lt;br&gt;
I actually was using y being a matrix of integer values, since it is stored like that when reading an image (uint8)&lt;br&gt;
&lt;br&gt;
What would be best to simply pass double(y) to the function or try to read them as integers?&lt;br&gt;
&lt;br&gt;
In fact, I have modified the C code, and right now I use the y[index] values as indices for performing operations, rather than looping once and again for (m ...) and scanning all the data for (x...) for (y...)&lt;br&gt;
&lt;br&gt;
Jose</description>
    </item>
  </channel>
</rss>

