Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Не могу понять, почему компилятор матерится  (Прочитано 11288 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Ray
Интересующийся

by
Offline Offline

« : 20-01-2009 11:38 » 

Не могу понять, почему так работает
Код:
char* pPathToINI = new char[MAX_LENGTH];                                  
...
{
  ...                                                                         
  char* pBuffer = new char[MAX_LENGTH];                                   
  pBuffer = GetCurrentPath(pBuffer);                                     
  lstrcpy(pPathToINI,pBuffer);
}                                                                         
char* pFullPathToINI = lstrcat(pPathToINI,INIFILE);     



А вот так - нет, компилятор ругается благим матом.
Код:
char* pPathToINI = new char[MAX_LENGTH];                                  
...                                                                         
{                                                                         
  ...
  char* pBuffer = new char[MAX_LENGTH];                                   
  pBuffer = GetCurrentPath(pBuffer);                                     
  lstrcpy(pPathToINI,pBuffer);                                           
}                                                                         
char* pFullPathToINI;
pFullPathToINI = lstrcat(pPathToINI,INIFILE);

В первом случае(когда работает) происходит инициализация pFullPathToINI адресом указателя pPathToINI.
Во втором - pFullPathToINI присваивается адрес указателя pPathToINI.
В MSDN по поводу lstrcat написано: If the function succeeds, the return value is a pointer to the buffer. Т.е. буфер на pPathToINI.
Можно конечно оставить первый вариант, ноя хочу разобраться, почему второй не работает.

Может кто-нибудь объяснить?

Вот так ругается компилятор:
Links.cpp|29|error C2501: 'pFullPathToINI' : missing storage-class or type specifiers|
Links.cpp|29|error C2040: 'pFullPathToINI' : 'int' differs in levels of indirection from 'char *'|
Links.cpp|29|error C2440: 'initializing' : cannot convert from 'char *' to 'int'|
||=== Build finished: 3 errors, 0 warnings ===|
Записан
Артем
Опытный

nz
Offline Offline
Пол: Мужской
Beware the wolf in sheep's clothing.


« Ответ #1 : 20-01-2009 12:56 » 

Если я не ошибаюсь, то результат работы lstrcat(pPathToINI,INIFILE), лежит в pPathToINI.   А возращаемое значение используется только для проверки успешно или не успешно сработала функция.

Что касается ошибок компилятора, то, похоже, что он считает будто возвращаемое значение int.

P.S. К сожалению сейчас нет ни студии, ни МСДНа под рукой.
« Последнее редактирование: 20-01-2009 12:58 от Артем » Записан
Ray
Интересующийся

by
Offline Offline

« Ответ #2 : 20-01-2009 14:03 » 

Завернул все это дело в вункцию.
Странно конечно,но заработало.

Код:
char* pFullPathToINI;
void foo()
{
  pFullPathToINI = lstrcat(pPathToINI,INIFILE);
}

Чего-то я недопонимаю...
Нужно будет покопаться в стандартах...
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 20-01-2009 15:13 » 

Ray, а ты в какой среде это делаешь ?
Записан

Ray
Интересующийся

by
Offline Offline

« Ответ #4 : 21-01-2009 09:13 » 

Code::Blocks+VC++ 6.0
К Code::Blocks можно прикрутить любой количество любых компиляторов.
Классная штука,кстати, кроссплатформенная, бесплатная,опенсорс и быстроразвивающаяся.

Перечитал кое что из Струаструпа... много чего написано про инициализацию и т.д.
Но про такой случай - ничего.
Странно конечно.
Все равно не могу понять, почему после заключения pFullPathToINI в функцию все заработало.
Какая разница, ведь вот так:
Код:
char* pFullPathToINI;
pFullPathToINI = lstrcat(pPathToINI,INIFILE);
по-идее должно работать... не понимаю. Объясните кто-нибудь, кто знает.
Ну или, если лень, ссылку дайте, я с огромным удовольствием почитаю.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 21-01-2009 09:28 » 

Ray, ну если предположить, что INIFILE имеет тип const char* или char*, то у меня оба варианта нормально скомпилились
Записан

Ray
Интересующийся

by
Offline Offline

« Ответ #6 : 21-01-2009 11:06 » 

У меня так, #define INIFILE "Links.ini"
Оборачиваю в скобки - компилится, не оборачиваю - нет Жаль
Записан
Ray
Интересующийся

by
Offline Offline

« Ответ #7 : 22-01-2009 07:50 » 

Разобрался.
Проблема была в том, что я "сморозил", забыл, что в с++ нельзя чтобы код так просто лежал.Код должен быть в функциях.
Если есть несколько программных моулей и в каждом из них будет код вне функции, компилятор не сможет однозначно определить в какой последовательности этот код надо выполнять.
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 22-01-2009 08:39 » 

Ray, если я верно понимаю суть твоей ошибки, то не так, чтобы компилятор не сможет определить. Если бы и была такая возможность, есть у каждой программы есть вполне определённая точка входа - функция main - и не существует никакого легального способа перейти куда-либо из неё, кроме как вызвать функцию Улыбаюсь (можно, конечно, и ассемблерную вставку написать, или другое непотребство - но это уже самодеятельность Улыбаюсь )
А "код вне функций" в случае C++ - только статическая инициализация глобальных переменных и статических членов класса, если я ничего не упустил.

К слову, что-то тревожит меня в коде
Код:
char* pFullPathToINI;
void foo()
{
  pFullPathToINI = lstrcat(pPathToINI,INIFILE);
}
- получается функция с побочным эффектом, совершаемым над глобальными переменными. Код вполне допустим, но, на мой вкус, лучше бы без глобальных переменных.
Записан
Ray
Интересующийся

by
Offline Offline

« Ответ #9 : 22-01-2009 12:15 » 

А как бы ты посоветовал на свой вкус?

И.. забыл сказать, это не exe. Это dll.
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 22-01-2009 12:24 » 

В dll, в сущности, тоже есть точка входа Улыбаюсь (это если говорить о коде инициализации, отрабатывающем при загрузке библиотеки)

Я не знаю, как в твоём случае лучше: в dll, может, глобальные переменные и нужны - если они требуются для хранения данных между вызовами функций. Если нужны - то хранить их я бы стал, наверное, как-нибудь локализовав. Скажем, создал какой-нибудь класс DllContext (синглетон или статический), и хранил бы в нём всё необходимое.
Записан
Ray
Интересующийся

by
Offline Offline

« Ответ #11 : 22-01-2009 12:54 » 

Хм.. тоже вариант.
Спасибо.
Записан
Zykis
Гость
« Ответ #12 : 18-11-2009 15:04 » 

Ray, Спасибо за оставленные сообщения. помог решить проблему.
Если я правильно понял, вне функций переменную можно только определить (объявить), а код надо писать именно в фунцкиях.
Записан
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #13 : 19-11-2009 09:58 » 

Zykis,

Вне функции ты можешь определять только статические переменные класса (а не любые!) или глобальные переменные программы, а все остальное (т.е. сам код) - только в каком-то замкнутом пространстве (читай - в глобальных функциях или функциях класса).
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines