View previous topic :: View next topic |
Author |
Message |
Worros
Joined: 19 Jan 2007 Posts: 1123
|
(Separately) Posted: Sat Feb 14, 2009 00:52 Post subject: |
|
|
У меня проблема
Вот такой код
Code: |
char mybuffer[5];
char * toinistring;
toinistring=(char*) malloc(128);
GetWindowRect(GetParent(ListWin), &rcClient);
strcpy(toinistring,"top=");
_itoa(rcClient.top,mybuffer,10);
strcat(toinistring,mybuffer);
strcat(toinistring,"\0");
strcat(toinistring,"\r");
strcat(toinistring,"bottom=");
_itoa(rcClient.bottom,mybuffer,10);
strcat(toinistring,mybuffer);
strcat(toinistring,"\0");
strcat(toinistring,"\r");
strcat(toinistring,"left=");
_itoa(rcClient.left,mybuffer,10);
strcat(toinistring,mybuffer);
strcat(toinistring,"\0");
strcat(toinistring,"\r");
strcat(toinistring,"right=");
_itoa(rcClient.right,mybuffer,10);
strcat(toinistring,mybuffer);
strcat(toinistring,"\n");
WritePrivateProfileSection("MplayerPosition",toinistring,IniFileName);
free(toinistring); |
по непонятной мне причине пишет в конец ini-файла мусор.
В чем моя ошибка? Как выглядит правильный вариант? |
|
Back to top |
|
|
VadiMGP
Joined: 21 Mar 2007 Posts: 1625
|
(Separately) Posted: Sat Feb 14, 2009 03:17 Post subject: |
|
|
Навскидку сразу три ошибки.
1. Нули в конце строк
Quote: | strcat(toinistring,"\0"); | Ты имел в виду добавить ноль в конец строки, но это так не работает. Функция strcat добавляет ДО первого ноля. То есть в своем случае - ничего.
2. Паразитные символы
Quote: | strcat(toinistring,"\r");
strcat(toinistring,"\n"); | Этого быть не должно.
3. Буфер должен заканчиваться двойным нулем. В конце надо добавить еще один ноль. |
|
Back to top |
|
|
VadiMGP
Joined: 21 Mar 2007 Posts: 1625
|
(Separately) Posted: Sat Feb 14, 2009 03:28 Post subject: |
|
|
Да и вообще я бы писал по другому, типа такого
Code: | char * toinistring;
int n,p=0;
toinistring=calloc(1,128);
n=sprintf(toinistring+p,"top=%d",rcClient.top);
p+=n+1;
n=sprintf(toinistring+p,"bottom=%d",rcClient.bottom);
p+=n+1;
n=sprintf(toinistring+p,"left=%d",rcClient.left);
p+=n+1;
n=sprintf(toinistring+p,"right=%d",rcClient.right);
WritePrivateProfileSection("MplayerPosition",toinistring,IniFileName);
free(toinistring);
|
|
|
Back to top |
|
|
Worros
Joined: 19 Jan 2007 Posts: 1123
|
(Separately) Posted: Sat Feb 14, 2009 03:37 Post subject: |
|
|
VadiMGP wrote: | Да и вообще я бы писал по другому, типа такого
|
Скопипастил себе в проект вместо того, что я приводил, всё равно мусорит
Единственное, что я изменил в копипасте, это вернул строчку toinistring=(char*) malloc(128); т.к. на calloc у меня компилятор ругнулся
VS2003 |
|
Back to top |
|
|
VadiMGP
Joined: 21 Mar 2007 Posts: 1625
|
(Separately) Posted: Sat Feb 14, 2009 03:42 Post subject: |
|
|
Worros wrote: | Единственное, что я изменил в копипасте, это вернул строчку toinistring=(char*) malloc(128); |
Вот и получил плюшку. Я же не с бухты-барахты написал calloc. А потому что он сразу инициализирует выделенную память нулями. А ты вернул, вот и остался с мусором в памяти. Обнулять надо. |
|
Back to top |
|
|
Worros
Joined: 19 Jan 2007 Posts: 1123
|
(Separately) Posted: Sat Feb 14, 2009 03:48 Post subject: |
|
|
Помогло, большое спасибо! |
|
Back to top |
|
|
VadiMGP
Joined: 21 Mar 2007 Posts: 1625
|
(Separately) Posted: Sat Feb 14, 2009 03:59 Post subject: |
|
|
В принципе можно и покрасивше . Даже и malloc подойдет.
Code: | char * toinistring,*ptr;
ptr=toinistring=(char*) malloc(128);
ptr+=sprintf(ptr,"top=%d",rcClient.top)+1;
ptr+=sprintf(ptr,"bottom=%d",rcClient.bottom)+1;
ptr+=sprintf(ptr,"left=%d",rcClient.left)+1;
ptr+=sprintf(ptr,"right=%d",rcClient.right)+1;
*ptr=0;
WritePrivateProfileSection("MplayerPosition",toinistring,IniFileName);
free(toinistring);
|
|
|
Back to top |
|
|
Worros
Joined: 19 Jan 2007 Posts: 1123
|
(Separately) Posted: Sat Feb 14, 2009 04:03 Post subject: |
|
|
А второй вариант не ест памяти на 128 чаров больше?
И ptr тогда тоже освобождать надо? |
|
Back to top |
|
|
VadiMGP
Joined: 21 Mar 2007 Posts: 1625
|
(Separately) Posted: Sat Feb 14, 2009 04:06 Post subject: |
|
|
Нет, никакой дополнительной памяти никто не ест и, соответственно, освобождать тоже не надо. |
|
Back to top |
|
|
Worros
Joined: 19 Jan 2007 Posts: 1123
|
(Separately) Posted: Sat Feb 14, 2009 04:08 Post subject: |
|
|
Угу, дошло. Две ссылки на одну и ту же область памяти. Туплю
Спасибо. |
|
Back to top |
|
|
VadiMGP
Joined: 21 Mar 2007 Posts: 1625
|
(Separately) Posted: Sat Feb 14, 2009 04:20 Post subject: |
|
|
Кстати, хотел спросить - а зачем вообще динамически память выделять? Не проще будет сразу написать
Code: | char toinistring[128],*ptr=toinistring; |
Зачем сыр-бор с выделением и освобождением? |
|
Back to top |
|
|
Worros
Joined: 19 Jan 2007 Posts: 1123
|
(Separately) Posted: Sat Feb 14, 2009 04:23 Post subject: |
|
|
По неопытности. Погорячился
Вообще-то был не доведенный до ума замысел не выделять строку больше необходимой, но это, видимо, не стоит накладных расходов на выделение/освобождение памяти. |
|
Back to top |
|
|
VadiMGP
Joined: 21 Mar 2007 Posts: 1625
|
(Separately) Posted: Sat Feb 14, 2009 04:38 Post subject: |
|
|
Если ты, хотя бы примерно, знаешь сколько нужно (в разумных пределах, конечно, не мегабайты) то статическое распределение выгоднее. |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|