• Announcements

    • khawk

      Download the Game Design and Indie Game Marketing Freebook   07/19/17

      GameDev.net and CRC Press have teamed up to bring a free ebook of content curated from top titles published by CRC Press. The freebook, Practices of Game Design & Indie Game Marketing, includes chapters from The Art of Game Design: A Book of Lenses, A Practical Guide to Indie Game Marketing, and An Architectural Approach to Level Design. The GameDev.net FreeBook is relevant to game designers, developers, and those interested in learning more about the challenges in game development. We know game development can be a tough discipline and business, so we picked several chapters from CRC Press titles that we thought would be of interest to you, the GameDev.net audience, in your journey to design, develop, and market your next game. The free ebook is available through CRC Press by clicking here. The Curated Books The Art of Game Design: A Book of Lenses, Second Edition, by Jesse Schell Presents 100+ sets of questions, or different lenses, for viewing a game’s design, encompassing diverse fields such as psychology, architecture, music, film, software engineering, theme park design, mathematics, anthropology, and more. Written by one of the world's top game designers, this book describes the deepest and most fundamental principles of game design, demonstrating how tactics used in board, card, and athletic games also work in video games. It provides practical instruction on creating world-class games that will be played again and again. View it here. A Practical Guide to Indie Game Marketing, by Joel Dreskin Marketing is an essential but too frequently overlooked or minimized component of the release plan for indie games. A Practical Guide to Indie Game Marketing provides you with the tools needed to build visibility and sell your indie games. With special focus on those developers with small budgets and limited staff and resources, this book is packed with tangible recommendations and techniques that you can put to use immediately. As a seasoned professional of the indie game arena, author Joel Dreskin gives you insight into practical, real-world experiences of marketing numerous successful games and also provides stories of the failures. View it here. An Architectural Approach to Level Design This is one of the first books to integrate architectural and spatial design theory with the field of level design. The book presents architectural techniques and theories for level designers to use in their own work. It connects architecture and level design in different ways that address the practical elements of how designers construct space and the experiential elements of how and why humans interact with this space. Throughout the text, readers learn skills for spatial layout, evoking emotion through gamespaces, and creating better levels through architectural theory. View it here. Learn more and download the ebook by clicking here. Did you know? GameDev.net and CRC Press also recently teamed up to bring GDNet+ Members up to a 20% discount on all CRC Press books. Learn more about this and other benefits here.
Sign in to follow this  
Followers 0
jdub

C++ pointer strangeness

10 posts in this topic

So here is a little code I wrote for class:
[CODE]
void reverseString(char* const src, char* reversed)
{
reversed = new char[strlen(src)+1];
for(unsigned int i = 0; i < strlen(src) - 1; i++)
{
unsigned int resIndex = strlen(src) - i - 1;
reversed[resIndex] = src[i];
}
reversed[strlen(src)] = '\0';
}

int main(void)
{
char* original = "Hello World!";
char* reversed = NULL;
reverseString(original, reversed); //reversed should be assigned in here
cout << original << endl << reversed; //however reversed is still NULL here?!

cin.get();
return 0;
}
[/CODE]

The code should assign reversed to a value inside reverseString(). And, at the end of reverseString() before the program branches back to main() the pointer is assigned to the correct value. However, upon reaching cout, the reversed pointer is NULL again. Can someone explain what is going on here?
0

Share this post


Link to post
Share on other sites
Pointers hold the address of the object to alter.
You are passing in the address of the object to alter into the function - the address you are passing is 'NULL'.

The pointer in the function's parameter is a different variable - it's told the 'NULL' address.
It then changes [u]its[/u] address (but not the address of the original pointer) to whatever 'new' returns.
The original pointer's address is still set to zero.

Then it exits.

Perhaps you want a pointer to a pointer?
[code]void reverseString(char* const src, char** reversed)
{
*reversed = new blah;
}

char *reversed = NULL;
reverseString(blah, &reversed);
[/code]

The better solution would be to just [i]return[/i] the pointer from the function.
[code]char *reverseString(char* const src)
{
char *reversed = new blah;
return reversed;
}

char *reversed = reverseString(blah);
[/code]

The even better solution is to use std::strings, if you have them available, since you already mentioned you are using C++ in the thread's title. [img]http://public.gamedev.net//public/style_emoticons/default/wink.png[/img]
2

Share this post


Link to post
Share on other sites
[quote name='Servant of the Lord' timestamp='1352170626' post='4997848']
[code]void reverseString(char* const src, char** reversed)
{
*reversed = new blah;
}

char *reversed = NULL;
reverseString(blah, &reversed);
[/code]
[/quote]
The C++ way would be to use a reference to a pointer so that you can just assign to it in the function if you want to keep the interface the same. And would look like this:
[code]void reverseString(char* const src, char*& reversed)
{
reversed = new blah;
}
char *reversed = NULL;
reverseString(blah, reversed);
[/code] Edited by NightCreature83
0

Share this post


Link to post
Share on other sites
Yea, SiCrane already mentioned that a minute or two before I submitted my post.
I had never heard of reference to pointer before his post! Though personally, using either of them (pointer to pointer, reference to pointer) would probably be an indicator of bad overall design of the function. [img]http://public.gamedev.net//public/style_emoticons/default/smile.png[/img] Edited by Servant of the Lord
0

Share this post


Link to post
Share on other sites
While one traditional way of solving this C-language problem is to pass the [i]reversed[/i] pointer by pointer, a better design and still traditional C-language solution would be to return [i]reversed[/i] as the function return value instead.
[code]
char *reverseString(char *src)
{
int len = strlen(src);
reversed = new char[len+1];
for (int i = 0; i < len; ++i)
{
int resIndex = len - i - 1;
reversed[resIndex] = src[i];
}
reversed[len] = '\0';
return reversed;
}

int main()
{
char *original = "Hello World!";
char *reversed = reverseString(original); // reversed is allocated in here
cout << original << "\n" << reversed << "\n";
cin.get();
delete[] reversed;
}
[/code]
0

Share this post


Link to post
Share on other sites
Personally, if I was doing this in C, I'd make my function accept an already allocated output pointer as argument, to write the reversed string in (and also ensure the original string could be passed as an output so that the operation can be done in-place). It just doesn't feel right to allocate memory inside the function itself.
0

Share this post


Link to post
Share on other sites
You can just try is yourself by printing the pointers and everything should be clear:

[CODE]printf("BEF: %p\n",reversed);
reversed = new char[strlen(src)+1];
printf("AFT: %p\n",reversed);[/CODE]

and in main()
[CODE]printf("START: %p\n",reversed);
reverseString(original, reversed); //reversed should be assigned in here
printf("END: %p\n",reversed);[/CODE]

On my machine it prints something this:
[CODE]START: 0x0
BEF: 0x0
AFT: 0x7fdc68c000e0
END: 0x0[/CODE]

And now read the answers posted above
1

Share this post


Link to post
Share on other sites
[quote name='SiCrane' timestamp='1352170313' post='4997845']
You're passing the pointer by value. Assignments to the pointer inside the function won't be visible to the calling function. You can try using a reference to a pointer (char *&) instead.
[/quote]
This, or using a pointer to pointer has the same result: void function(Foo** foo) then to assign something new: *foo/(*foo) = <VALUE>
1

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0