|
Luc Pattyn wrote: ...you lack the necessary curiosity.
Eloquently said.
BTW, there's a type-o on your home page.
"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
|
|
|
|
|
Hi David,
DavidCrow wrote: there's a type-o
there could be several, and they could well be real mistakes, can you be more specific please.
I'm a bit in doubt about "client's IP address" ...
Luc Pattyn [Forum Guidelines] [My Articles]
- before you ask a question here, search CodeProject, then Google
- the quality and detail of your question reflects on the effectiveness of the help you are likely to get
- use the code block button (PRE tags) to preserve formatting when showing multi-line code snippets
|
|
|
|
|
Luc Pattyn wrote: ...can you be more specific please.
strengthen
Luc Pattyn wrote: I'm a bit in doubt about "client's IP address" ...
That's correct.
"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
|
|
|
|
|
Hi David,
DavidCrow wrote: strengthen
Waw. Thanks for pointing that out. I had no idea, and Googling both shows both appear in similar quantities. I am struggling with th and ht quite often, e.g. height as opposed to width.
is there an easy way to figure it out (apart from Google, Webster and other lookups)?
Luc Pattyn [Forum Guidelines] [My Articles]
- before you ask a question here, search CodeProject, then Google
- the quality and detail of your question reflects on the effectiveness of the help you are likely to get
- use the code block button (PRE tags) to preserve formatting when showing multi-line code snippets
modified on Wednesday, February 18, 2009 10:33 AM
|
|
|
|
|
As far as I understand, you want to pass a function pointer to a thread procedure. In a simplified way it could be done like so:
void MyFuncToPass(int)
{
//..
}
UINT MyThread(PVOID param)
{
typedef void (*F)(int);
F func = (F)param;
func(10); // Call my func passed
return 0;
}
void TheCaller()
{
// run the thread and pass the function to it.
AfxBeginThread(MyThread, (void*)MyFuncToPass);
}
--
Arman
|
|
|
|
|
Hi,
I have a function in a class that has the following sig:
int strtoken(char *str, char *separator, char *token[])
for the *token I do this before:
char *token[256];
for(int i = 0; i < 256; i++)
{
token[i] = '\0';
}
I call the function but at this line it crashes:
token[0] = strtok(str, separator);
Error on writing etc. (German Error, so I don't know exactly what it's called in english)
Can someone help me?
|
|
|
|
|
You can simply initialize the array as follows.
char *token[256] = { 0 };
strtok return a char* (array of character) not a single char.
See the example on using strtok taken from msdn. Read the documentation before using it.
#include <string.h>
#include <stdio.h>
char string[] = "A string\tof ,,tokens\nand some more tokens";
char seps[] = " ,\t\n";
char *token;
int main( void )
{
printf( "Tokens:\n" );
token = strtok( string, seps );
while( token != NULL )
{
printf( " %s\n", token );
token = strtok( NULL, seps );
}
}
</stdio.h></string.h>
-Sarath.
"Great hopes make everything great possible" - Benjamin Franklin
|
|
|
|
|
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
|
|
|
|