|
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
|
|
|
|
|
Try calling DestroyWindow at the end.
«_Superman_»
|
|
|
|
|
Thanks for the reply.
still no luck, now it displays corrupted final dialog with finish button.
Regards,
Mushtaque Nizamani
|
|
|
|
|
Why to give a call to the dialog when you intend to kill it explicitly without user intervation?
BTW did you try PressButton(PSBTN_FINISH)
You need to google first, if you have "It's urgent please" mentioned in your question.
_AnShUmAn_
|
|
|
|
|
Hi. I'm trying to send an array of UDT from Excel VBA to a C++ dll but have no idea which direction I should look. Here's what I'm trying to do
MyTestDLL.cpp
#pragma pack(4)
struct MyCppType
{
short iVal;
double dVal;
BSTR bstr;
};
#pragma pack()
void _stdcall MyDllFunction (array of MyCppType)
{
}
MyTestDLL.def
LIBRARY "MyTestDll"
EXPORTS
MyDllFunction @1
MyTestExcel.xlsm
Option Explicit
Declare Sub MyDllFunction Lib "MyTestDLL.dll" (arr() As MyVbaType)
Type MyVbaType
iVal As Integer
dVal As Double
sVal As String
End Type
Sub Test()
Dim arr(2) As MyVbaType
arr(1).iVal = 1
arr(1).dVal = 1.1
arr(1).sVal = "one"
arr(2).iVal = 2
arr(2).dVal = 2.2
arr(2).sVal = "two"
MyDllFunction (arr)
End Sub
I've posted this problem on the VB forum and was advised to post it here. Please help
|
|
|
|
|
Hi I need to do the same thing. Can anyone give any pointers to it plz....
|
|
|
|