|
It's very difficult to guess without any error codes or messages.
All I can think of is that you passed a constant string for the str parameter because strtok will modify the str parameter.
«_Superman_»
|
|
|
|
|
IMHO there is no apparent reason for the crash, could you please elaborate a bit
(i.e. what are str and separator values?
Could you please post
strtoken code?
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|
Ok look, here is the full function (that I did NOT write myself) which should work correct, but I think >>I<< do something NOT correct.
Its a tokenizer for char-strings
int strtoken(char *str, char *separator, char *token[])
{
int i = 0;
token[0] = strtok(str, separator);
while ( token[i] )
{
i++;
token[i] = strtok(NULL, separator);
}
return ( i );
}
And I call it that way atm:
char *token[256];
for(int i = 0; i < 256; i++)
{
token[i] = '\0';
}
Helper::instance()->strtoken(name, ".", token);
name is a char* e.g. "system.fullscreen"
|
|
|
|
|
OK, as already suggested by «_Superman_», probably your code is crashing because you're passing a string literal to the function (strtok cannot access for writing a constant string).
for instance
char * name = "system.fullscreen";
token[0] = strtok(name, "."); would crash the application, while
char name[] = "system.fullscreen";
token[0] = strtok(name, "."); should work fine.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|
Your right, I get a char* name as a parameter and use it to call the function. Thats the cause of the crash. But how do I solve this problem?
I have this char *name and it has to be tokenized. How can I do that as strtok crashes with it?
Btw. thanks for your help, I would have never thought of THAT ^^
|
|
|
|
|
well, if you really need to use that fucntion, then you may assign the array the way I shown in my previous post, or do someting like:
char * name;
name = _strdup("system.fullscreen");
if ( name )
{
strtoken(name, ".", token);
free(name);
}
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|
But if I call it with that char* it crashes!
I have a function
doSomething(char *name)
{
[...]
strtoken(name, ".", token);
}
That works but it does not help me:
doSomething(char *name)
{
[...]
char foo[] = "hello.world";
strtoken(foo, ".", token);
}
But how can I use strtoken with char *name?
Can I make a char foo[] out of char *name?
|
|
|
|
|
if you really need to pass a constant string to doSomething , the you may write
(as already suggested)
doSomething(char * name)
{
char * name_writable_copy = _strdup( name );
if ( name_writable_copy )
{
strtoken(name_writable_copy, ".", token);
free( name_writable_copy );
}
else
{
}
}
The above code shouldn't crash.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|
Ok thx. I will try it in the evening today and post my results.
|
|
|
|
|
Well, good luck!
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|
You missed to tell us how your 'name' variable is declared/defined . Except for it, other stuff seems OK to me (in the sense that they should not provoke a crash).
--
Arman
|
|
|
|
|
error1408 wrote: Helper::instance()->strtoken(name, ".", token);
How about something like:
char *temp = new char[strlen(name) + 1];
strcpy(temp, name);
Helper::instance()->strtoken(temp, ".", token);
"Old age is like a bank account. You withdraw later in life what you have deposited along the way." - Unknown
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
|
|
|
|
|
DavidCrow wrote: How about something like:
char *temp = new char[strlen(name) + 1];
strcpy(temp, name);
Helper::instance()->strtoken(temp, ".", token);
Ok this works! But I don't understand why...could someone explain it to me? Why does the param char * not work but the char * thats created here?
Btw. I have to DELETE the char *temp afterwards, right?
|
|
|
|
|
error1408 wrote: Why does the param char * not work but the char * thats created here?
Work through this:
void main( void )
{
char *abc = "First";
char xyz[] = "Last";
abc[0] = '1';
xyz[0] = '2';
}
error1408 wrote: Btw. I have to DELETE the char *temp afterwards, right?
Correct (since it points to heap memory).
"Old age is like a bank account. You withdraw later in life what you have deposited along the way." - Unknown
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
|
|
|
|
|
Ok I think I got it. So is it right, that in my case I can not know if the char *name that I get is a literal or not so to be sure it's not I have to create a temp array?
|
|
|
|
|
error1408 wrote: ...I can not know if the char *name that I get is a literal or not so to be sure it's not I have to create a temp array?
You'll notice in my example that both variables pointed to a string literal, yet only one of them could be changed. Therein lies the difference between a char* vs. char[] . See here for more.
"Old age is like a bank account. You withdraw later in life what you have deposited along the way." - Unknown
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
|
|
|
|
|
i agree with the pallini's solution and also david gave a good description. string literals r located in a const part of memory which is not writable. this is why arrays don't cause crash. they're located in heap or stack based on whether u allocate them or use local variables which r both writable parts of memory.
there's an API function to determine whether a block of memory or a string is const named AfxIsValidAddress. it may also test whether the block is writable. but if i were u, i would use _strdup anyway, and would pass the arg as const for the caller to make sure that the original version of the passed string is not altered.
|
|
|
|
|
Hi,
I have a header control(i.e CHeaderCtrl). In which I created 5 column. But my requirement is that only 1st column should not move(by dragdrop operation). How to make the perticular column non-movable?
For this I am thinking of reordering the 1st column to orignal position i.e 1st. But how to change the column order programatically?
Thanks:-
Mike
|
|
|
|
|
Check out the HDS_DRAGDROP style and the HDN_xxx notifications.
"Old age is like a bank account. You withdraw later in life what you have deposited along the way." - Unknown
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
|
|
|
|
|
I'm working on a list control application. When i double click on a row, i want to save the data in the 3rd column of that selected row to be store in a string.
Please tel me know how can this be achieved.
Thanks in Advance
|
|
|
|
|
You can do that using the CListCtrl class
The following member functions need to be used -
GetFirstSelectedItemPosition<br />
GetNextSelectedItem<br />
GetItemText
«_Superman_»
|
|
|
|
|
// Map double click using event handling
ON_NOTIFY(NM_DBLCLK, IDC_LIST1, &CListSampleDlg::OnNMDblclkList)
// in the callback function
void CListSampleDlg::OnNMDblclkList(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<lpnmitemactivate>(pNMHDR);
CString str = m_List.GetItemText( pNMItemActivate->iItem, 2 );
AfxMessageBox( str );
*pResult = 0;
}
</lpnmitemactivate>
is this what you want?
-Sarath.
"Great hopes make everything great possible" - Benjamin Franklin
|
|
|
|
|
Thank you for the code. Though it wasn't working I got an idea and completed the required one.
But if i want to save the data of the 3rd column in a string of about more than one selected rows with "|" as separator. Please let me know how can this achieved.
Thanks in advance
|
|
|
|
|
I believe Superman already given you idea on getting text of selected items.
Here's the code snippet. Please check MSDN.It contains lot of sample snippet with documentation
CString strColumText;
POSITION pos = m_List.GetFirstSelectedItemPosition();
if (pos == NULL)
{
TRACE(_T("No items were selected!\n"));
}
else
{
while (pos)
{
int nItem = m_List.GetNextSelectedItem(pos);
strColumText += _T("|") + m_List.GetItemText( nItem, 2 );
}
}
-Sarath.
"Great hopes make everything great possible" - Benjamin Franklin
|
|
|
|
|
I have propertysheet with three dialogs.
I want to process them automatically by calling OnWizardNext() in OnSetActive() method for not showing that dialog. It is working fine except for the final dialog. For the final dialog I am calling OnWizardFinish()on OnSetActive() of that dialog so that finish button functionality should automatically called but still I see that final dialog and need to press that finish button(don't know what am I missing).
Can anyone please help me in that.
Thanks,
Mushtaque Nizamani
|
|
|
|