СообЧа > База Знаний > Программирование > C, С++

Вопрос

Прочитал в умной книжке, что минимальная программа для Windows — это Winmain()+функция окна. А может ли быть программа для Windows совсем без окна? Мне нужно, к примеру просто выполнить какую-то операцию, для которой окна совсем не нужно (если точнее — открыть файл, перекодировать его содержимое из Windows в Dos кодировку и снова записать). Если использовать Main() — лезет консоль.

Ответ

Один Winmain() (без окон) тоже работает. Но лучше создать окно и завести в нем хотя бы ProgressBar. Иначе пользователь потратит слишком много времени на размышления, чем это у него компьютер так долго занимается. Особенно, если файл большой.

Если же необходимый интерфейс уже имеется, например, создан в VB, 1С и т.п., лучше создавать функцию в dll или сделать ActiveX.

Андрей Шуклин

Делаешь проект SDI-aplications, применяешь стандартные настройки APP-Wizard. А в методе OnDraw() класса CххххView просто скрываешь окно при помощи, вроде, HideWindow() (тут могу и ошибиться), потом можешь восстановить окно (ShowWindow()), а можешь просто закончить программу.

Есть еще один способ, как я думаю. Только что попробовал. Делаешь проект DialogBased, все настройки — по умолчанию. Потом открываешь редактор ресурсов и изменяешь настройки диалогового окна так: Все флажки сбрасываешь, Stile = Child, Border = None. А теперь в методе InitInstance() класса CxxxApp после TODO: пишешь свой код… ;-)))) У меня так получилось!

Vadik

Вопрос был — БЕЗ окна. БЕЗ окна можно — пиши сервис (как — вопрос отдельный). Мэйн без окна НЕЛЬЗЯ (привет от Windows — в переводе — окна).

Сергей

Можно без окна и БЕЗ сервиса. Для VC++ создаешь проект Win32 Application, добавляешь свой код внутрь WinMain() и он прекрасно работает без всяких окон. Вот тебе и минимальная программа.
Mbr>Юрий

При переопределении функции InitInstanse используется вызов функции ShowWindow, которая принимает один параметр — режим отображения окна. Если этот параметр 0 или константа SW_HIDE, то окно не отображается. Правда потом его тоже не отобразишь. Теперь Ваша программа будет видна только в процессах.

sergyenko

Вопрос

В Visual C++6.0 кириллица после компиляции отображается в виде каракулей. Помогите исправить.

Ответ

Если после компиляции — почти наверняка у тебя ресурсы не на русском. Во вкладке ресурсов щелкаешь на нужный тип ресурсов (все по очереди), в свойствах (правой кнопкой — properties) выбираешь язык Russian.

Вопрос

Версия языка: 6.0
Вы не подскажете, где в сети можно взять подробную документацию по программированирию на VC на русском языке.

Ответ

Вообще, по VC материалов очень мало. Могу дать ссылку на наш университетский FTP. Нам преподавали MFC и там куча материалов по этому поводу. В том числе и на русском.
Адрес: ftp://ermak.cs.nstu.ru(ftp-протокол, есессно.)

папка metodic — там по-моему каталог MFC.
описание некоторых файлов:

lectmfc.zip — учебный курс, на русском языке
seactxvc++ — создание ActiveX на русском тоже
Act.zip — пример создания простенького ActiveX на русском по шагам с картинками.
ExamplesfromMeshkov.zip — примеры из книжки Мешкова, Тихомирова: Visual C++ и MFC.
mfc.zip — информация от microsoft на английском по-моему года так 2001
mfc_programmers_sourcebook.zip — сайт codeguru.com — просто золото, примеры и объснение создания многого, что пригодится — 100%, правда все на аглицком и весит 22.8 Мб :-( Впрочем, можно в онлайне лазить.
MFCmet.zip — методичка, с заданиями к лабам и полным руководством.
TransparentWindow_***.zip — пример создания нестандартного окна овальной формы с дырочкой — посмотри — супер.

Из конференции Expert_FAQ

Посмотрите
http://www.firststeps.ru и, конкретнее,
http://www.firststeps.ru/mfc/steps/mfc1.html

Вопрос

Очень нужен файл Wbclsdsr.ocx ! При записи на болванку MS Visual_C++ 6.0 произошла ошибка и в результате, после инсталляции c этой болванки, прога требует этот файл. Подскажите где найти в инете или может можете выложить на ftp?

Ответ

Можешь скачать этот файл с моего сайта:

http://home.skif.net/~shupik

Ссылка находится в русскоязычной версии сайта, раздел «Программы».

Из конференции Expert_FAQ

Вопрос

Нужен учебник просто по с++ (различия между мелкософтом и борландом мне никогда не понять) в виде ряда статей (можно в виде одного большого файла) в инете. Интересует создание приложений для винды в графической оболочке, _подробно_, с нуля (сам язык тоже с нуля).

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

Ответ

Самый лучший источник, который я встречал в интернете

ftp://ftp.leivo.ru/pub/warez/books/
Также можно посмотреть тут интересующую информацию:
www.proglib.ru
www.sources.ru
www.subterrain.net
www.firststeps.ru
А если нужно с «нуля» писать программы, тогда вам по этим линкам стоит пройтись:

http://www.cs.nyu.edu/courses/fall98/v22.0201-002/
asm.kalashnikoff.ru
win32asm.cjb.net
wasm.zite.ru
www.wasm.ru
www.movsd.com
http://ap.diaspora.ru/cgi-bin/down.pl

Из конференции Expert_FAQ

Вопрос

Как в C++Builder сделать интерфейс, подобный MS Office? Т.е., например, чтобы кнопку можно было бы добавить в строке меню и прочее?

Ответ

Во-первых, для создания главной формы используй FormStyle — MDIForm, затем создаешь вторую форму, у которой FormStyle — MDIChild и делаешь ее Available form, в меню — пункт New, прописываешь TForm2 *f=new Tform2(this); т.е будет появляться дочернее окно при нажатии New, почти как в МОфисе (и таких окон сколько хочешь).
Насчет кнопок меню: для этого существует компонент ToolBar, на который переносятся обычно SpeedButton'ы (если я правильно тебя понял).

BALU

Используй компонетнты dxBars

lsk

Вопрос

Как в программе использовать функции из других библиотек (dll)? Например, kernel32.dll.

Ответ

Представим, что нам нужна функция RegisterServiceProcess, а вот код (заметь, что LoadFunction была переменной, а стала как бы функцией):

void *h;
HINSTANCE Dll = LoadLibrary("kernel32.dll");
if (Dll)
{
LoadFunction = (DType*)GetProcAddress(Dll,"RegisterServiceProcess");
if (LoadFunction)
{
LoadFunction(0,1);
FreeLibrary(Dll);
}
}


Sergey

Вопрос

Как вывести в окно содержимое .tif файла?

Ответ

Я думаю, способ один — сформировать в памяти bitmap и вывести его на экран через WinAPI-функции SetDIBitsToDevice или SetDIBits. То есть реально придется самому производить конвертацию tiff-bmp.

Вопрос

Версия языка: 6.0
Как вывести русские буквы (текст) на черном экране консоли? Вместо нужных символов в операторе COUT выводятся другие символы русского языка.

Ответ

Советую попробовать scanf или что-то подобное там было в этом роде. Короче тебе надо в досовской кодировке вывести символы. Можно вообще а FAR'e в дос-режиме что-нибудь написать, перейти в Windows-режим(F8), скопировать эту абракадабру, вставить в нужное место в cout. К примеру:

cout<<"L 0v эх чрсvы хыъэ000 эр ьюхщ ееvыъх 00юсv љ яюы00шы срыыv?";

Посмотри, что выведется :-)

Из конференции Expert_FAQ

Предлагаю перегрузить функцию cout, вставив в нее функцию CharToOem((char *)buff, (char *)buff);

******

#include "stdio.h"
#include "windows.h"
int main(int argc, char* argv[])
{
char s[]="Привет всем!";
char name[14];
CharToOem(s,s);
printf("%s\n", s);
CharToOem("Русский текст", name);
printf("%s\n",name);
return 0;
}

mr_eduard

Вопрос

Как я могу динамически изменить переключатель «Disabled» у статического текста?

Ответ

Если я правильно понял вопрос, тебе требуется изменять состояние статического текста (disabled/enabled) во время выполнения программы. Для этой цели используется функция ::EnableWindow (или CWnd::EnableWindow в MFC), которая работат как для статических элементов, так и для любых других типов окон. Единственное важное замечание: по умолчанию статическому элементу присваивается идентификатор IDC_STATIC, который равен -1. Этот идентификатор не годится для работы со статическим элементом, и его необходимо заменить на любой другой.
Допустим, ты назначил своему тексту идентификатор IDC_STATIC_TEXT. Тогда используй ::EnableWindow(::GetDlgItem(hParentWnd, IDC_STATIC_TEXT), FALSE); чтобы "задизаблить" текст и ::EnableWindow(::GetDlgItem(hParentWnd, IDC_STATIC_TEXT), TRUE); чтобы "раздизаблить" его (hParentWnd — дескриптор окна, в котором размещTн текст).
Если ты пишешь под MFC, того же эффекта можно добиться, используя в одном из методов класса окна, содержащего текст, вызовы: GetDlgItem(IDC_TXT)->EnableWindow(FALSE); GetDlgItem(IDC_TXT)->EnableWindow(TRUE); Можно также связать со статическим окном переменную типа CStatic — тогда вызов GetDlgItem не потребуется.
За дополнительной информацией можно обратиться к MSDN. См. EnableWindow, CWnd::EnableWIndow, GetDlgItem, CWnd::GetDlgItem, а также статью Q108896 из базы знаний, в которой описывается решение твоей проблемы.

Александр

Вопрос

Как используя ассемблерную вставку __asm{} на asm'е получить доступ к массиву объявленному вне этого блока (точнее надо отсортировать массив на азме из сишника)

Ответ

Ты можешь и пользовать переменные объявленные с помощью С++ , а потом передать таким образом во вставку на asm`е адрес начала массива и количество элементов массива. Если я не правильно понял твой вопрос, то опиши поподробнее каким образом ты хочешь использовать ассемблерную вставку.

Из конференции Expert_FAQ

Вопрос

Версия языка: Visual C++ 6.0
Хотелось бы узнать, как с помощью с++ можно импортировать информацию в реестр? И вообще есть ли в инете документация на эту тему (с++ & regedit)?

Ответ

Для работы с реестром существуют функции Reg…, там их много, так что приведу только необходимые.

Все эти функции лежат в Advapi32.lib, а прописаны в Winreg.h
RegCreateKey(HKEY hKey,char *Subkey,HKEY *Ret) — создает и открывает ключ(папку) в реестре.
hKey(здесь и далее) — какой либо открытый ключ(открывается

RegOpenKey(см. ниже)) или один из предопределенных ключей:
HKEY_CLASSES_ROOT
HKEY_CURRENT_CONFIG
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS

Для Windows NT/2000/XP: HKEY_PERFORMANCE_DATA
Для Windows 95/98/Me: HKEY_DYN_DATA

Subkey(здесь и далее) — имя подключа для создания, открытия, удаления.

Ret(здесь и далее) — возвращаемое значение(handler на ключ).
После использования должен быть закрыт RegCloseKey(см. ниже)
RegOpenKey(HKEY hKey,char *Subkey,HKEY *Ret)
Открывает уже существующий ключ.
RegCloseKey(HKEY hKey)
Закрывает ключ.
hKey — открытый ключ.
RegDeleteKey(HKEY hKey,char *Subkey)
Удаляет ключ.
RegSetValueEx(HKEY hKey,char *ValueName,DWORD Reserv,DWORD Type,
BYTE *Data,DWORD DataSize)

Создает и устанавливает «Значение» в ключе.
ValueName(здесь и далее) — имя значения.
Reserv — должен быть ноль.
Type — тип устанавливаемого значения:
REG_BINARY
REG_DWORD
REG_EXPAND_SZ
REG_MULTI_SZ
REG_NONE
REG_QWORD
REG_SZ

Data — то что ставим.

DataSize — размер Data'ы.
RegDeleteValue(HKEY hKey,char *ValueName)
Удаляет значение.

Пример:
Надо под ключом «HKEY_LOCAL_MACHINE\HARDWARE» создать два ключа «aaa» и «bbb», под «aaa» создать ключ «ccc», в каждом создать по значению,потом «bbb» и «ccc» удалить.

#include <
windows.h>
#include <
winreg.h>
void main(void) { HKEY K,K1,K2,K3; DWORD Val;
RegOpenKey(HKEY_LOCAL_MACHINE,"
HARDWARE"
,&K);
RegCreateKey(K,"
aaa\\ccc"
,&K3);
RegCreateKey(K,"bbb"
,&K2);
RegOpenKey(K,"aaa",&K1);
RegSetValueEx(K1,"aaaval"
,0,REG_SZ,(BYTE*)"string"
,7);
//(!) Val = 142;
RegSetValueEx(K2,"bbbval",0,REG_DWORD,(BYTE*)&Val,4);
RegSetValueEx(K3,"cccval",0,REG_BINARY,(BYTE*)&Val,4);
RegDeleteValue(K2,"bbbval");
RegDeleteValue(K3,"cccval");
RegCloseKey(K2);
RegCloseKey(K3);
RegDeleteKey(K,"bbb");
RegDeleteKey(K1,"ccc");
RegCloseKey(K1);
};


Из конференции Expert_FAQ

Вопрос

Версия языка: 6.0
Недавно поставил С++ и начал его изучать. Естественно возникают некоторые вопросы. Вот один из них:

Как можно средствами с++ сделать form'очку с таймером, что бы он при загрузке узнавала время и дату , потом в указанный срок выполняла что-нибудь?

Ответ

Таймера в с++ как обьекта в вб нет, тут используется SetTimer(…) и KillTimer(…).

Получение времени:

SYSTEMTIME stSystemTime;
GetLocalTime(&stSystemTime);

Форматирование времени:

bool FormatDateTime(LPCTSTR lpszTimeFormat,SYSTEMTIME *lpszSystemTime,LPTSTR lpszTime)
{ bool ret=0;
if (lpszTimeFormat && lpszTime && lpszSystemTime)
{ TCHAR sztm[2048];
lpszTime[0]=0;
if (GetTimeFormat(0,0,lpszSystemTime,lpszTimeFormat,sztm,2048))
{ if (GetDateFormat(0,0,lpszSystemTime,sztm,(LPTSTR)lpszTime,2048)) ret=1;
}
}
if (!ret && lpszTime) lstrcpy(lpszTime,"NA");
return ret;
}


Параметры функций есть с справке.

Из конференции Expert_FAQ

Вопрос

Не знает ли, кто где найти информацию о том, как создать интерфейс в консольном приложении. Яркий пример — FAR.

Ответ

А попробуй заняться TurboVision. Это библиотека классов для написания интерфейсов. Идет в поставке с Borland Pascal 7.0 и Borland C++ 3

D2h, Rusin Konstantin

Естественно, в Platform SDK. Раздел «Base Services», подраздел «DLLs, Processes, and Threads». В нем находишь «Character-Mode Applications». Там есть все, что нужно: ввод-вывод, экранный буфер, примеры.

Андрей Шуклин

Вопрос

Как на C++ с помощью API сделать полупрозрачное окошко?

Ответ

Вот кусок кода на С++

const long WS_EX_LAYERED=0x80000;
const long LWA_ALPHA=0x02;
HINSTANCE hLib=LoadLibrary("user32.dll");
if (hLib!=NULL)
(
long (WINAPI *pfnSetLayeredWindowAttributes)(HWND,long,long,long);
pfnSetLayeredWindowAttributes=(long(WINAPI
*)(HWND,long,long,long))GetProcAddress(hLib,"SetLayeredWindowAttributes");
if (pfnSetLayeredWindowAttributes)
{
SetWindowLong(hWnd,GWL_EXSTYLE,GetWindowLong(hWnd,GWL_EXSTYLE) | WS_EX_LAYERED);
pfnSetLayeredWindowAttributes(hWnd,0,220,LWA_ALPHA);
}
FreeLibrary(hLib);
}


220 — уровень видимости (0-255) сама функция — SetLayeredWindowAttributes

Ivan

Я так понимаю, что это только для Win2000/XP, так как только в них есть стандартные средства для управления прозрачностью окон. Для остальных Виндов процесс ОЧЕНЬ муторный.

IceMan

Вопрос

Как на VC тип Int и т.д. преобразовать в CString

Ответ

CString Str;

int k=5;

Str =itoa(k,Str.GetBuffer(10),10); //преобразование. последнее число десять говорит о том что преобразование в 10-ричной системе

// метод GetBuffer(10) выделит 10 байт под строчку

Str.ReleaseBuffer(); //Освободим неиспользуемую память.

Из конференции Expert_FAQ

По-моему легче так:

CString str="";
int i=xxx;
str.Format("%i",i);


Где первый аргумент — тип переменной (как у printf();), второй — сама переменная

nastym_n

Вопрос

Как на С++ организовать ввод из файла float-данных через потоки? Числа разделены пробелами, с мантиссой Е и без, есть отрицательные. Не в одну строку.

Ответ

Ввод вывод из файлов осуществляется с помощью потоков так простой пример:

#include <iostream.h>
//или #include <iostream> #include <fstream.h> void LireNb()
{ ifstream Entree("data.txt");
// открываем и читаем double x,y; //складываем Entree.close();
// закрываем файл
}
void LireMot()
{ ifstream Entree("bidon.txt");
// открываем и читаем char mot[80];
cout<<"----- Mot par Mot ----"<<endl;
while (Entree>>mot) cout<<mot<<endl;
Entree.close();
// закрываем файл }


Пример 2:

Следующая программа использует модифицированный метод selectionSort для сортирования массива чисел с плавающей точкой

#include<iostream> #include<fstream> using namespace std;
typedef double Type;
// Type теперь double
// объявляем функции void selectionSort(Type [],int);
void fillArray(Type [], int, ifstream &);
void main()
{ const int ARRAY_SIZE = 14;
ifstream in("input.dat");
Type myArray[ARRAY_SIZE];
fillArray( myArray, ARRAY_SIZE, in);
selectionSort(myArray, ARRAY_SIZE);
cout << "Sorted array elements are:" << endl; for ( int i = 0; i < ARRAY_SIZE; i++ )
{ cout << myArray[i] << " ";
}
}
// конец главной программы void selectionSort(Type A[], int size)
{ int pass = 0, indexOfSmallest;
while (pass < size )
{ indexOfSmallest = pass; for ( int i = pass + 1; i < size; i++ )
{ if ( A[indexOfSmallest] > A[i] ) indexOfSmallest = i;
}
// конец цикла for Type tmp = A[pass];
A[pass] = A[indexOfSmallest];
//свап A[indexOfSmallest] = tmp;
//свап pass++;
}
// конец while
}
// конец функции selectionSort
// заполняем массив из файла
//выводим элементы массива на экрам void fillArray
( Type a[], int size, ifstream &in )
{ for (int i = 0; i < size; i++) in >> a[i];
cout << "The "<< size << " array elements are:" << endl;
for (int i = 0; i < size; i++) cout << a[i] << " "; cout << endl;
}
// end function fillArray


предположим что данные таковы

33.02 7140 449.8 16.81 21.06
-21.035 1.27 .456 3. 5.0 1.3 1.2e10 6.54e-78
789.321

Программа выдаст следующее

The 14 array elements are:
33.02 7140 449.8 16.81 21.06
-21.035 1.27 0.456 3 5 1.3 1.2e+10 6.54e-78
789.321

Sorted array elements are:

-21.035 6.54e-78 0.456 1.27 1.3 3 5
16.81 21.06 33.02 449.8 789.321 7140
1.2e+10

Из конференции Expert_FAQ

Вопрос

Хочу написать bat-файл для форматирования дискет. Использовать буду под NT или 2000.

Начало готово:
format a:/u
Затем нужно проверить, что количество бэд блоков равно 0 и выдать сообщение об этом. Я полагаю, что проще всего сделать это, выяснив размер свободного пространства. Но каким оператором?Помогите это реализовать.

Ответ

@echo off echo.>temp.txt echo n>>temp.txt type temp.txt
| format a: /q /v:Label > format.log find "Доступно на диске: 1 457 664 байт"
format.log > nul if errorlevel 1 goto end echo No bad blocks!
:end del
format.log del temp.txt


Под Win98 работало.

Из конференции Expert_FAQ

Вопрос

Я пишу программу, которая должна коннектиться к серверу POP3 и скачать оттуда письма и приаттаченные файлы.
Как правильно оформить команды взаимодействия с РОР3-сервером?

Ответ

Загляни на http://www.sources.ru. Там есть описания протоколов. Есть еще TCP Logger — он включается между сервером и клиентом и сбрасывает все проходящие в обе стороны TCP пакеты в файлы, останется только их анализировать. То же самое делают программы-снифферы.

Павел

Вопрос

Подскажите, пожалуйста, как на С/С++ написать программу, выводящую на экран окно (например, с традиционной надписью «Hello, World!»).
Каким образом определить и зарегистрировать класс окна, создать и отобразить окно этого класса, а также запустить цикл обращений к системе и обрабатывать эти сообщения?

Ответ

Вот код. Он громоздкий, но несложный. Описание всех функий найдешь в MSDN. Тут я указал очень малую часть сообщений, за всем списком придется тоже лезть в документацию.
© Charlz Petsold (если правильно написал ;-)

//---------------------------------------------------
#include <windows.h>
//---------------------------------------------------
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
//---------------------------------------------------
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) {
static char szAppName[] = "HelloWin";
HWND hwnd;
MSG msg;
WNDCLASSEX wndclass;

wndclass.cbSize = sizeof(wndclass);
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;
wndclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

RegisterClassEx(&wndclass);

hwnd = CreateWindow(szAppName,
"The Hello Program",
WS_OVERLAPPED,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);

while(GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return(msg.wParam);
}
//---------------------------------------------------
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) {
HDC hdc;
PAINTSTRUCT ps;
RECT rect;

switch(iMsg) {
case WM_CREATE:
// здесь можешь вставлять код, который должен выполняться при создании окна
return(0);

case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
GetClientRect(hwnd, &rect);
DrawText(hdc, "Hello, Windows 95!", -1, &rect, DT_SINGLELINE |
DT_CENTER | DT_VCENTER);
EndPaint(hwnd, &ps);
return(0);

case WM_LBUTTONDOWN:
//код, выполняемый при клике левой кнопкой мыши
return(0);

case WM_DESTROY:
//код, выполняемый при удалении окна
PostQuitMessage(0);
return(0);
}

return(DefWindowProc(hwnd, iMsg, wParam, lParam));
}

Вопрос

У меня несколько вопросов:

Как организовать ввод с клавиатуры float-числа?

Для чего используется символ &?

Как узнать двоичную форму float-числа не прибегая к арифметическим операциям?

Ответ

1. например, так:

#include <stdio.h> #include <conio.h> void main (void){ float x; printf("Введите FLOAT-число: "); scanf("%f", &x); printf("Вы ввели число: %f\n",x); getch(); // пауза return; }

2. Функции передается указатель на переменную, которой необходимо присвоить значение введенное с клавиатуры. Дело в том, что пока выполняется функция, она помнить все созданные переменные, по завершению же все переменные освобождаются. Поэтому если мы будем иметь дело с константами, то единственная возможность вернуть результат ? это

return {что-то};

А если нам необходимо вернуть несколько переменных, например: scanf (%f,%i,%s, float_num, int_num, string_word);

То почти единственный способ ? передать указатель на имеющуюся переменную-

3. Встречный вопрос ? где и когда это требуется? Надо это реализовать в программе? Или такая необходимость возникла во время работы? А может быть такое, что лучше использовать шестнадцатеричный формат? В общем, либо вопрос некорректный, либо я под вечер чего-то уже не догоняю.

Из конференции Expert_FAQ

void Bit_mask(int number)
{
int it;
int mask = 0x80000000;
for (it=1; it != 33; it++)
{
if((number & mask) != 0) printf("1");
else printf("0");
number = number << 1;
}
return;
}


northen_wind

Вопрос

Мне нужно перевести число(типа int) из десятичной системы исчисления в ДВОИЧНУЮ, стандартных функций я не нашел кроме Setbase — которая не переводит в двоичную систему (в этой версии точно не переводит). Подскажите пожалуйста, может быть есть универсальный алгоритм (функция). Я об этом думал и возникает другой вопрос: если число перевести в двоичную систему, то какой тип данных будет относится к двоичному числу (может его записать в строку (массив char)?

Ответ

int — это и есть тип данных, в котором хранится целое двоичное число в два байта. То есть 16-и битное число.

Над ним можно делать двоичные операции операции и выводить на экран :

#include <stdio.h>
void printfbin(int c,int n) { if (n>1) { n-=1;
printfbin(c/2,n);
} printf("%d",c%2);
} void main(void) { int c;
c = 255;
// 255 = 0000 0000 1111 1111 printfbin(c,16);
printf("\n");
c = 256;
// 256 = 0000 0001 0000 0000 printfbin(c,16);
printf("\n");
c = c|255;
// 256 or 255 = 0000 0001 1111 1111 printfbin(c,16);
printf("\n");
c = c&15;
// 0000 0001 1111 1111 and 0000 0000 0000 1111 = 1111 printfbin(c,16);
}


Если же вам все-таки нужно создать особый тип данных, где можно было бы легко добраться до каждого бита, то можно создать массив и использовать аналогию prinfbin.

Из конференции Expert_FAQ

Вопрос

Как пользоваться Thread Local Storage?

Нужен небольшой рабочий пример, чтоб разобраться.

Ответ

kernel32.dll
TlsAlloc
TlsFree
TlsGetValue
TlsSetValue

действительно тривиальный пример :)

#include <windows.h> #include <stdio.h> int main(int argc, char* argv[]) { DWORD a; a=TlsAlloc();
//возвращает 0xFFFFFFFF в случае ошибки if (!(~a)) {printf("Unable to allocate TLS\n");
return 1;} printf("Tls INDEX: %0#x\n",a);
if (TlsSetValue(a,"suxx"))
{
printf("TlsValue: %s\n",TlsGetValue(a));
} else printf("Unable to set TLS value\n");
TlsFree(a);
return 0;
}


Из конференции Expert_FAQ

Вопрос

У меня такая проблема: после компиляции, программа запускается в командной строке и сразу же закрывается. Возможно это из-за настроек в WindowsXP?

Ответ

В конце функции main() напиши

getch();

а в начале добавь

#include «conio.h»

программа не завершится, пока не нажмешь какую нибудь кнопку.

Из конференции Expert_FAQ

Вопрос

Надо программно менять обои на рабочем столе. С реестром разобрался (проблем нет), но это мало, чтобы обои поменялись надо что-то типа обновить обои (как кнопка в свойствах экрана применить). Сделать говорят надо так:

"вызвать что-то вроде SystemParametersInfo
(SPI_SETDESKWALLPAPER, 0, NULL, SPIF_SENDWININICHANGE);
см. msdn по этой функции."

Но мне это ни чего не говорит:-( Может ли мне кто-нибудь кинуть эксешничек который делает команду «обновить» или можно код на С++ (есть и немного могу пользоваться Borland C++ Compiler 5.5)

Ответ

Собственно, ответ уже есть в твоем вопросе :) Надо просто вызвать указанную функцию.

Обновить рабочий стол:

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
SystemParametersInfo(SPI_SETDESKWALLPAPER,0,NULL,SPIF_SENDWININICHANGE);
return 0;
}

Или сразу поменять обои:

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
TCHAR Wallpaper[] = «путь к картинке»;
SystemParametersInfo(SPI_SETDESKWALLPAPER,0,Wallpaper,SPIF_SENDWININICHANGE)
;
return 0;

Из конференции Expert_FAQ

Вопрос

Как программно определить состав компьютера? Проц, его частота, видео, память, харддиск, сидюк…

Ответ

Для того, чтобы узнать все, что ты хочешь, нужно работать с реестром — там это все записано.
В зависимости от ОС — Win9x или WinNT/2000 — имеются свои особенности.
Для некоторых вещей можно использовать функции WinApi:
например — GetDriveType(имя_диска) — возвращает тип диска. По выбранным дискам потом можно пройтись функцией GetVolumeInformation и получить о них некоторые сведения. Посмотри файл winbase.h для общего развития и хелп по win32sdk.
А вот кусочек из моей программы, показывающий определение разрешения монитора и количества оперативной памяти.
String display = IntToStr(Screen->Width) + " x " + IntToStr(Screen->Height)+ "
pixels";
Label1->Caption = "Текущее разрешение монитора: " + display;
MEMORYSTATUS ms;
ms.dwLength = sizeof(ms);
GlobalMemoryStatus(&ms);
String memory = FormatFloat("#,###", (ms.dwTotalPhys /1024));
Label2->Caption = "Физическая память, доступная Windows: " + memory + "
KB";

shadow

Вопрос

Версия языка: 6.0

Можно ли (и как — желательно кусок кода или ссылочку) через интернет (программно) отправить SMS сообщение на любой мобильник? Или еще какие-нибудь возможности с мобильными.

Ответ

Поищи программу SmsSend. если не ошибаюсь, то zekiller.skytech.org
Есть оконный и консольный вариант. Настраивается на конкретного провайдера мобильнка по прилагаемым таблицам. С провайдером «Северо-западный GSM» работал превосходно. Знакомых на других GSM сетях нет, так что не пробовал.

А вызвать эту прогу из своей программы — нет проблемм.

Из конференции Expert_FAQ

Вопрос

Как прочитать файл по строкам, если их размер неизвестен?

Ответ

Читать строку до символов '\n' (перевод строки), '\r' (возврат каретки). Второй символ обычно для записи в файл не используют.

Влад

Вопрос

Как с помощью СИ записывать в файл, типа txt? И наоборот, получать инфу в какую-нибудь TEXTform ?

Ответ

Если с помощью Си, то с помощью структуры FILE, но тебе, видимо, и C++ версия подойдет. Используй на чтение простой iostream для чтения и ofstream для вывода. Записывать же инфу в какой-нибудь элемент управления это более специфично. Для обычного Edit'а, делай

SetDlgItemText (если в диалоге) или просто SetWindowText;

#include <fstream>
using namespace std;
char szBuf[100];
ifstream f("setup.txt");
if (!f)
{ // Ошибка открытия файла }
else
{ f.getline(szBuf, sizeof(szBuf));
SetDlgItemText(hDlg,
// Для MFC первого параметра не будет IDC_TXT, szBuf);
f.close();
} Вывод аналогично. char szBuf[100];
ofstream f("setup.txt");
GetDlgItemText(hDlg, IDC_TEXT, szBuf, sizeof(szBuf));
if (!f) {
// Ошибка открытия файла
} else
{ f <<
szBuf;
f.close();
}


Также для MFC удобно использовать сериализацию класса, но об этом прочти сам, если посчитаешь необходимым.

Из конференции Expert_FAQ

Вопрос

Как с помощью СИ спросить у виндоса сколько места свободно, а сколько Нет?

Ответ

Есть две функции:

GetDiskFreeSpace и GetDiskFreeSpaceEx

первая выдает всякие там Кластеры,Сектора, а оно надо???(ну может кому и надо:)

Поэтому:

GetDiskFreeSpaceEx(CTSTR *DirectoryName, // directory name
ULARGE_INTEGER *lpFreeBytesAvailable, // bytes available to caller
ULARGE_INTEGER *lpTotalNumberOfBytes, // bytes on disk
ULARGE_INTEGER *lpTotalNumberOfFreeBytes // free bytes on disk
)
lpDirectoryName — имя директории, или сетевой путь, где смотрится
свободное место.( конечно, место смотрится на диске, где лежит директория)
lpFreeBytesAvailable — свободное место для того, кто запрашивает(если
введены квоты в Вин2000\ХР).
lpTotalNumberOfBytes — свободное место на диске.
lpTotalNumberOfFreeBytes — все место на диске.

Пример:

#include<windows.h>
#include<stdio.h>
void main(void)
{
ULARGE_INTEGER FreeBytes,TotalBytes,FreeBytesToCaller;
GetDiskFreeSpaceEx("C:\\",&FreeBytesToCaller,&TotalBytes,&FreeBytes);
printf("%I64i\n%I64i\n%I64i\n",TotalBytes,FreeBytesToCaller,FreeBytes);
};

Из конференции Expert_FAQ

Вопрос

Как сделать полноценный интернет-браузер, используя MFC?

Ответ

В составе MFC, входящего в VC++ 6.0, есть класс CHtmlView, который представляет собой разборщик HTML, JavaScript, VBScript и всего остального. Кстати, этот компонент входит в состав MSIE. Самый быстрый способ создания браузера — при создании проекта указать DOcument/View архитектуру и в качестве View выбрать CHtmlView. Потом добавить нужные кнопки и Edit-ы.

Sergey

Вопрос

Проблема такая у появилась. Я только начал изучать С++ и никак не могу понять следующее:

Нужно считать из файла первую и последнюю строку, взять из них некоторые числа и преобразовать их в тип int. Пример содержания файла:

"Программа запущена в 12:03:58 …

---------------||------------------

Программа завершила работу в 02:10:01…"

Например: необходимо преобразовать к типу int 12 и 03(3)в первой строке, и 02(2) и 10 во второй.

Ответ

Попробуй сам написать подпрограмму.

Теория: Цифра в текстовом файле — совсем не цифра, а символ с определенным кодом, как и все.
если написать (буду СИ'шным писать):

 записать следующий символ в simbol
 printf("символ \"%с\" имеет int-код \"%d\"\n",simbol,simbol);

Таким образом ты увидишь, что цифры находятся в определенном диапазоне

(например, 32 — Ю
33 — Я
34 — 0
35 — 1
.. — ..
43 — 9)

Следовательно каждый символ можно проверять на условие:

if( simbol > 33 && simbol < 44 ){ simbol_massiv[0]=simbol; i=0; while(simbol!=":"){ считать новый символ i++; simbol_massiv[i]=simbol; } my_int=function_char_int(simbol_massiv); }

Если символ — цифра, что записать все эти символы в массив и передать в функцию преобразования символа в число (к сожалению, я не знаю как называется эта функция и есть ли такая в Вижал Си). Берешь массив, определяешь длину. Переводишь чар-массив в инт-массив. А дальше — последнее значение умножаешь на единицу, предпоследнее на десять и т.д. Затем все складываешь и «return my_int;»

Считываешь строку, пока

Из конференции Expert_FAQ

i=atoi (s);-из строки в число
s[0]=ch;s[1]=0;-представление символа в строку

Вопрос

У меня есть DLL, написанная на Си. Можно ли каким-либо образом узнать, какие там находятся функции/процедуры и какие параметры для из вызова они требуют?

Ответ

Конечно можно!!!

Для этого есть отличная прога, называется Dependency Walker. Она входит в стандартный пакет Microsoft Visual Studio 6/7, м.б. и раньше. Правда параметры функций удастся посмотреть, только если они написаны на C++.

Из конференции Expert_FAQ

Вопрос

Можно ли как-то на СИ сделать, чтоб при каждом запуске он проверял создан ли конкретный файл, если нет, то создавал, и добавлял в его конец какую нибудь строчку?

Ответ

Ты можешь открыть файл для добавления fopen( FileName,"w+");
в случае если файла не было, он создается, а если был, то открыт для записи в конец файла.

Вопрос

Какой функцией можно прочитать дату или системное время (под unix)? Читаю usr/include/sys/time.h и ничего не понимаю.

Ответ

Просто, функция localtime принимает стандартную временную метку возвращает структуру, если не ошибаюсь, tv, где уже готовые значения подробнее man localtime, man ctime

Из конференции Expert_FAQ

Koro4e source takoi
#include <time.h>
#include <iostream.h> //esli ho4es mozno <stdio.h>
void main()
{
time_t rawtime;
time (&rawtime);
cout<<ctime(&rawtime); //Esli ispolzues <stdio.h> to
//straka eta budet drugoi printf(ctime(&rawtime));
}


nonem

Вопрос

Мне нужна небольшая функция, которая, скажем, из строки «Вася Пупкин» <vasia@mail.ru> (КГБ) вытянет мыло (причем, оно не обязательно будет в угловых скобках), затем вытянет Имя отправителя (которое в кавычках, но может быть и не в кавычках).

Ответ

Есть такая функция на C++ с STL.
string from="\"Вася Пупкин\" <vasia@mail.ru>";//Разделить на email и FullName
string name=from.substr(0,from.rfind(" ")==string::npos? 0 : from.rfind(" "));
//Теперь name=="\"Вася Пупкин\""


Random

Вопрос

Есть основной поток п1, который запускает поток п2, а поток п2 может запускать много потоков п3.1, п3.2… Из п1 мне требуется узнавать, работает ли п2, и узнать количество п3.

Ответ

Из п1 вызови функцию:

BOOL GetExitCodeThread(HANDLE hThread, PDWORD pdwExitCode);
где hThread — HANDLE потока п2.

Если поток п2 активен, в переменную dwExitCode, адрес которой — второй параметр функции, будет возвращено значение STILL_ACTIVE.

Для того, чтобы определить количество п3, заведи глобальную переменную, инициализированную нулем:

LONG glThread_3_Count = 0;

В потоке п3, при его старте, вызови функцию:

LONG InterlockedExchangeAdd(PLONG plAddend, LONG lIncrement);
где plAddend — адрес твоей глобальной переменной glThread_3_Count,
lIncrement — величина приращения, в твоем случае 1.

В потоке п3, при его завершении, снова вызови функцию InterlockedExchangeAdd, но в качестве второго параметра передай -1.

Из потока п1 можно просто читать значение glThread_3_Count, это будет текущее количество активных потоков п3.

Андрей Шуклин

вход* выходные потоки с++

Вопрос

Версия языка: 6.0
Объясните что за прикол! Хочу сделать «Hello world!» на D3D! Вот что выйшло при компиляции:

Compiling…
main.cpp
c:\myprojects\project1\main.cpp(1) : fatal error C1083: Cannot open include file: 'd3d8.h': No such file or directory
Error executing cl.exe.
Project1.exe — 1 error(s), 0 warning(s)

Объясните плиз!

Ответ

Данная ошибка может возникнуть в случае, если вы используете

#include<d3d8.h> и этого файла нет в директориях описанных в "Directories — Include" в настройках компилятора.

Выходов из этой ситуации несколько:

1. Прописать в Directories — Include директорию с d3d8.h
2. использовать #include "Путь\d3d8.h"
3. скопировать d3d8.h в директорию MVS\VC\Include(вроде бы).

Из конференции Expert_FAQ

Вопрос

У меня VC++ 6.0

Сделал диалог, на нем кнопка. Изначально невидимая. После выполнения какого-то условия эта кнопка должна стать видимой,
то есть

if(что-то==что-то)
{
m_Reg.SetButtonStyle(WS_VISIBLE,TRUE);
}

Но кнопка не становится видимой. Даже без проверки (если типа она не выполнена) не видна. Помогите может знает кто, что такое? Вроде все правильно. Да, а по идее куда нужно прописывать назначение этого стиля?

Ответ

После всех изменений контрольных элементов нужно использовать метод UpdateData(Boolean bl)

Из конференции Expert_FAQ

Вопрос

Функция rand() иногда возвращает значение +NAN/-NAN, после чего некоторые мат. функции просто «загибаются». Почему это происходит и как от этого избавиться, или проверить возвращенное rand() значение до того как оно будет использовано при расчетах?

Ответ

Не знаю почему это возникает в C и как может от rand()'а вернуться нечисловой формат не понимаю, но функция с проверкой очевидна:

int nrand( void )
{
int n;
while( _isnan(n=rand()) )
;
return n;
}
// _isnan — из float.h

Из конференции Expert_FAQ

Вопрос

Прошу вас помогите, мне нужна прога (исходник) на С/С++/VisualC++ , которая сидела бы в оперативке и отслеживала, есть ли соединение с интернетом или его нет, и в зависимости от этого что либо делала.

Ответ

Программа периодически проверяет наличие модемных соединений и делает чего-то соответствующее… (С/C++)

#define WIN32_LEAD_AND_MEAN
#include <windows.h>
#include <ras.h>
#pragma comment(lib, "Rasapi32.lib")
ATOM MyRegisterClass(HINSTANCE hInstance);
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam,
LPARAM lParam); void CheckConn(void);
/////////////////////////////////////////////////////////
HWND g_hWnd;
// Сколько раз в минуту проверять наличие соединения
#define CHECK_FREQ 10 TCHAR
szWndName[] = "InetFixer"; TCHAR szWndClass[] =
"WNDFIXER";
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{ MSG msg; MyRegisterClass(hInstance);
g_hWnd = CreateWindow(szWndClass, szWndName,
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
SetTimer( g_hWnd, 2, 1000, NULL );
while(GetMessage( &msg,
NULL, 0, 0 )) { TranslateMessage(&msg);
DispatchMessage(&msg); } return msg.wParam;
} ATOM MyRegisterClass(HINSTANCE hInstance)
{ WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc; wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0; wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, NULL);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wcex.lpszClassName = szWndClass;
wcex.hIconSm = LoadIcon(hInstance, NULL);
return RegisterClassEx(&wcex); } /* * CheckConn
* Проверка наличия соединения и выполнение соответствующих * действий
*/ void CheckConn(void) { //вместо одной структуры можно использовать также указатель //на массив и тогда будет возможность оперировать с несколькими модемами //:-ну я Вам в этом случае просто завидую
RASCONN rasConn; DWORD nConn; DWORD dwSize;
rasConn.dwSize = sizeof(RASCONN);
RasEnumConnections( &rasConn, &dwSize, &nConn );
if (nConn) { //…Есть соединение // можно, например взять и отрубить его // воспользовавшись следующим кодом:
// RasHangUp(rasConn.hrasconn);
} } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_TIMER: CheckConn();
break; case WM_DESTROY:
PostQuitMessage(0); break; default:
return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }


Из конференции Expert_FAQ

Вопрос

Я уже имею небольшой опыт в программировании на Делфи, хочу изучить C. Но чего то запутался С++, С, С++ Builder, Visual C++, с чего начать? Какой лучше компилятор использовать, и доку(Чем больше тем лучше)!

Ответ

Сразу разберемся с терминологией.

C — просто Си.
C++ — это навороченный Си(включены ООП, Оверлоды и прочие накруты)
Visual C++ — это С++ с графической оболочкой.
Каждая последующая версия включает в себя предыдущую.

Начать, вообще-то, лучше сначала, т.е. с QC (Quick C от МелкоСофта), Но это может показаться очень скучным, т.к. он под Дос, да и достать его неск. проблематично (хотя в Инете-то…).

Можно, конечно, сразу на Visual C++.NET(7.0), но поначалу это будет неск. сложновато.
В принципе C (без плюсов) можно учиться и в Visual C++, если забыть про все эти дополнения.

Так что, если не хочется искать этот QC то смело ставьте Visual C++ и учитесь на нем.
Сразу замечу, что определится с фирмой лучше всего сразу,т.к. одинаковые продукты этих двух немного отличаются друг от друга, и переход с одного на другой чреваты некоторыми неудобствами.

Насчет доков.

По продукции фирмы МикроСофт:
В любом С и С++(кроме Visual) есть неплохая встроенная хелпа.
С каждой версией Visual C++ поставляется довольно неплохая внешняя хелпа (MSDN), конечно если не скупится и взять Visual C++ не на одном диске, а на 5-и.(Visual Studio)(В противном случае никакой гарантии). Эта же хелпа лежит по адресу http://msdn.microsoft.com только она онлайновая и выкачать не получится.

Из конференции Expert_FAQ

Считаю, что лучше начать с С++ Builder — создателя сего языка. А доки можно нарыть на сайте «ПЕРВЫЕ ШАГИ» www.firststeps.ru

andy_beer

Для изучения C нет ничего лучше книги Б.Кернигана и Д.Ритчи «Язык программирования C» (второе издание), K&R сокращенно [в сети полно переводов этой книги, но обязательно выбирайте второе издание — там описана стандартизованная ANSI-версия], еще лучше купить русский перевод в магазине, это не проблема… в дополнение к K&R советую прочитать «Практика программирования» того же Б.Кернигана и Р.Пайка, в ней доходчиво объясняется как-же все-таки на C писать программы :-) (переведена на русский, есть в магазинах)

"Чистых» C-компиляторов вроде бы немного — это GCC (ставьте Linux или *BSD в которые компилятор встроен) для Windows есть очень неплохой, почти free-варный компилятор LCC-Win32, взять его можно на www.cs.virginia.edu

web2000

Вопрос

Что такое с, с++, visual c++, borland c++ builder и какие там есть еще (если есть)?

Ответ

С — это язык программирования высокого уровня, созданный с целью заменить ассемблер (язык программирования, очень близкий к машинному коду). Это структурный язык — т.е. основой языка является подпрограмма — «функция». Принцип программирования заключается в том (упрощенно), что проектируется взаимодействие функций друг с другом. Это позволяет отвлечься от проектирования алгоритмов каждой отдельной подпрограммы и сконцентрироваться на взаимодействии продпрограмм между собой, а код отдельно взятой функции может быть и изменен без существенных изменений основной программы, которая эту функцию использует.

В 1983 г. появился язык С++. Название происходит от синтаксиса оператора инкремента в С — "++" (например: i = i + 1; <=> i++;). С++ — это объектно ориентированный язык, созданный на базе языка С. Главное его отличие от С — изменение философии программирования и проектирования. Объектно ориентированный подход основан на том, что структурной единицей программы являются не отдельные функции, а объекты (классы). Объект имеет свои данные, а также функции-члены (методы) для работы с ними. Фактически при использовании объектов основная программа лишь «говорит» объекту что ему нужно изменить каким-либо образом свое состояние, а вот каким именно образом он это делает (внутренний алгоритм) не имеет значения для основной программы.

Далее о разновидностях программ-компиляторов.
В настоящий момент наиболее распространены Microsoft Visual C++ 6.0, Borland C++ 5.0 и Borland C++ Builder (для MS Windows). Из ранних версий (для ОС DOS) — Borland C++ 3.

Borland C++ Builder — это визуальный язык программирования, который очень похож на Borland Delphi, разве что язык в нем С, а не Pascal. Он хорош для разработки программ, когда у Вас нет времени на создание дизайна (внешнего вида) программы. Проблема лишь в том, что эта легкость достигается за счет увеличения размера запускаемого файла. Microsoft Visual C++ может быть использован для создания системных программ, т.к. он не включает в себя огромное количество библиотек и, соответственно, работает быстрее.

Алексей



Copyright © 2000-2004 Сообщество Чайников
Контактная информация