Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

разобрать секцию из ini файла
Goto page Previous  1, 2
 
Post new topic   Reply to topic    Total Commander Forum Index -> Написание плагинов для Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
Worros



Joined: 19 Jan 2007
Posts: 1123

Post (Separately) Posted: Sat Feb 14, 2009 00:52    Post subject: Reply with quote

У меня проблема
Вот такой код
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
View user's profile Send private message
VadiMGP



Joined: 21 Mar 2007
Posts: 1625

Post (Separately) Posted: Sat Feb 14, 2009 03:17    Post subject: Reply with quote

Навскидку сразу три ошибки.
1. Нули в конце строк
Quote:
strcat(toinistring,"\0");
Ты имел в виду добавить ноль в конец строки, но это так не работает. Функция strcat добавляет ДО первого ноля. То есть в своем случае - ничего.

2. Паразитные символы
Quote:
strcat(toinistring,"\r");
strcat(toinistring,"\n");
Этого быть не должно.

3. Буфер должен заканчиваться двойным нулем. В конце надо добавить еще один ноль.
Back to top
View user's profile Send private message
VadiMGP



Joined: 21 Mar 2007
Posts: 1625

Post (Separately) Posted: Sat Feb 14, 2009 03:28    Post subject: Reply with quote

Да и вообще я бы писал по другому, типа такого
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
View user's profile Send private message
Worros



Joined: 19 Jan 2007
Posts: 1123

Post (Separately) Posted: Sat Feb 14, 2009 03:37    Post subject: Reply with quote

VadiMGP wrote:
Да и вообще я бы писал по другому, типа такого

Скопипастил себе в проект вместо того, что я приводил, всё равно мусорит Shocked
Единственное, что я изменил в копипасте, это вернул строчку toinistring=(char*) malloc(128); т.к. на calloc у меня компилятор ругнулся
VS2003
Back to top
View user's profile Send private message
VadiMGP



Joined: 21 Mar 2007
Posts: 1625

Post (Separately) Posted: Sat Feb 14, 2009 03:42    Post subject: Reply with quote

Worros wrote:
Единственное, что я изменил в копипасте, это вернул строчку toinistring=(char*) malloc(128);

Вот и получил плюшку. Я же не с бухты-барахты написал calloc. А потому что он сразу инициализирует выделенную память нулями. А ты вернул, вот и остался с мусором в памяти. Обнулять надо.
Back to top
View user's profile Send private message
Worros



Joined: 19 Jan 2007
Posts: 1123

Post (Separately) Posted: Sat Feb 14, 2009 03:48    Post subject: Reply with quote

Помогло, большое спасибо!
Back to top
View user's profile Send private message
VadiMGP



Joined: 21 Mar 2007
Posts: 1625

Post (Separately) Posted: Sat Feb 14, 2009 03:59    Post subject: Reply with quote

В принципе можно и покрасивше . Даже и malloc подойдет. Very Happy

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
View user's profile Send private message
Worros



Joined: 19 Jan 2007
Posts: 1123

Post (Separately) Posted: Sat Feb 14, 2009 04:03    Post subject: Reply with quote

А второй вариант не ест памяти на 128 чаров больше?

И ptr тогда тоже освобождать надо?
Back to top
View user's profile Send private message
VadiMGP



Joined: 21 Mar 2007
Posts: 1625

Post (Separately) Posted: Sat Feb 14, 2009 04:06    Post subject: Reply with quote

Нет, никакой дополнительной памяти никто не ест и, соответственно, освобождать тоже не надо.
Back to top
View user's profile Send private message
Worros



Joined: 19 Jan 2007
Posts: 1123

Post (Separately) Posted: Sat Feb 14, 2009 04:08    Post subject: Reply with quote

Угу, дошло. Две ссылки на одну и ту же область памяти. Туплю Sad
Спасибо.
Back to top
View user's profile Send private message
VadiMGP



Joined: 21 Mar 2007
Posts: 1625

Post (Separately) Posted: Sat Feb 14, 2009 04:20    Post subject: Reply with quote

Кстати, хотел спросить - а зачем вообще динамически память выделять? Не проще будет сразу написать
Code:
char toinistring[128],*ptr=toinistring;

Зачем сыр-бор с выделением и освобождением?
Back to top
View user's profile Send private message
Worros



Joined: 19 Jan 2007
Posts: 1123

Post (Separately) Posted: Sat Feb 14, 2009 04:23    Post subject: Reply with quote

По неопытности. Погорячился Smile

Вообще-то был не доведенный до ума замысел не выделять строку больше необходимой, но это, видимо, не стоит накладных расходов на выделение/освобождение памяти.
Back to top
View user's profile Send private message
VadiMGP



Joined: 21 Mar 2007
Posts: 1625

Post (Separately) Posted: Sat Feb 14, 2009 04:38    Post subject: Reply with quote

Если ты, хотя бы примерно, знаешь сколько нужно (в разумных пределах, конечно, не мегабайты) то статическое распределение выгоднее.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Написание плагинов для Total Commander All times are GMT + 4 Hours
Goto page Previous  1, 2
Page 2 of 2

 
Jump to:  
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