<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Const pointer to pointer to char problems</title>
		<link>http://www.allegro.cc/forums/view/613489</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Wed, 13 Nov 2013 12:36:46 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I would like to manage OpenGL shaders in a more C++ and OO way<br />So I wanted to write a class for it..<br />However I run into trouble making the shader code a bit more managable..</p><p>I want to store the shader code into my class and then compile it</p><p>OpenGL expects a constant pointer to a pointer to a char &quot;const **GLchar&quot;<br />Right now I have an array of Glchar where the shadercode is stored..</p><p>Is there any good way to stuff one into the other ??</p><p>Maybe it&#39;s me but I don&#39;t see it....</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="k1">bool</span> OpenGLShader::Compile<span class="k2">(</span><span class="k2">)</span>
<span class="number">  2</span><span class="k2">{</span>
<span class="number">  3</span>    GLchar source<span class="k2">[</span>m_vShaderSource.size<span class="k2">(</span><span class="k2">)</span><span class="k3">+</span><span class="n">2</span><span class="k2">]</span><span class="k2">;</span>
<span class="number">  4</span>    vector<span class="k3">&lt;</span>GLchar&gt;::const_iterator P <span class="k3">=</span> m_vShaderSource.begin<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  5</span>    <span class="k1">int</span> nIndex <span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number">  6</span>    <span class="k1">while</span> <span class="k2">(</span>P<span class="k3">!</span><span class="k3">=</span>m_vShaderSource.end<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span>
<span class="number">  7</span>    <span class="k2">{</span>
<span class="number">  8</span>        source<span class="k2">[</span>nIndex<span class="k2">]</span> <span class="k3">=</span> <span class="k3">*</span>P<span class="k2">;</span>
<span class="number">  9</span>        nIndex<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>
<span class="number"> 10</span>        P<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>
<span class="number"> 11</span>    <span class="k2">}</span>
<span class="number"> 12</span>
<span class="number"> 13</span>    source<span class="k2">[</span>nIndex<span class="k2">]</span> <span class="k3">=</span><span class="s">'\0'</span><span class="k2">;</span>                               <span class="c">// &lt;-------</span>
<span class="number"> 14</span> 
<span class="number"> 15</span>    <span class="k1">const</span> GLchar <span class="k3">*</span><span class="k3">*</span> pSource <span class="k3">=</span> <span class="k3">&amp;</span>source<span class="k2">;</span>                  <span class="c">// &lt;--------</span>
<span class="number"> 16</span>    glShaderSource<span class="k2">(</span>m_nShaderIndex, <span class="n">1</span>, pSource, NULL<span class="k2">)</span><span class="k2">;</span>   <span class="c">// &lt;---------</span>
<span class="number"> 17</span>
<span class="number"> 18</span>
<span class="number"> 19</span>    glCompileShader<span class="k2">(</span>m_nShaderIndex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 20</span>    GLint status<span class="k2">;</span>
<span class="number"> 21</span>    glGetShaderiv<span class="k2">(</span>m_nShaderIndex, GL_COMPILE_STATUS, <span class="k3">&amp;</span>status<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 22</span>    <span class="k1">if</span> <span class="k2">(</span>status<span class="k3">!</span><span class="k3">=</span>GL_TRUE<span class="k2">)</span>
<span class="number"> 23</span>    <span class="k2">{</span>
<span class="number"> 24</span>       glGetShaderInfoLog<span class="k2">(</span>m_nShaderIndex, <span class="n">512</span>, NULL, m_StatusBuffer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 25</span>       <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 26</span>    <span class="k2">}</span>
<span class="number"> 27</span>    <span class="k1">else</span>
<span class="number"> 28</span>    <span class="k2">{</span>
<span class="number"> 29</span>        <span class="k1">return</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 30</span>    <span class="k2">}</span>
<span class="number"> 31</span><span class="k2">}</span>
</div></div><p>


Thanks...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Ariesnl)</author>
		<pubDate>Tue, 12 Nov 2013 19:08:05 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Does casting work? A const** to GLchar just means you cant change the GLchars in the array.</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">const</span> <span class="k3">*</span><span class="k3">*</span> GLChar psource <span class="k3">=</span> <span class="k2">(</span><span class="k1">const</span> <span class="k3">*</span><span class="k3">*</span> GLCchar<span class="k2">)</span><span class="k3">&amp;</span>source<span class="k2">;</span>
</pre></div></div><p>

One thing to ask is do you need to make it a 2d array? Right now you just have an array, or a 2d array with one row. What does the shader expect?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Tue, 12 Nov 2013 20:30:41 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="k1">const</span> GLchar<span class="k3">*</span> vertexSource <span class="k3">=</span>
<span class="number">  2</span>    <span class="s">"#version 150 core\n "</span>
<span class="number">  3</span>    <span class="s">"in vec2 position;   "</span>
<span class="number">  4</span>    <span class="s">"in vec3 ColorIn;    "</span>
<span class="number">  5</span>    <span class="s">"out vec3 ColorFragment;  "</span>
<span class="number">  6</span>    <span class="s">"void main()"</span>
<span class="number">  7</span>    <span class="s">"{"</span>
<span class="number">  8</span>    <span class="s">"ColorFragment = ColorIn;"</span>
<span class="number">  9</span>    <span class="s">"gl_Position = vec4(position, 0.0, 1.0);"</span>
<span class="number"> 10</span>    <span class="s">"}"</span><span class="k2">;</span>
</div></div><p>

This code compiles on the graphics card so I think I need a 2D array...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Ariesnl)</author>
		<pubDate>Tue, 12 Nov 2013 20:40:38 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>It doesn&#39;t just expect a concatenated string? A single one?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Tue, 12 Nov 2013 20:50:18 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>It compiles to one long string.</p><pre>
00001c60  69 6e 67 00 25 73 00 00  23 76 65 72 73 69 6f 6e  |ing.%s..#version|
00001c70  20 31 35 30 20 63 6f 72  65 0a 20 69 6e 20 76 65  | 150 core. in ve|
00001c80  63 32 20 70 6f 73 69 74  69 6f 6e 3b 20 69 6e 20  |c2 position; in |
00001c90  76 65 63 33 20 43 6f 6c  6f 72 49 6e 3b 20 6f 75  |vec3 ColorIn; ou|
00001ca0  74 20 76 65 63 33 20 43  6f 6c 6f 72 46 72 61 67  |t vec3 ColorFrag|
00001cb0  6d 65 6e 74 3b 20 76 6f  69 64 20 6d 61 69 6e 28  |ment; void main(|
00001cc0  29 7b 43 6f 6c 6f 72 46  72 61 67 6d 65 6e 74 20  |){ColorFragment |
00001cd0  3d 20 43 6f 6c 6f 72 49  6e 3b 67 6c 5f 50 6f 73  |= ColorIn;gl_Pos|
00001ce0  69 74 69 6f 6e 20 3d 20  76 65 63 34 28 70 6f 73  |ition = vec4(pos|
00001cf0  69 74 69 6f 6e 2c 20 30  2e 30 2c 20 31 2e 30 29  |ition, 0.0, 1.0)|
00001d00  3b 7d 00 00 00 00 00 00  00 00 50 c1 00 00 c0 3f  |;}........P....?|
</pre><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Arthur Kalliokoski)</author>
		<pubDate>Tue, 12 Nov 2013 22:40:00 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Multiple literal strings that are one after the other get concatenated.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Tue, 12 Nov 2013 22:46:54 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>yeah, that&#39;s kind of what I meant
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Wed, 13 Nov 2013 02:20:20 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>If you want to use a std::string: <a href="http://stackoverflow.com/questions/6047527/how-to-convert-stdstring-to-const-char">http://stackoverflow.com/questions/6047527/how-to-convert-stdstring-to-const-char</a>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc ( Arvidsson)</author>
		<pubDate>Wed, 13 Nov 2013 12:12:00 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>So basically it wants a pointer to a string? <span class="source-code"><span class="k3">&amp;</span>source</span> should be your &quot;C string&quot; (that is, a pointer to the beginning of the array of characters) so you may need to store that somewhere in order to take the address of that?</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">const</span> GLchar <span class="k3">*</span> str <span class="k3">=</span> <span class="k3">&amp;</span>source<span class="k2">;</span>
<span class="k1">const</span> GLchar <span class="k3">*</span><span class="k3">*</span> ptr <span class="k3">=</span> <span class="k3">&amp;</span>str<span class="k2">;</span>
<span class="c">//    Here, eat ^ that and leave us alone!</span>
</pre></div></div><p>

<img src="http://www.allegro.cc/forums/smileys/huh.gif" alt="???" /></p><p><b>Append:</b></p><p>That said, a non-const pointer to a string suggests that they may wish to change it on you, which may or may not throw you for a loop... Do make sure that what you&#39;re trying is safe.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (bamccaig)</author>
		<pubDate>Wed, 13 Nov 2013 12:36:46 +0000</pubDate>
	</item>
</rss>
