Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 811
от 02.08.2007, 17:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 503, Экспертов: 64
В номере:Вопросов: 3, Ответов: 7


Вопрос № 96629: Здравствуйте!Подскажите как преобразовать тип string к типу AnsiString?заранее спасибо...
Вопрос № 96658: Здравствуйте уважаемые эксперты! Посмотрите пожалуйста код простенькой программы, которая в бесконечном цикле просит ввести число и если оно положительное, то суммирует, иначе выход из программы. #include <iostream> #inc...
Вопрос № 96696: Здравствуйте! Я написал скрипт на С++ в среде C++Builder6.0 скомпилировал получился файл с расширением *.exe У меня сайт на платном хосте, сервер работает под ОС Linux. Проблемма в том, что я не могу скомпилировать файл *.cpp используя доступ SSH, де...

Вопрос № 96.629
Здравствуйте!Подскажите как преобразовать тип string к типу AnsiString?заранее спасибо
Отправлен: 27.07.2007, 17:19
Вопрос задал: Hunter20 (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Терсков Сергей
Здравствуйте, Hunter20!
У класса AnsiString - перегружен оператор присваивания = для константных C-строк. Поэтому можно воспользоваться следующей конструкцией:

AnsiString a_str;
string str("A test string");

a_str = str.c_str();

Или напрямую одним из конструкторов класса AnsiString:

string str("A test string");
AnsiString a_str(str.c_str());
Ответ отправил: Терсков Сергей (статус: Студент)
Ответ отправлен: 31.07.2007, 03:43
Оценка за ответ: 5


Вопрос № 96.658
Здравствуйте уважаемые эксперты!

Посмотрите пожалуйста код простенькой программы, которая в бесконечном цикле просит ввести число и если оно положительное, то суммирует, иначе выход из программы.

#include <iostream>
#include <conio.h>
using namespace std;
//Описываем функцию суммирования.
int main ()
{
int a = 0;
for (;;)
{
int nChislo;
cout << "Vvedite chislo ";
cin >> nChislo;
//Проверяем введённое число.
if (nChislo > 0)
{
a = a + nChislo;
continue;
}
else (nChislo < 0);
{
cout << "Vvedeno otritsatelnoe chislo ";
break;
}
}
getch ();
return a;
}

Программа работает только в том случае, если функция называется main. Стоит только дать ей произвольное имя, например int summa или void summa, то при компилировании выдаёт:

Build started: Project: case, Configuration: Debug Win32 ------
Compiling...
case.cpp
c:documents and settingssplashmy documentsvisual studio 2005projectscasecasecase.cpp(25) : warning C4996: 'getch' was declared deprecated
c:program filesmicrosoft visual studio 8vcincludeconio.h(145) : see declaration of 'getch'
Message: 'The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _getch. See online help for details.'
Linking...
MSVCRTD.lib(crtexe.obj) : error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup
C:Documents and SettingssplashMy DocumentsVisual Studio 2005ProjectscaseDebugcase.exe : fatal error LNK1120: 1 unresolved externals
Build log was saved at "file://c:Documents and SettingssplashMy DocumentsVisual Studio 2005ProjectscasecaseDebugBuildLog.htm"
case - 2 error(s), 1 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Две ошибки, при чём не понятно какого характера.
Объясните пожалуйста.
Отправлен: 27.07.2007, 23:18
Вопрос задал: Чирков Вячеслав Александрович (статус: Посетитель)
Всего ответов: 5
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Алексей Демаков
Здравствуйте, Чирков Вячеслав Александрович!

1. Выполнение C/C++ программы начинается с функции main. Если вы пытаетесь собрать исполнимую программу, а функция main отсутствует - будет сообщение об ошибке, в данном случае:
MSVCRTD.lib(crtexe.obj) : error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup
На второе сообщение об ошибке не стоит обращать внимания, оно про то же самое.

Можете переименовать функцию в int summa, но при этом добавить функцию main.
Ответ отправил: Алексей Демаков (статус: Студент)
Ответ отправлен: 27.07.2007, 23:41

Отвечает: V1s0r
Здравствуйте, Чирков Вячеслав Александрович!

(ответ эксперта Алексея Демакова)... т.е. сделать нечто вроде этого:

Приложение:

Ответ отправил: V1s0r (статус: 3-ий класс)
Ответ отправлен: 27.07.2007, 23:57
Оценка за ответ: 4

Отвечает: Ilkras
Здравствуйте, Чирков Вячеслав Александрович!
Ошибка здесь только одна - провал попытки линкера найти функцию main. Имя первой или главной функции ("main") является частью стандарта С и С++. Именно к этой функции линкер должен добавить сартовый код, который сделает програму исполнимой.
В принципе, если вы не даете вашей вызываемой функции имя "main", то програма может быть откомпилирована в объектный код (вы получите на выходе файл(ы) типа fail.obj или fail.o) и может быть слинкована позже с любым исполняемым модулем. Например в операционной системе vxworks вы сможете запустить вашу функцию просто по имени. Причина - данная система поддерживает динамическую линковку. WIndows, во всех вариантах, динамическую линковку не поддерживат (вы можете это сделать из своей програмы, но это не произойдет автоматически) и стало быть, для того чтобы создать отдельную исполняемую програму вам надо определить имя "main".
Еще один способ обойти имя "main" - вы можете построить динамическую библиотеку (dll), она не требуе имени "main" и представляет собой набор объектных модулей, готовых быть подгруженными другой програмой. После этого вам надо создать исполняемый модуль, который будет подгружать нужный dll и вызывать нужную функцию, его можно сделать интерактивным. Тогда вы сможете вызывать любые функции из любых dll-й.
Ответ отправил: Ilkras (статус: Студент)
Ответ отправлен: 28.07.2007, 09:28
Оценка за ответ: 4

Отвечает: Sema
Здравствуйте, Чирков Вячеслав Александрович!
Ну как бы все консольные прогрммы на С++ начинаются с функции main, это такое правило
Ответ отправил: Sema (статус: 2-ой класс)
Ответ отправлен: 28.07.2007, 11:44

Отвечает: Терсков Сергей
Здравствуйте, Чирков Вячеслав Александрович!
Ответов уже конечно много, но все таки они не совсем соответствуют действительности. Действительно формат функции main четко обозначен в стандарте. Но как же тогда быть с функциями типа WinMain? Подробнее по этой теме смотрите статью на RSDN:

Анатомия C Run-Time, или Как сделать программу немного меньшего размера
Ответ отправил: Терсков Сергей (статус: Студент)
Ответ отправлен: 31.07.2007, 03:25


Вопрос № 96.696
Здравствуйте! Я написал скрипт на С++ в среде C++Builder6.0 скомпилировал получился файл с расширением *.exe У меня сайт на платном хосте, сервер работает под ОС Linux. Проблемма в том, что я не могу скомпилировать файл *.cpp используя доступ SSH, дело в том что я просто не знаю как это делать. На сервере используется компилятор g++ для ssh доступа я использую программу Putty. Устанавливаю соединение открывается консоль с запросом логинаи пороля, ввожу логин с паролем, а что дальше делать я не знаю. Куда ложить файл *.cpp который надо скомпилировать? Что писать в кансоле?
Есть ещё один вопрос. Как выставить прова у файла на сервере?
Подскажите что делать?
Отправлен: 28.07.2007, 15:35
Вопрос задал: Грибанов Фёдор Александрович (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: estiGi
Здравствуйте, Грибанов Фёдор Александрович!
чтобы просто скомпилировать, наберите в консоли следующее:
g++ -o output_file source_file.cpp
библиотеки подключаются ключом -l, причем имя либы урезается спереди и сзади - спереди убирается суффикс lib, сзади расширение. Т.е. если у вас файл использует либу libtest.a, то будет так:
g++ -o output_file source_file.cpp -L. -ltest
Ключ -L указывает, где искать библиотеку, потому что компилятор ищет только в стандартных путях. В данном случае -L. означает искать в текущей директории.
Для понятия подключения объектных файлов, динамических библиотек и т.п. самых распространненных опций компилятора скачайте этот файлик:
http://www.advancedlinuxprogramming.com/alp-folder/alp-ch01-advanced-unix-programming-with-linux.pdf, глава 1.2 Compiling with GCC.
И вообще, почитайте эту книгу, там очень многое изложено в кратких и содержательных формах. Вот оригинал, можно свободно качать: http://www.advancedlinuxprogramming.com/alp-folder. А вообще советую купить ее. Она стоит копейки, но информации для базовой работы с линухом там более чем, очень рекомендую. Вот она в русском варианте: http://www.williamspublishing.com/Books/Lnd_AdvLinuxProgramming.html
Ответ отправил: estiGi (статус: Студент)
Ответ отправлен: 30.07.2007, 22:59


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Email: support@rusfaq.ru, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.54 beta от 01.08.2007
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное