954,504 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Have something to say? Contribute New Article Reply to this Article

C++ character overflow help!!

Hi
I am using Visual 6 C++ and try to retrieve a member's all closed trades. i declare a string as below:

char str[8000]={0};

But this declaration is ok and the program work fine if the member's record size does not exceed 8000bytes.


In order to be able to retrieve member's record where total size more than 8000, i have declare as below:

char *str = new char();

This declaration works fine but it hang my server. Whenever i execute this API with this declaration, my MT4 server will hang, and its service cannot restarted. We have to restart the server.

Is there any way or any example where i can return big volume data?


Thanks.


My main code to retrieve data as below:

trades=ExtServer->OrdersGetClosed(start, end,userlogins,1, &total);

//OrdersGetClosed(const time_t from,const time_t to,const int *logins,const int count,int* total);

// check orders
for(j=0; j<total; j++)
{
if(strcmp(GetCmd(trades[j].cmd), "credit")!=0 && strcmp(GetCmd(trades[j].cmd), "balance")!=0)
{
sprintf(tmp,"%d",trades[j].order);
strcat(str,tmp);
strcat(str,",");
sprintf(tmp,"%d",trades[j].login);
strcat(str,tmp);
strcat(str,",");
FormatDateTime(trades[j].open_time,tmp,sizeof(tmp)-1,TRUE,TRUE);
strcat(str,tmp);
strcat(str,",");
strcat(str, GetCmd(trades[j].cmd));
strcat(str,",");
COPY_STR(tmp, trades[j].symbol);
_strlwr(tmp);
strcat(str, tmp);
strcat(str,",");
sprintf(tmp,"%.2lf",trades[j].volume/100.0);
strcat(str,tmp);
strcat(str,",");
ToSymExt(tmp, trades[j].open_price, trades[j].digits);
strcat(str, tmp);
strcat(str,",");
FormatDateTime(trades[j].close_time,tmp,sizeof(tmp)-1,TRUE,TRUE);
strcat(str,tmp);
strcat(str,",");
ToSym(tmp, trades[j].close_price, trades[j].digits);
strcat(str, tmp);
strcat(str,",");

strcat(str, ToMoney(trades[j].commission, 2, tmp, sizeof(tmp)-1));
strcat(str,",");
strcat(str, ToMoney(trades[j].taxes, 2, tmp, sizeof(tmp)-1));
strcat(str,",");
strcat(str, ToMoney(trades[j].commission_agent, 2, tmp, sizeof(tmp)-1));
strcat(str,",");
strcat(str, ToMoney(trades[j].storage, 2, tmp, sizeof(tmp)-1));
strcat(str,",");
strcat(str, ToMoney(trades[j].profit, 2, tmp, sizeof(tmp)-1));
strcat(str,",");
mul=Decimals(trades[j].digits);
if(trades[j].cmd==OP_BUY)
pips=NormalizeDouble(trades[j].close_price*mul,0)-NormalizeDouble(trades[j].open_price *mul,0);
else
pips=NormalizeDouble(trades[j].open_price *mul,0)-NormalizeDouble(trades[j].close_price*mul,0);

sprintf(tmp,"%d", int(pips));
strcat(str, tmp);
strcat(str,",");
strcat(str, trades[j].comment);

strcat(str,"\n");
}

}
strcat(str,"end\r\n");
//---- clear
HEAP_FREE(trades); trades=NULL;
if(strlen(str)==0)
return _snprintf(buffer,size-1,"ERROR\r\nNo Orders for %d\r\nend\r\n", userlogin);
else
return _snprintf(buffer,size-1,"%s", str);

i am using native dll and cannot use MFC

any advise would be appreciated thanks

pacx
Newbie Poster
4 posts since Jan 2009
Reputation Points: 10
Solved Threads: 0
 

>>char *str = new char();

Do you really mean something like [icode]char *str = new char(Size);[/code] so that more than 1 character is allocated???

Can't really tell much from the code you posted because there are several undefined variables -- such as temp.

Ancient Dragon
Retired & Loving It
Team Colleague
30,049 posts since Aug 2005
Reputation Points: 5,662
Solved Threads: 2,343
 

hi

i am currently using
char str[8000]={0};

this program actually retrieve some data via api and i am suppose to return and 'massage' the values in the api via the variable str

the problem with this code is that when i try to return str that exceed 8000 characters, the program will hung...

pacx
Newbie Poster
4 posts since Jan 2009
Reputation Points: 10
Solved Threads: 0
 

Do you need to return the whole result in a character buffer?

Could you return a vector of strings with one string per trade?

Murtan
Practically a Master Poster
671 posts since May 2008
Reputation Points: 344
Solved Threads: 116
 

hi


my application allow only native dlls.. i cant seem to use string to solve my problem..

pacx
Newbie Poster
4 posts since Jan 2009
Reputation Points: 10
Solved Threads: 0
 

Can you use vector?

If not, you have a little more work cut out for you, but it can still be done. (I am presuming you have a heap and can allocate memory.)

I can fairly easily imagine a class where you can 'add' a C style string to it and it would keep an array of the strings. When you call the 'add' it could allocate enough space to hold the string and copy it in. It would then store the pointer to the new string in an array of character pointers. If you ran out of entries in the array of pointers, you could allocate a new array of pointers (some number of pointers bigger -- think 50 or 100) and copy the old pointers to it and release the old array.

This would provide functionality similar to vector without using "non-native" code.

Once you have assembled all of the trade data, you would return this new object and the calling code could iterate the strings in the object to access all of the compiled data.

Murtan
Practically a Master Poster
671 posts since May 2008
Reputation Points: 344
Solved Threads: 116
 

hi

my application allow only native dlls.. i cant seem to use string to solve my problem..

if for some reason you cant use stl, you coulc have buffers that hold up to a set amount;in other words keep a large buffer aside that holds, say 4000 characters, as soon as it is full use the next 4000, and switch back and forth. Aside from having more thant 8000 characters at your disposal, anything more than that has to go somewhere if you are at a hard limit.

seanhunt
Light Poster
40 posts since Oct 2008
Reputation Points: 13
Solved Threads: 6
 

any sample codes i can take a look ?

pacx
Newbie Poster
4 posts since Jan 2009
Reputation Points: 10
Solved Threads: 0
 

This article has been dead for over three months

Post: Markdown Syntax: Formatting Help
You