PDA

Просмотр полной версии : [c/c++] Новичкам: задаем вопросы


Страницы : 1 2 3 4 5 6 7 8 9 10 11 12 [13] 14 15 16 17 18 19 20 21 22

Vados
20.05.2009, 10:17
Как сделать запрет ввода букв в TextBox в Visual Studio 2008 C++

razb
20.05.2009, 14:00
Как сделать запрет ввода букв в TextBox в Visual Studio 2008 C++
поищи свойство ReadOnly или что то похожее)

awdrg
23.05.2009, 19:33
[deleted]

Mosvit
23.05.2009, 19:43
Помогите решить вот такую задачу на языке C

Написать подпрограмму сортировки 2-мерного массива указателей на функции, которые выдают целые значения, ПО СТРОКАМ (использовать сумму значений строки).

Буду очень благодарен! Нужно срочно сдать, но я даже в задание не врубаюсь :(((

razb
23.05.2009, 20:19
Нашел пример работы с сокетами. Решил переделать его для запроса содержимого web страницы. Научился отправлять get запрос и читать ответ. Но появилась проблема: при чтении ответа с крупных сайтов я недополучаю часть кода страницы. В чем может быть проблема? И можо ли как то сократить код?
while(recv( sock, buff, 1024, 0 ));
srcpy(out,buff);
return out;
у тебя в out копируется принятые данные только один раз, убери точку с запятой после while.
Вот например:
while(recv( sock, buff, 1024, 0 )) strncat(out,buff, 1024);
return out;

awdrg
23.05.2009, 20:30
упс, это опечатка, в любом случае самого кода больше чем размер буффера выходит.

Mosvit
24.05.2009, 09:06
Помогите решить вот такую задачу на языке C

Написать подпрограмму сортировки 2-мерного массива указателей на функции, которые выдают целые значения, ПО СТРОКАМ (использовать сумму значений строки).

Буду очень благодарен! Нужно срочно сдать, но я даже в задание не врубаюсь :(((
Плачу 100 рублей за решение, нужно срочно!!!

ysmat
24.05.2009, 16:37
не работает цикл поиска
задача найти в файле 1.bin байт E9
там он точно есть
однако цикл почему то работает безконечно
то есть прога просто виснет и все


#include <iostream>
#include <fstream>
using namespace std;

char buffer = 0;
int counter = 0;
int bufer0 = 0;
int bufer1 = 0;
int adres = 0;
const char filename1[] = "1.bin" //имена файлов
const char filename2[] = "2.bin";


int main(void)
{
fstream file1(filename1,ios::in); //открываем файлы
fstream file2(filename2,ios::out);
file1.seekg(adres,ios::beg); //начальная установка адреса чтения (0) чтение с начала файла
file2.seekp(adres,ios::beg); //начальная установка адреса записи (0) запись с начала файла


while(bufer0 != 233) // цикл поиска байта 0xE9
{
file1.seekg(adres); // устанавливаем адрес
file1.read(&buffer,1); // считываем содержимое по адресу в буфер
bufer0 = buffer;
adres ++; // inc adres
} // зацикленно

//закрыть файлы
file1.close();
file2.close();
return 0;
}

Ra$cal
24.05.2009, 16:48
ysmat
char buffer = 0; - знаковое целое. максимальное значение +127. а ты проверяешь с числов 233. естественно никогда не выполнится условие. когда компилируешь - внимательно смотри в окно результата. там тебя компилятор наверняка предупредил о сравнении беззнакового числа со знаковым. ну или на худой конец учись дебажить. эту ошибку обнаружить очень просто - ставишь в начале файла свой байт и дебажишь первую же итерацию.

зы: объявляй переменную unsigned char;

awdrg
24.05.2009, 21:51
Столкнулся еще с такой проблемой на С++: есть массив из текста, например

dfdffghfgh<b>jisjgdfgidj</b>vjiuhgufdhg<b>sgdfg</b>jiosjfdds<b>oijsidjfisd</b>

нужно как то отсортировать и вывести текст между тегами. Есть ли в с++ аналог функции preg_match_all для этих целей? Пробовал методом грубого перебора, но он занимает длительное время =/

Ra$cal
24.05.2009, 22:05
есть такое штуко (http://www.boost.org/doc/libs/1_39_0/libs/regex/doc/html/index.html)

Mosvit
25.05.2009, 21:32
Привет!
Нужна помощь с этой программой на "C":

Написать подпрограмму, реализующую динамический строку в виде структуры: struct array {char * string; /* ссылка на строку */ int size; /* размер строки */ }. Реализовать функции создания, удаления, конкатенации строк, а также обеспечить выборку подстрок и символов в указанной строке.

VIP
26.05.2009, 10:49
Возник такой вопрос. В Visual Studio 2008 не рабоотает fseek (in, 0, 2). (на Си) То есть он как бы всё принимает и компилит, но в процессе выполнения вылетает ошибка stream!=NULL То есть как я понимаю он не может найти конец открываемого файла (в проге он открывает текстовый файлик). Самое главное, что в gcc всё в этом месте работало отлично... :confused:

Ra$cal
26.05.2009, 16:11
VIP
это не ошибка. это ассерт. проверь значение параметра in, реальный ли это файл. есть подозрение, что in = NULL...

Balvan
27.05.2009, 18:10
будьте добры, дайте ссылочку на справочник по API в Windows Mobile!

fker
28.05.2009, 10:30
Подскажите мoжно ли в Визул студии как-то при компиляции и запуске прописать *ARGV[], например мне надо отладить "asdf.exe data.txt" ?

slesh
28.05.2009, 10:47
Проект -> Свойства: xxx -> Свойства конфигурации -> Отладка -> Командные аргументы

unfii
30.05.2009, 18:00
В неком файле file.txt имееться данные следующего типа:
Babyrka 12 300
Pupkin 13 200, где Babyrka-фамилия охотника, 12-количество убитых животных, 300-вес убитых охотником животных
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
char prizvishe[256];
int vpol;
int vaga;
} address;
void main ()
{
struct oxota
{
char prizvishe[256];
int vpol;
int vaga;};
struct oxota oxota1;
FILE*f;
f=fopen("file.txt","w");
fscanf(f,"%s %i %i",oxota1.prizvishe,&oxota1.vpol,&oxota1.vaga);
printf("\n Danue tablicu");
printf("\n ___________________________________________");
printf("\n Familiya oxotinka %c",oxota1.prizvishe);
printf("\n Kilkistb vpolovanux tvarun %i",oxota1.vpol);
printf("\n Zagalna vaga vsix tvarun %i",oxota1.vaga);
fclose(f);
}

Как осуществить вывод данных с file.txt?

csrss
30.05.2009, 18:25
#include <stdio.h>
#define FILE_NAME "a.txt"

struct params{
char aaa[100];
char bbb[100];
char ccc[100];
};

int main(){
struct params data[100];
char line[200];
int v = 0;

FILE *fp = fopen(FILE_NAME, "r");
while ( fgets ( line, sizeof line, fp ) != NULL ){
sscanf(line, "%s %d %d", &data[v].aaa, &data[v].bbb, &data[v].ccc);
printf("%s", line);
v++;
}
printf("\n");
}

Можно так. Там уж поправь как тебе надо.

unfii
30.05.2009, 18:50
Function should return a value :(
#include <stdio.h>
#define FILE_NAME "file.txt"
struct oxota
{
char prizvishe[256];
int vpol;
int vaga;};

int main ()
{
struct oxota data[200];
char line[200];
int v=0;
FILE*fp=fopen(FILE_NAME, "r");
while (fgets(line, sizeof line, fp)!=NULL)
{
sscanf(line, "%s %i %i", &data[v].prizvishe, &data[v].vpol, &data[v].vaga);
printf("%s", line);
v++;
}
printf("\n");
}

csrss
30.05.2009, 19:03
2 unfii

добавь в конце main:

return 0;

в Visual studio вижу компилиш...

Fata1ex
30.05.2009, 19:04
unfii, исправь "int main()" на "void main()" или допиши перед последней фигурной скобкой "return 0;"

unfii
30.05.2009, 19:22
http://xmages.net/out.php/t246033_error.png (http://xmages.net/show.php/246033_error.png.html)
не хочет приложение терь стартовать :(

unfii
30.05.2009, 19:35
ХАХАХАХАХАХАХА
косяк

2 unfii
установи лучше Dev C++
самый корректный компилятор
Скачать (http://www.brothersoft.com/dev-c++-download-65296.html) всего 9МБайт
и прийдеться ставить во всех класах информатики?:)

Fata1ex
30.05.2009, 19:42
>Dev C++ - самый корректный компилятор

Dev-c++ это среда разработки, использующая компилятор mingw

PS
"sizeof line" -------> "sizeof(line)"

Ra$cal
30.05.2009, 19:45
ты переполнил массив, объявленный локально. у тебя всего 3 их.
char prizvishe[256];
struct oxota data[200];
char line[200];

вот и отлаживай ищи, куда ты сунул больше, чем выделил памяти.

unfii
30.05.2009, 19:52
о вроде стартонуло, только ничего не показывает, пусто :(

Ra$cal
30.05.2009, 20:05
создай отдельный топик чтоли, а то ща получим тут чатик...

Дикс
31.05.2009, 15:27
что нужно куда заинклудить, чтобы в чистом С++ получить текущее время, дату?

Kaimi
31.05.2009, 15:35
#include <stdio.h>
#include <dos.h>

int main(void)
{
struct time t;

gettime(&t);
printf("The current time is: %2d:%02d:%02d.%02d\n",
t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund);
return 0;
}

Дикс
31.05.2009, 15:49
спасибо
а если я пишу на С++ - я тоже должен использовать dos.h? это современный и актуальный метод?

Fata1ex
31.05.2009, 16:12
>а если я пишу на С++ - я тоже должен использовать dos.h?
Да

Ra$cal
31.05.2009, 16:19
вообще в с++ правильнее юзать http://www.cplusplus.com/reference/clibrary/ctime/

Spy2ex
01.06.2009, 00:41
У меня проблема хочу авторизоваться на сайте вконтакте средствами С++.
Отловив я все запросы что посылает мой браузер, и посылая их же в коде, в ответе получаю "400 bad reqest".
Вот код.


#include <stdio.h>
#include <string.h>
#include <winsock2.h>
#include <windows.h>
#include <ctype.h>

#define PORT 80
#define SERVERADDR "93.186.225.212" // Адрес сервера

#pragma comment(lib, "Ws2_32.lib") //либа

int main ( int argc, char* argv [ ] )
{
WSADATA wd;
char buff[100000];
char buff2[100000]=
{
"POST /login.php HTTP/1.1"
"Host: vkontakte.ru"
"User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9) Gecko/2008051206 Firefox/3.0 (.NET CLR 3.5.30729)"
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
"Accept-Language: ru,en-us;q=0.7,en;q=0.3"
"Accept-Encoding: gzip,deflate"
"Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7"
"Keep-Alive: 300"
"Connection: keep-alive"
"Content-Type: application/x-www-form-urlencoded; charset=UTF-8"
"X-Requested-With: XMLHttpRequest"
"Referer: http://vkontakte.ru/index.php"
"Content-Length: 71"
"Cookie: remixchk=5; remixautobookmark=2; remixlang=0"
"Pragma: no-cache"
"Cache-Control: no-cache"
"op=a_login_attempt&email=e-mail&pass=pass&expire=0"




};
printf ( "TCP Client \n" ); // ну, тут и так понятно

if ( WSAStartup ( 0x202, &wd ) )
{
printf ( " WSAStart error %d \n ", WSAGetLastError ( ) );
return -1;
}

SOCKET sock ;
sock=socket ( AF_INET, SOCK_STREAM, 0 );
if ( sock < 0 )
{
printf (" Socket ( ) error %d \n ", WSAGetLastError ( ) );
return -1;
}

sockaddr_in dest_addr;
dest_addr.sin_family=AF_INET; //инет коннектинг
dest_addr.sin_port=htons ( PORT ); //порт
HOSTENT *hst; // хост

if( inet_addr(SERVERADDR) != INADDR_NONE )
dest_addr.sin_addr.S_un.S_addr = inet_addr(SERVERADDR);
else if( hst=gethostbyname ( SERVERADDR ) )
( ( unsigned long * ) &dest_addr.sin_addr )[0]=((unsigned long** )hst->h_addr_list)[0][0];
else
{
printf( "invalid address %s \n", SERVERADDR );
closesocket( sock ) ;
WSACleanup();
return -1;
}

if(connect( sock, (sockaddr *)&dest_addr, sizeof(dest_addr) ))
{
printf (" Connect error %d \n ", WSAGetLastError ( ) );
return -1;
}

send( sock, buff2, sizeof(buff2), 0);
recv( sock, buff, sizeof(buff)-1, 0 );
printf("%s",buff );
printf("\n");
printf ("Connection with %s succesfully. quit - quit" , SERVERADDR );

return 0;
}

Kaimi
01.06.2009, 00:42
Отловив я все запросы что посылает мой браузер, и посылая их же в коде, в ответе получаю "400 bad reqest".

Видимо дело в отсутствии переносов строк в запросе

Ra$cal
01.06.2009, 01:43
Помогите с этим (http://forum.antichat.ru/showpost.php?p=1300808&postcount=3022) постом
ну зависит от деталей реадизации. если нада быстрый поиск, то все строки предварительно считываются, и составляется массив ключей вида struct Record {string name; unsigned long offset; unsigned int length;};
в массиве есесно отсортировано по смещению строки. дальше в массиве находишь нужное имя, берешь смещение и длину. вычисляешь размер части файла, которая лежит за этим куском кодом типа tail_length = file_size - (record.offset + record.length);
ну и переписываешь этот хвостик по смещению, на котором находилась старая запись. в конце устанавливаешь размер файла как file_size - record.length;
усе. если массив таких структур нельзя заводить, то соотв всю инфу нужно каждый раз получать из файла. т.е. считывать строки, искать нужный ключ, итп. лень кодить, ибо стока раз уже эту фигню делал студентам, что тошнит от нее

Ra$cal
01.06.2009, 01:47
экранировать не нада. прально грят про перерды строк. а мне пора пожалуй спаьт =\

razb
01.06.2009, 01:56
Отловив я все запросы что посылает мой браузер, и посылая их же в коде, в ответе получаю "400 bad reqest".
Видимо дело в отсутствии переносов строк в запросе
Естественно. В конце каждого поля запроса у тебя не хватает \r\n

Дикс
01.06.2009, 09:47
а где можно взять Ws2_32.lib, чтобы потестить прогу Spy2ex'a?

Spy2ex
01.06.2009, 10:18
а где можно взять Ws2_32.lib, чтобы потестить прогу Spy2ex'a?

В Visual Studio 8 установи и просто подключи.

mr.The
01.06.2009, 15:02
Переход из https://forum.antichat.ru/showpost.php?p=1302836&postcount=234

Гугл подсказал, что для динамической линковки нужно указать параметр -dynamic либо -rdynamic.
Размер не изменился, а rdynamic линкер вообще не узнал:
mingw32-g++.exe: unrecognized option `-rdynamic'

razb
01.06.2009, 15:07
Для динамической линковки нужны .dll либы, которых видимо нету поэтому компилятор автоматически собирает статически

Дикс
01.06.2009, 15:19
есть класс с несколькими свойствами типа
int date;
int minute;
и тп

необходимо реализовать методы для инкремента/декремента этих свойств.

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

DateTime obj;
obj.date++;
obj.minute--;

так вообще можно сделать? или надо писать стопку методов, типа void hourInc(); void hourDec(); ...

Fata1ex
01.06.2009, 15:24
DateTime obj;
obj.date++;
obj.minute--;

Если сделать поля public, то такой способ будет возможен

razb
01.06.2009, 15:31
так вообще можно сделать? или надо писать стопку методов, типа void hourInc(); void hourDec(); ...
Можно реализовать два метода, один на инкримент и один на декримент, и передавать в них типа флага который показывал бы над чем надо сделать inc/dec, например:
void DataTime::IncDate(int& field)
{
switch(field)
{
case 0: date++; break;
case 1: minute++; break;
...
}
}
Для большего удобства имена полей можно задефайнить:
#define FIELD_DATE 0
#define FIELD_MIN 1
и т.д. И тогда вызывать obj.IncDate(FIELD_DATE);
А вообще дело вкуса, можешь и пачку методов написать на каждый атрибут класса)

Дикс
01.06.2009, 15:59
DateTime obj;
obj.date++;
obj.minute--;

Если сделать поля public, то такой способ будет возможен

как?? это я и хочу узнать

Fata1ex
01.06.2009, 16:01
class m {
public :
int a;
int b;
m() {a = 1; b = 1;}
};



int main () {

m ob;

ob.a++;
ob.b++;

cout << ob.a << " " << ob.b << endl;


return 0;
}

Вообще это небезопасно

razb
01.06.2009, 16:05
Вообще это небезопасно
Именно. Все атрибуты лучше хранить как protected или private, а доступ к ним предоставлять через соответствующие методы, тк открытость нарушает модель инкапсуляции и обьекты классов по большому счету ничем не отличаются от структур.

Lee_fx
01.06.2009, 17:02
Помогите разобраться:
char * ptr = new char[10];
cin >> ptr; //вводим abcdefghijklmn - 14 символов
cout << ptr; //выводит abcdefghijklmn
Собственно почему? Ведь размер ptr 10 байт, а выводится 15?
Как вводить данные чтобы избежать этого переполнения?

razb
01.06.2009, 17:11
Как вводить данные чтобы избежать этого переполнения?
cin.read(char *buffer, int n)

Дикс
01.06.2009, 20:03
Вообще это небезопасно

Именно. Все атрибуты лучше хранить как protected или private, а доступ к ним предоставлять через соответствующие методы, тк открытость нарушает модель инкапсуляции и обьекты классов по большому счету ничем не отличаются от структур.

в том то и дело что у меня private :)

Ra$cal
01.06.2009, 20:28
ну перегрузи оператор инкремента. правда это актуально если инкремент логически относится ко всем полям класса. вообще для того и прячут поля, чтобы обращаца к ним через геттеры и сеттеры, так что не изобретай велосипед и делай как все =) может когда нить проперти впаяют в с++, тогда можно будет прозрачно вызывать гетеры и сетеры обращаясь к полям по имени. но имхо это скорее запутает, ибо тогда становится не понятно, когда переменная скрыта, а когда нет.

Spy2ex
04.06.2009, 11:04
Хочу средствами С++ авторизоватся на мейл.ру, отловить я все заголовки что отправляет мой браузер я составил запрос..
В ответе на него получаю "302 ok"
Ну там маленькая загвоздка, нету строки "location"
Пересмотрел я в браузере что отправил мне сервер,
строку "location" я нашол.
Ну вот не пойму почему когда я запускаю код я ее не получаю? Может куки не получил, и как вообще получать куки с сайтов ?
Пмоготи пожалуйста.

Что отправил мне сервер, когда я захожу через браузер:

Set-Cookie: t=obLAABAAABAAAAAAAAAAAZAAYMxAcA; expires=Mon, 30 Nov 2009 20:32:18 GMT; path=/; domain=.mail.ru
Set-Cookie: Mpop=1244061138:77524f5950525b41185c515f541c404d:l ogin@mail.ru:; expires=Tue, 01 Sep 2009 20:32:18 GMT; path=/; domain=.mail.ru
Location: http://win.mail.ru/cgi-bin/checkcookie?id=775b4760627d7e7019050210041850575d4 a54495a524f5950525b41185c515f541c404d



Код моего клиента:

#include <stdio.h>
#include <string.h>
#include <winsock2.h>
#include <windows.h>
#include <ctype.h>


#define PORT 80
#define SERVERADDR "194.67.57.126" // Адрес сервера

#pragma comment(lib, "Ws2_32.lib") //либа

int main ( int argc, char* argv [ ] )
{
WSADATA wd;
char buff[100000];
char buff2[100000]=
{


"POST /cgi-bin/auth HTTP/1.1\r\n"
"Host: win.mail.ru\r\n"
"User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9) Gecko/2008051206 Firefox/3.0 (.NET CLR 3.5.30729)\r\n"
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n
"Accept-Language: ru,en-us;q=0.7,en;q=0.3\r\n"
"Accept-Encoding: gzip,deflate\r\n"
"Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7\r\n"
"Keep-Alive: 300\r\n"
"Connection: keep-alive\r\n"
"Referer: http://win.mail.ru/cgi-bin/login\r\n"
"Cookie: Mpop=1244052980:04707c6077015d01190502190a1d000004 1850575d4a54495a524f5950525b41185c515f541c404d:aov @mail.ru:; t=obLD1AAAAAAIAAAABAAAAAAAAAAAZAAYMxAcA; mrcu=ED294A236BAD221A30F778B8D75F; c8=TNYmSgAAAAKA3gIAAAAAApAJBAAAAAACgN0CAAAAAAK5dgE AAAAAAsVGAAAAKA1wEAAAAAApF6AQAAAAACYCIBAAAAAAH5UgE AAAAA; c0=P+oHTAAAAAJZdAwAAAAA; p=i9mYAJpP+QAA; VID=1TUY9324cAme\r\n"
"Content-Type: application/x-www-form-urlencoded\r\n"
"Content-Length: 79\r\n\r\n"
"page=&post=&login_from=&Login=login&Domain=mail.ru&Password=pass"
};
printf ( "TCP Client \n" ); // ну, тут и так понятно

if ( WSAStartup ( 0x202, &wd ) )
{
printf ( " WSAStart error %d \n ", WSAGetLastError ( ) );
return -1;
}

SOCKET sock ;
sock=socket ( AF_INET, SOCK_STREAM, 0 );
if ( sock < 0 )
{
printf (" Socket ( ) error %d \n ", WSAGetLastError ( ) );
return -1;
}

sockaddr_in dest_addr;
dest_addr.sin_family=AF_INET; //инет коннектинг
dest_addr.sin_port=htons ( PORT ); //порт
HOSTENT *hst; // хост

if( inet_addr(SERVERADDR) != INADDR_NONE )
dest_addr.sin_addr.S_un.S_addr = inet_addr(SERVERADDR);
else if( hst=gethostbyname ( SERVERADDR ) )
( ( unsigned long * ) &dest_addr.sin_addr )[0]=((unsigned long** )hst->h_addr_list)[0][0];
else
{
printf( "invalid address %s \n", SERVERADDR );
closesocket( sock ) ;
WSACleanup();
return -1;
}

if(connect( sock, (sockaddr *)&dest_addr, sizeof(dest_addr) ))
{
printf (" Connect error %d \n ", WSAGetLastError ( ) );
return -1;
}

send( sock, buff2, sizeof(buff2), 0);
recv( sock, buff, sizeof(buff)-1, 0 );

printf("%s",buff);
printf ("Connection with %s succesfully. quit - quit" , SERVERADDR );
return 0;


}

Дикс
04.06.2009, 14:02
как юзать статическую переменную класса?

class DateTime
{
static int count;
// static int count = 0; // incorrect
}

DateTime::DateTime():
count(0) // incorrect
{
DateTime::count = 0; // incorrect
count = 0; // incorrect
}

....

DateTime obj;
obj::count // incorrect
DateTime::count // incorrect

как её вообще задать и обращаться к ней внутри класса и снаружи?

Chaak
04.06.2009, 14:18
А цель статической переменной, чтобы после создания удалилась? Объявляй снаружи тогда уж..

Дикс
04.06.2009, 15:04
нет, мне нужно посчитать в конструкторе сколько раз был создан класс
переменную тока инкрементировать и выводить

Fata1ex
04.06.2009, 15:08
class some {
static int s;
};

int some::s = 123;


>мне нужно посчитать в конструкторе сколько раз был создан класс

Жесть.

Ra$cal
04.06.2009, 15:09
как юзать статическую переменную класса?

как её вообще задать и обращаться к ней внутри класса и снаружи?

Объявляешь в хидере напимер так

#pragma once
#include <vector>

class Worker
{
public:
Worker(void);
~Worker(void);

static std::vector<Worker*> workers;
};

Дальше в cpp файле того же класса

std::vector<Worker*> Worker::workers;

Обращаца к статик переменной можно только из статик методов класса. Не, пезжу =) Статик метод не может обращаца к нестатичтным методам. Из нестатик методов же обращение к статик можно. Если обращение извне класса, то юзаешь указание области видимости, например так

Worker::workers.push_back(new Worker);

G0lovorez 2033
04.06.2009, 18:10
скажите код bb кода для сайта пожалуйста

Fata1ex
04.06.2009, 18:14
bb коды (http://www.google.ru/search?hl=ru&q=bb+%D0%BA%D0%BE%D0%B4%D1%8B&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA+%D0%B2+Google&lr=&aq=f&oq=)

G0lovorez 2033
04.06.2009, 18:20
и еще подскажите пожалуйста как в подписе можно разместить код с кнопкой на сайт и чтобы кнопка работала а не просто анимашка была

Fata1ex
04.06.2009, 18:24
[c/c++] Новичкам: задаем вопросы

Ты не ошибся?

Почитай статью hidden'а, там что-то было про подпись. Попробуй картинку сделать гиперссылкой.

G0lovorez 2033
04.06.2009, 18:45
Fata1ex а как?

Fata1ex
04.06.2009, 18:52
Ксакеп :) (http://forum.xakep.ru/m_895439/tm.htm)

Lee_fx
04.06.2009, 21:33
Где можно просмотреть vtable(vftable)? VS2008
Нужно посмотреть сколько функций будет в них.

Ra$cal
05.06.2009, 01:03
Где можно просмотреть vtable(vftable)? VS2008
Нужно посмотреть сколько функций будет в них.
Компилятору не доверяешь? копай в сторону this. втбала явно не далеко от него. ну или прочитай про основы com. там дается бинарное описание положения таблицы, совпадающее с выходным бинарем мсовских компилей.

в моей 2003 студии например вот таблица как находится
- this 0x0012fec4 {x=0 } Worker * const
- __vfptr 0x00427340 const Worker::`vftable' *
[0] 0x00401230 Worker::foo(void) *
[1] 0x00406240 Worker::bar(void) *

Chrek625
06.06.2009, 03:06
Доброго времени суток.
такая ситуация: есть дириктория с большим количеством файлов с буквально рандомными именами.
Вопрос есть ли в С++ какая то функция позволяющая внести все эти имена в указанной директорие внести в масив?


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

Kaimi
06.06.2009, 11:55
Вопрос есть ли в С++ какая то функция позволяющая внести все эти имена в указанной директорие внести в масив?


#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>

void scandir(char *dirname)
{
DIR *dir;
struct dirent *ent;

printf("Directory '%s':\n",dirname);
if ((dir = opendir(dirname)) == NULL)
{
perror("Unable to open directory");
exit(1);
}
while ((ent = readdir(dir)) != NULL)
printf("%s\n",ent->d_name);
}

void main()
{
scandir(".");
exit(0);
}

xxxxxxxxxxxxxxx
06.06.2009, 17:18
Доброго времени суток.
такая ситуация: есть дириктория с большим количеством файлов с буквально рандомными именами.
Вопрос есть ли в С++ какая то функция позволяющая внести все эти имена в указанной директорие внести в масив?


#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <dirent.h>
#include <sys/stat.h>
#include <stdio.h>
#include <sys/types.h>

char *curdir;

int filter(const struct dirent *s)
{
char fullname[300];
struct stat st;

if(s->d_name[0]!='.'){
return 1;
}
return 0;
}

int main(int argc, char **argv){

struct dirent **e;
struct stat s;
struct tm *tmfile;
int i,dirsize,k;
char *empty[]={0,".",0};
char **list=argv;
char fullname[300];

if(argc==1)
list=empty,argc=2;

for (i = 1; i < argc; i++){
if(argc!=2)

curdir=list[i];
dirsize=scandir(list[i],&e,filter, 0);

if (dirsize<0){
printf("scandir fails at %s: %s\n",list[i],strerror(errno));
continue;
}

for(k=0;k<dirsize;k++){
sprintf(fullname,"%s/%s",list[i],e[k]->d_name);
if(stat(fullname, &s)==-1)
printf("stat fails at %s: %s\n",fullname,strerror(errno));
else{

printf ("%s ", e[k]->d_name);

}
}
}
}

Mosvit
06.06.2009, 18:27
Помогите решить такую задачу на языке Си:

Реал изовать базу данн ых “служащие” в виде файла, содержащего имя, фамилию и отчество служащего, а также его рейтинг. Уметь: 1) вводить данные; 2)удалять данные; 3)изменять данные; 4) сортировать данные по любому столбцу; 5) выводить данные на экран.

В Паскале можно было бы с помощью записей сделать, а тут не знаю как...

razb
06.06.2009, 18:45
В Паскале можно было бы с помощью записей сделать, а тут не знаю как...
А тут с помощью структур)

Fata1ex
06.06.2009, 19:06
class Empl {
private :
string Name;
string LName;
int Rate;
public :
Empl();
Empl(string inName, string inLName, int Rate);

void setName(string inName);
void setLName(string inLName);
void setRate(int inRate);
string getName();
string getLName();
int getRate();

#void del();
#void display();
};

Empl::Empl() {
Name='';
LName='';
Rate=-1;
}

Empl::Empl(string inName, string inLName, int Rate) {
Name = inName;
LName = inLName;
Rate = inRate;
}

# Далее определишь все остальное, мне лень ;(



#database

const int MaxEmpl = 100;
const int FirstEmplNum = 1;

class database {
private :
Empl iEmpl[MaxEmpl];
int NextSlot;
int NextEmplNum;

public :
database();

Empl& addEmpl(string inName, string inLName, int inRate);
Empl& getEmpl(int inEmplNum);
Empl& getEmpl(string inName, string inLName);

void display();
...
# все варианты вывода данных
};

database::database() {
NextSlot = 0;
NextEmplNum = FirstEmplNum;
}

Empl& database::addEmpl(string inName, string inLName) {
if (NextSlot >= MaxEmpl) {
cerr << " No more places here ;(" << endl;
throw exception();
}

Empl& tEmpl = iEmpl[NextSlot++];
tEmpl.setName(inName);
tEmpl.setLName(inLName);
tEmpl.setRate(inRate);

return tEmpl;
}

Empl& database getEmpl(int inEmplNum) {
for (iny i = 0; i < NextSlot; i++) {
if (iEmpl[i].getEmplNum() == inEmplNum) {
return iEmpl[i];
}
}
cerr << "There is no person with number " << inEmplNum << endl;
throw exception();
}

# Мне надо бежать, дальше думаю понятно

Вот набросал что-то. Сейчас нужно уходить, поэтому не закончил. Посмотри, думаю принцип понятен.

Glazz
07.06.2009, 18:36
Как унаследовать Glib::IOChannel ?
Мне нужно , чтоб можно было сделать подобие Glib::IOChannel::create_from_fd();
Непонятно, как класс узнает fd , если я просто наследую. Хранит fd он походу в private(но не уверен). Где - то видел, что создание с помощью fd происходит так :
Glib::RefPtr<IOChannel> IOChannel::create_from_fd(int fd)
{
return Glib::wrap(g_io_channel_unix_new(fd), false);
}

Я думал сделать подобие этого, но только на мой класс-наследник поменять, но вот wrap(g_io_channel_*, false); возвращает Glib::RefPtr<Glib::IOChannel>> :{ как быть?

РЕШЕНО

ss88
08.06.2009, 14:04
Помогите решить такую задачу на языке Си:

Реал изовать базу данн ых “служащие” в виде файла, содержащего имя, фамилию и отчество служащего, а также его рейтинг. Уметь: 1) вводить данные; 2)удалять данные; 3)изменять данные; 4) сортировать данные по любому столбцу; 5) выводить данные на экран.

В Паскале можно было бы с помощью записей сделать, а тут не знаю как...

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
enum {EMPLOYEE_COUNT=100, NAME_LEN_MAX=100,LNAME_LEN_MAX=100};

typedef struct {
char name[NAME_LEN_MAX];
char lname[LNAME_LEN_MAX];
int rate;
} employee_t;

int get_empl_from_db(const char * file_name, employee_t * list);
void print_empl_list(employee_t * list, size_t count);
static int cmpbyname(const void * p1, const void * p2);
static int cmpbylname(const void * p1, const void * p2);
static int cmpbyrate(const void * p1, const void * p2);
void sort(employee_t * list,size_t count, int (*cmpitems)(const void * p1, const void * p2));
void save_db(const char * file_name, employee_t * list, size_t count);
void add(employee_t new_empl, employee_t * list, size_t count);
void delete(size_t del_index, employee_t * list, size_t &count);

int main(int argc, char** argv){
size_t empl_count=0;
employee_t * empl_list = calloc(EMPLOYEE_COUNT,sizeof(employee_t));
empl_count = get_empl_from_db("db.txt",empl_list);
if(empl_count==0){
fprintf(stderr,"Empty database or error reading\n");
exit(EXIT_FAILURE);
}
printf("%d\n",empl_count);
print_empl_list(empl_list, empl_count);
sort(empl_list,empl_count,cmpbyrate);

print_empl_list(empl_list, empl_count);
exit(EXIT_SUCCESS);
}

int get_empl_from_db(const char * file_name, employee_t * list) {
FILE * db_file = fopen(file_name,"rt");
if(db_file == NULL) return 0;
int i;
for(i=0; !feof(db_file) && i < EMPLOYEE_COUNT; i++)
if(fscanf(db_file,"%s %s %d",list[i].name,list[i].lname,&list[i].rate)!=3)
break;
fclose(db_file);
return i;
}

void save_db(const char * file_name, employee_t * list, size_t count) {
FILE * db_file = fopen(file_name,"wt");
if(db_file == NULL) return;
for(int i=0; i < count; i++)
fprintf(db_file,"%s %s %d\n",list[i].name,list[i].lname,list[i].rate);
fclose(db_file);
}

void add(employee_t new_empl, employee_t * list, size_t count) {
if(count == EMPLOYEE_COUNT)
return;
list[count]=new_empl;
}

void delete(size_t del_index, employee_t * list, size_t &count) {
if(del_index >= count)
return;
else
for(int i = del_index; i<*count-1; i++)
list[i]=list[i+1];
--(*count);
}

void print_empl_list(employee_t * list, size_t count) {
for(int i = 0; i < count; i++)
printf("%d %s %s %d\n",i+1,list[i].name,list[i].lname,list[i].rate);
}

static int cmpbyname(const void * p1, const void * p2){
return strcmp(((employee_t *)p1)->name, ((employee_t *)p2)->name);
}
static int cmpbylname(const void * p1, const void * p2){
return strcmp(((employee_t *)p1)->lname, ((employee_t *)p2)->lname);
}
static int cmpbyrate(const void * p1, const void * p2){
return (((employee_t *)p1)->rate == ((employee_t *)p2)->rate)?0
:((((employee_t *)p1)->rate < ((employee_t *)p2)->rate)?-1:1);

}
/* sorting array with qsort() function and refreshing*/
void sort(employee_t * list,size_t count, int (*cmpitems)(const void * p1, const void * p2)){
qsort(list, count, sizeof(employee_t), cmpitems);
}

формат входного файла
имя фамилия рейтинг
имя фамилия рейтинг

Особо не форматировал код, чтение БД, сохранение, сортировка по любому полю, удаление и добавление есть. Интерфейс делай какой хочешь. Проблемы переполнения буфферов количества работников и имени/фамилии я не рассматривал, т.к. это не приоритетные вопросы в контексте текущей задачи.

ПЫ.СЫ. код нужно компилировать в стандарте языка С от 99-го года (с99). Лучше всего для этого подходит gcc (ему в make-файле или из консоли надо указать -std=c99). Есть еще варианты типа Пеллеса и ЛЦЦ, но лучше этого не делать. BC и TC, скорее всего, выдадут несколько ошибок, потому что они нифига не соблюдали стандарт никогда да и разработка этих сред закончилась много ранее появления 99-го стандарта языка С.

ПЫ.ПЫ.СЫ. Если сделаешь что-то на этой основе. то разберись, что такое функция qsort(). Подозреваю, что это лаба на ранних курсах института, прикольно будет если напугаешь препода знанием таких методов.

s_p_a_m
08.06.2009, 23:06
ниже кусок кода. как сделать чтобы не открывалась стразу страница OpenURL("http://forum.antichat.ru/"); а вводился адресс вручную?
void main(void) {


char *result=OpenURL("http://forum.antichat.ru/");
if (result) {
printf("%s",result);
free(result);
}
else {
printf("Error # WSABASEERR+%d\n",WSAGetLastError()-WSABASEERR);
}

ss88
08.06.2009, 23:27
ниже кусок кода. как сделать чтобы не открывалась стразу страница OpenURL("http://forum.antichat.ru/"); а вводился адресс вручную?
void main(void) {


char *result=OpenURL("http://forum.antichat.ru/");
if (result) {
printf("%s",result);
free(result);
}
else {
printf("Error # WSABASEERR+%d\n",WSAGetLastError()-WSABASEERR);
}

char URL[1024]="";
(void)scanf("%s",URL);
char *result=OpenURL(URL);

+ лучше не проверяй строку просто так вот, лучше сравнивай с null. Это касается и всех остальных типов.

Roston
09.06.2009, 02:00
[C++]
народ плз напише ф-цию сортировки масива с помощью указателей.... именно их потому что я масив буду сортировать несколько раз и с разными исходными даными(от какого елемента до какого)...

ss88
09.06.2009, 02:38
[C++]
народ плз напише ф-цию сортировки масива с помощью указателей.... именно их потому что я масив буду сортировать несколько раз и с разными исходными даными(от какого елемента до какого)...
не совсем понятно условие, заюзай qsort() или уточни свою проблему

Roston
09.06.2009, 10:05
ну вот будет даваццо масив.... и его надо будет сортировать несколько раз... суть в том что сортировка будет каждый раз происходить не с 0 елемента а с какого нить другого, и заканчиваццо не последним а заданым... и каждый раз один елемент(сам уже сделаю) будет заносиццо в другой масив.... при следующей сортировки один елемент опять же будет заносиццо в масив созданый при первой сортировке.....
почему указатели??? потому что при перврй сортировке собьеться порядок елементов.... а при каждой следующей надо сохранять самый первый, тобишь исходный порядок.... так яснее?

Fata1ex
09.06.2009, 11:33
А в чем проблема? Просто в цикле сортировки к указателю прибавляешь i, чтобы получать следующий элемент. А так тоже самое.

s_p_a_m
09.06.2009, 14:58
что не правельно в этом запросе? отсылаю его на сервер, а от сервера ни ответа ни привета char *query=(char*)malloc(2048);

strcpy(query,"POST /");
strcat(query,http_path);
strcat(query," HTTP/1.0\nHost: ");
strcat(query,http_host);
strcat(query,"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 \r\n");
strcat(query,"Accept-Language: ru,en-us;q=0.7,en;q=0.3 \r\n");
strcat(query,"Accept-Encoding: gzip,deflate \r\n");
strcat(query,"Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7 \r\n");
strcat(query,"Keep-Alive: 300 \r\n");
strcat(query,"Connection: keep-alive \r\n");
strcat(query,"Content-Type: application/x-www-form-urlencoded; charset=UTF-8 \r\n");
strcat(query,"X-Requested-With: XMLHttpRequest \r\n");
strcat(query,"Referer: http://vkontakte.ru/index.php \r\n");
strcat(query,"Content-Length: 65 \r\n");
strcat(query,"Cookie: remixlang=0; remixchk=5; remixautobookmark=14; remixclosed_tabs=64; lang=0; remixgroup_closed_tabs=0 \r\n");
strcat(query,"Pragma: no-cache \r\n");
strcat(query,"Cache-Control: no-cache \r\n");
strcat(query,"op=a_login_attempt&email=mail%40mail.ua&pass=123456&expire=0");

Kaimi
09.06.2009, 15:17
char *query=(char*)malloc(2048);

попробуй заменить оператором new

Толку с такой замены не будет


что не правельно в этом запросе? отсылаю его на сервер, а от сервера ни ответа ни привета

Целиком код покажи, и перед данными post запроса должен стоять двойной перенос строки

s_p_a_m
09.06.2009, 16:30
вот весь код
#include <windows.h>

#include <stdio.h>
#include <string.h>
#pragma comment(lib, "ws2_32.lib")

char* OpenURL(char *url) {
WSADATA lpWSAData;
SOCKET s;

// Проверим на правильность введенный адрес.
// Он должен начинаться с "http://"
if (memcmp(url,"HTTP://",7)!=0 && memcmp(url,"http://",7)!=0) return(NULL);
url+=7;

// Инициализация библиотеки Ws2_32.dll.
if (WSAStartup(MAKEWORD(1,1),&lpWSAData)!=0) return(NULL);


// Получим имя хоста, номер порта и путь ----------------------------

char *http_host=strdup(url); // Имя хоста (HTTP_HOST)
int port_num=80; // Номер порта по умолчанию (HTTP_PORT)
char *http_path=NULL; // Путь (REQUEST_URI)

char *pch=strchr(http_host,':');
if (!pch) {
pch=strchr(http_host,'/');
if (pch) {
*pch=0;
http_path=strdup(pch+1);
}
else http_path=strdup("");
}
else {
*pch=0;pch++;
char *pch1 = strchr(pch,'/');
if (pch1) {
*pch1=0;
http_path=strdup(pch1+1);
}
else http_path=strdup("");

port_num = atoi(pch);

if (port_num==0) port_num = 80;
}

// Поучаем IP адрес по имени хоста
struct hostent* hp;
if (!(hp=gethostbyname(http_host))) {
free(http_host);
free(http_path);
return(NULL);
}

// Открываем сокет
s=socket(AF_INET, SOCK_STREAM, 0);
if (s==INVALID_SOCKET) {
free(http_host);
free(http_path);
return(NULL);
}

// Заполняем структуру sockaddr_in
struct sockaddr_in ssin;
memset ((char *)&ssin, 0, sizeof(ssin));
ssin.sin_family = AF_INET;
ssin.sin_addr.S_un.S_un_b.s_b1 = hp->h_addr[0];
ssin.sin_addr.S_un.S_un_b.s_b2 = hp->h_addr[1];
ssin.sin_addr.S_un.S_un_b.s_b3 = hp->h_addr[2];
ssin.sin_addr.S_un.S_un_b.s_b4 = hp->h_addr[3];
ssin.sin_port = htons(port_num);

// Выводим IP адрес хоста, с которым будем соединятся
printf("Conecting to %d.%d.%d.%d...",(unsigned char)hp->h_addr[0],
(unsigned char)hp->h_addr[1],
(unsigned char)hp->h_addr[2],
(unsigned char)hp->h_addr[3]);

// Соединяемся с хостом
if (connect(s, (sockaddr *)&ssin, sizeof(ssin))==-1) {
free(http_host);
free(http_path);
printf("Error\n");
return(NULL);
}
printf("Ok\n");

// Формируем HTTP запрос
char *query=(char*)malloc(2048);

strcpy(query,"POST /");
strcat(query,http_path);
strcat(query," HTTP/1.0\nHost: ");
strcat(query,http_host);
strcat(query,"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 \r\n");
strcat(query,"Accept-Language: ru,en-us;q=0.7,en;q=0.3 \r\n");
strcat(query,"Accept-Encoding: gzip,deflate \r\n");
strcat(query,"Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7 \r\n");
strcat(query,"Keep-Alive: 300 \r\n");
strcat(query,"Connection: keep-alive \r\n");
strcat(query,"Content-Type: application/x-www-form-urlencoded; charset=UTF-8 \r\n");
strcat(query,"X-Requested-With: XMLHttpRequest \r\n");
strcat(query,"Referer: http://vkontakte.ru/index.php \r\n");
strcat(query,"Content-Length: 65 \r\n");
strcat(query,"Cookie: remixlang=0; remixchk=5; remixautobookmark=14; remixclosed_tabs=64; lang=0; remixgroup_closed_tabs=0 \r\n");
strcat(query,"Pragma: no-cache \r\n");
strcat(query,"Cache-Control: no-cache \r\n");
strcat(query,"op=a_login_attempt&email=mail%40mail.ua&pass=password&expire=0");

// Выводим HTTP запрос
printf("%s",query);

// Отправляем запрос серверу
int cnt=send(s,query,strlen(query),0);

// Освобождаем память
free(http_host);
free(http_path);
free(query);

// Проверяем, не произошло ли ошибки при отправке запроса на сервер
if (cnt==SOCKET_ERROR) return(NULL);

cnt=1;

// Получаем ответ с сервера ---------------------------------

int size=1024*1024; // 1Mb
char *result=(char*)malloc(size);
strcpy(result,"");
char *result_ptr=result;

while (cnt!=0 && size>0) {
cnt=recv (s, result_ptr, sizeof(size),0);
if (cnt>0) {
result_ptr+=cnt;
size-=cnt;
}
}
*result_ptr=0;

// Деинициализация библиотеки Ws2_32.dll
WSACleanup();

return(result);
}

void main(void) {


char URL[1024]="";
(void)scanf("%s",URL);
char *result=OpenURL(URL);
if (result) {
printf("%s",result);
free(result);
}
else {
printf("Error # WSABASEERR+%d\n",WSAGetLastError()-WSABASEERR);
}

getchar();
getchar();
}

Kaimi
09.06.2009, 16:52
Длинна содержимого Post запроса 62, а не 65
И \r\n\r\n перед содержимым

s_p_a_m
09.06.2009, 18:26
по аналогии передаю вот такой вот пакет, и что то опять не правельно :( хелп ми
char *query=(char*)malloc(2048);

strcpy(query,"POST /");
strcat(query,http_path);
strcat(query," HTTP/1.0\nHost: ");
strcat(query,http_host);
strcat(query,"\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 ");
strcat(query,"\r\nAccept-Language: ru,en-us;q=0.7,en;q=0.3 ");
strcat(query,"\r\nAccept-Encoding: gzip,deflate ");
strcat(query,"\r\nAccept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7 ");
strcat(query,"\r\nKeep-Alive: 300 ");
strcat(query,"\r\nConnection: keep-alive ");
strcat(query,"\r\nContent-Type: application/x-www-form-urlencoded; charset=UTF-8 ");
strcat(query,"\r\nX-Requested-With: XMLHttpRequest ");
strcat(query,"\r\nReferer: Referer: http://*** ");
strcat(query,"\r\nContent-Length: 1588");
strcat(query,"\r\nCookie: remixlang=0; remixchk=5; remixautobookmark=14; remixclosed_tabs=64; lang=0; remixgroup_closed_tabs=0 ");
strcat(query,"\r\nPragma: no-cache");
strcat(query,"\r\nCache-Control: no-cache");
strcat(query,"\r\nsql_query=UPDATE+%60account%60+SET+%60id%60+%3 D+%2712%27%2C+%60username%60+%3D+%27Xexe%27%2C+%60 sha_pass_hash%60+%3D+%27d7c390a3872b468d05723ded07 4ce85887b45ea3%27%2C+%60gmlevel%60+%3D+%273%27%2C+ %60sessionkey%60+%3D+%271802AD963972B2EEDD19960759 F6BDD583BB726E290C1DFDADB90C01FD51BA1F8A356B83608E 3C6D%27%2C+%60v%60+%3D+%270%27%2C+%60s%60+%3D+%270 %27%2C+%60email%60+%3D+%27Kaka%40meil.ua%27%2C+%60 joindate%60+%3D+%272009-03-15+21%3A15%3A43%27%2C+%60last_ip%60+%3D+%27192.168 .3.89%27%2C+%60failed_logins%60+%3D+%270%27%2C+%60 locked%60+%3D+%270%27%2C+%60last_login%60+%3D+%272 009-04-25+22%3A57%3A54%27%2C+%60online%60+%3D+%270%27%2C+ %60expansion%60+%3D+%272%27%2C+%60mutetime%60+%3D+ %270%27%2C+%60locale%60+%3D+%278%27+WHERE++%60id%6 0+%3D+%2712%27+AND+%60username%60+%3D+%27Xexe%27+A ND+%60sha_pass_hash%60+%3D+%27d7c390a3872b468d0572 3ded074ce85887b45ea3%27+AND+%60gmlevel%60+%3D+%270 %27+AND+%60sessionkey%60+%3D+%271802AD963972B2EEDD 19960759F6BDD583BB726E290C1DFDADB90C01FD51BA1F8A35 6B83608E3C6D%27+AND+%60v%60+%3D+%270%27+AND+%60s%6 0+%3D+%270%27+AND+%60email%60+%3D+%27Kaka%40meil.u a%27+AND+%60joindate%60+%3D+%272009-03-15+21%3A15%3A43%27+AND+%60last_ip%60+%3D+%27192.16 8.3.89%27+AND+%60failed_logins%60+%3D+%270%27+AND+ %60locked%60+%3D+%270%27+AND+%60last_login%60+%3D+ %272009-04-25+22%3A57%3A54%27+AND+%60online%60+%3D+%270%27+AN D+%60expansion%60+%3D+%272%27+AND+%60mutetime%60+% 3D+%270%27+AND+%60locale%60+%3D+%278%27++LIMIT+1%3 B&sql_db=realmdtest&sql_port=3306&sql_server=localhost&sql_passwd=password&sql_login=root&act=sql&sql_act=query&sql_tbl=account&submit=1&sql_goto=&sql_confirm=Yes");

Kaimi
09.06.2009, 18:49
Ты меня не так понял видимо. Я имел ввиду что запрос должен выглядеть примерно так

POST /cgi-bin/auth HTTP/1.0\r\n
Host: mail.ru\r\n
Content-type: application/x-www-form-urlencoded\r\n
Content-length: длинна содержимого\r\n\r\n
Содержимое

s_p_a_m
09.06.2009, 19:09
Это может быть вызвано повреждением кучи и указывает на ошибку в http.exe или в одной из загруженных им DLL.

Возможной причиной так же может быть нажатие пользователем клавиши F12, когда фокус принадлежит http.exe

s_p_a_m
09.06.2009, 19:11
Ты меня не так понял видимо. Я имел ввиду что запрос должен выглядеть примерно так

POST /cgi-bin/auth HTTP/1.0\r\n
Host: mail.ru\r\n
Content-type: application/x-www-form-urlencoded\r\n
Content-length: длинна содержимого\r\n\r\n
Содержимое

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

Kaimi
09.06.2009, 19:26
strcpy(query,"POST /");
strcat(query,http_path);
strcat(query," HTTP/1.0\nHost: ");
strcat(query,http_host);
strcat(query,"\r\nConnection: close \r\n");
strcat(query,"Content-Type: application/x-www-form-urlencoded; charset=UTF-8 \r\n");
strcat(query,"Cookie: remixlang=0; remixchk=5; remixautobookmark=14; remixclosed_tabs=64; lang=0; remixgroup_closed_tabs=0 \r\n");
strcat(query,"Content-Length: 62\r\n\r\n");
strcat(query,"op=a_login_attempt&email=mail%40mail.ua&pass=password&expire=0");

Ra$cal
09.06.2009, 19:56
s_p_a_m, прекоати юзать char* для формирования данных. юзай std::string и оператор +. иначе с таким подходом к расчету требуемой памяти у тебя всегда будут косяки.

Msw0rm
09.06.2009, 21:21
Как уменьшить размер ехе файла в builber 6 и4 visual c++ 2008 ?

razb
09.06.2009, 21:37
Как уменьшить размер ехе файла в builber 6 и4 visual c++ 2008 ?
Собери динамически(но прийдется тягать либсы) или юзай какой нибудь упаковщик.

Djezul
10.06.2009, 00:56
народ у меня такая проблема, как мне лучше реализовать проверку вводит ли пользователь нужные мне символы или другие, у меня 4 варианта, допустим 1,2,3,4 , при вводе другого значения пользователю должны предложить снова ввести символ, пробовал atoi , чёто не получается((

Fata1ex
10.06.2009, 01:02
Зачем тебе преобразование? Просто сравнивай строки, например case'ом. Выложи код.

Msw0rm
10.06.2009, 12:40
3097, а есле на чистом арi то будет работать без библиотек ?

Djezul
10.06.2009, 13:57
Зачем тебе преобразование? Просто сравнивай строки, например case'ом. Выложи код.
Как зачем преобразование, я ввожу строку а на выходе мне надо чтобы было число 1 или 2 или3 или 4 , при этом если я ввожу не одно из этих чисел мне снова надо дать возможно ввести, и так пока я не введу одно из нужных мне чисел. Было бы логично так

while(true){
cin>>x;
y=atoi(x)
if(y==1||y==2||y==3||y==4){
break;
}
x="";
}

но атуи чёто не пашет(((

Fata1ex
10.06.2009, 14:04
Выложи код целиком. Зачем тебе atoi?
Ты не можешь сравнивать х и "1"||"2"||"3"||"4"?
И проставь точки с запятой.

Lee_fx
10.06.2009, 14:52
Как без использования условных операторов проверить положительно ли число?

Fata1ex
10.06.2009, 14:59
Зачем можно узнать?
Можно оператором выбора: делим целое число на абсолютное значение (>0) и сравниваем с 1 и -1.
Хотя этот же оператор выбора и есть разновидность условного оператора...

ino222
10.06.2009, 15:05
Есть горящий вопрос-сегодня нужно закончить пару кнопок в один блог, кнопки-флэш, сразу оговорюсь, я не пишу на AS, я работаю программно, но подобрать не могу необходимую функцию, а требуется следующее:
-кнопка прозрачная(уже есть!)
-клик по кнопке-звук треснувшего камня(уже есть!)
---------------------------------------------------------------------
-нужно визуально отобразить треснувшую кнопку-как расходятся линии разлома в течении 1 сек., потом уже переход по ссылке(((((
пипец башку сломал-нужно к вечеру уже доделать
Кто-то, что-то актуальное может посоветовать?

пипец башку сломал

Fata1ex
10.06.2009, 15:06
Это не в этот топик.
Вам сюда (http://forum.antichat.ru/thread79502.html)

ss88
10.06.2009, 15:20
Как без использования условных операторов проверить положительно ли число?
Это что-то типа...... получить ответ не задав вопрос....
Для этого нужно принять определенные вещества и выйти на новый уровень общения с машиной.... )))

Djezul
10.06.2009, 15:28
Выложи код целиком. Зачем тебе atoi?
Ты не можешь сравнивать х и "1"||"2"||"3"||"4"?
И проставь точки с запятой.

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

#include <iostream>
#include <windows.h>
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
void main(){
void Info(char str[100],int dl_str,bool sound=false);
Info("### Welcome to the BK! ###",31,true);
//------------------------Переменные-------------------------
char name[80];//Имя персонажа!
cout<<"Enter your name!\t";
cin>>name;
enum {warrior=1,mage=2,priest=3,ranger=4};
int user_class; //Какой класс выбран!
char proverka_na_vubor_classa; //проверка на уверенность в выборе класса
bool prov_na_simvol=true; //проверка на правильность выбора класса
bool vtoraya_proverka_na_vubor_classa=true; //проверка на уверенность в выборе класса

while(vtoraya_proverka_na_vubor_classa){
system("cls");
cout<<"Choose your class!\n\n*** Warrior ***\t- 1\n*** Mage ***\t- 2"
<<"\n*** Priest ***\t- 3\n*** Ranger ***\t- 4\n\n";
//проверка на ввод числа а не чегото другого, такоеже сделать
//while(true){
// cin>>enter_user_class;
// user_class=atoi(enter_user_class);
// if(user_class==1||user_class==2||user_class==3||us er_class==4){
// break;
// }
// enter_user_class="";
//}
cin>>user_class;
switch(user_class){
case warrior:
system("cls");
cout<<"You choose warrior!\nYour standart parametrs!\n\n**************************\n"
<<"int - 0\npower - 6\nagility - 0\nstamina - 4\n"
<<"*************************\n";
break;
case mage:
system("cls");
cout<<"You choose mage!\nYour standart parametrs!\n\n**************************\n"
<<"int - 8\npower - 8\nagility - 5\nstamina - 2\n"
<<"*************************\n";
break;
case priest:
system("cls");
cout<<"You choose priest!\nYour standart parametrs!\n\n**************************\n"
<<"int - 5\npower - 0\nagility - 0\nstamina - 5\n"
<<"*************************\n";
break;
case ranger:
system("cls");
cout<<"Your standart parametrs!\n\n**************************\n"
<<"int - 0\npower - 0\nagility - 8\nstamina - 2\n"
<<"*************************\n";
break;
}
cout<<"\nAre you shure?(Y/N)\t";
cin>>proverka_na_vubor_classa;
if(proverka_na_vubor_classa=='y'||proverka_na_vubo r_classa=='Y'){
vtoraya_proverka_na_vubor_classa=false;
}
}
system("cls");
//конец выбора класса
Info("Now you will get into the main menu!",37);

cout<<"\n\n";
}

Djezul
10.06.2009, 15:31
Как без использования условных операторов проверить положительно ли число?
Писать код не буду, но скажу что там формула есть , это потипу проверить какое число больше.

Fata1ex
10.06.2009, 15:40
while(flag) {
switch(enter_user_class) {
case '1': user_class = 1; cout << "You are mage tratata"; flag = 0; break;
case '2': user_calss = 2; cout << "You are warior tratata"; flag = 0; break;
case '3': -//-
case '4': -//-
default: cout << "what the fuck did u entered idiot?"; break;
}
}


Зачем нужно две проверки?

Djezul
10.06.2009, 15:47
недопустимое выражение чар100 в свитч, да и как я понял с таким кодом проверка выполнится только 1 раз, и если не правильно то выведеться только "what the fuck did u entered idiot? , а мне надо чтобы оно снова предложило ввести как я писал выше

Fata1ex
10.06.2009, 15:53
Я подправил код. enter_user_class должно быть char.

Djezul
10.06.2009, 15:58
ток теперь цикл не брейкается даже при вводе норм значений))
И тупо что если вводишь 2 символа она 2 раза выдаст дефалт, если 3 то 3 раза

А и не скажешь плиз, какая функция возвращает длину строки?

razb
10.06.2009, 16:21
А и не скажешь плиз, какая функция возвращает длину строки?
strlen();

Djezul
10.06.2009, 16:34
спс

Lee_fx
10.06.2009, 18:09
Это что-то типа...... получить ответ не задав вопрос....
Для этого нужно принять определенные вещества и выйти на новый уровень общения с машиной.... )))
Оказалось намного проще =)
int sign = (num>0) - (num<0); //1 - положительное, -1 - отрицательное, 0 - ноль

Fata1ex
10.06.2009, 18:16
Условные операторы все равно косвенно выполняются при подсчете возвращаемого значения выражения (num>0) и (num<0) = )

Ra$cal
10.06.2009, 18:54
чтобы проверять вхождения удобнее юзать массивы. определяешь так
string invalid_dic [] = {"1", "2", "3", "4"};

bool is_valid(string data){
for(int i = 0; i < sizeof(invalid_dic) / sizeof(invalid_dic[0]); i++){
if(data.compare(invalid_dic[i]) == 0)
return false;
}
return true;
}

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

Djezul
10.06.2009, 18:55
В чём ошибка , не хочет компелироваться

#include <iostream>
#include <windows.h>
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
struct personaj{
char name[20];
int game_class;
int power,stamina,agility,intelect,hp;
};
void main(){
void Info(char str[100],bool sound=false);
bool Main_Menu();
bool Arena(personaj player);
Info("### Welcome to the BK! ###",true);
//------------------------Переменные-------------------------
personaj player,computer;
computer.game_class=1;
computer.agility=5;
computer.intelect=5;
computer.power=5;
computer.stamina=5;
computer.hp=30;

cout<<"Enter your name!\t";
cin>>player.name;
enum {warrior=1,mage=2,priest=3,ranger=4};
// char enter_user_class;
int user_class=0; //Какой класс выбран!
char proverka_na_vubor_classa; //проверка на уверенность в выборе класса
bool prov_na_simvol=true; //проверка на правильность выбора класса
bool vtoraya_proverka_na_vubor_classa=true; //проверка на уверенность в выборе класса

while(vtoraya_proverka_na_vubor_classa){
system("cls");
cout<<"Choose your class!\n\n*** Warrior ***\t- 1\n*** Mage ***\t- 2"
<<"\n*** Priest ***\t- 3\n*** Ranger ***\t- 4\n\n";
//проверка на ввод числа а не чегото другого, такоеже сделать
/*while{user_class!=1||user_class!=2||user_class!=3 ||user_class!=4){
cin>>enter_user_class;
switch(enter_user_class){
case '1': user_class=1; cout<<"War"; break;
case '2': user_class=2; cout<<"W"; break;
case '3': user_class=3; cout<<"Wr"; break;
case '4': user_class=4; cout<<"Wa"; break;
default: cout<<"Fuck";
}}*/
cin>>user_class;
switch(user_class){
case warrior:
system("cls");
player.agility=0;
player.intelect=0;
player.power=6;
player.stamina=4;
player.hp=30;
cout<<"You choose warrior!\nYour standart parametrs!\n\n**************************\n"
<<"intelect - "<<player.intelect
<<"\npower - "<<player.power
<<"\nagility - "<<player.agility
<<"\nstamina - "<<player.stamina
<<"\n*************************\n";
player.game_class=1;
break;
case mage:
system("cls");
player.agility=0;
player.intelect=8;
player.power=0;
player.stamina=2;
player.hp=15;
cout<<"You choose mage!\nYour standart parametrs!\n\n**************************\n"
<<"intelect - "<<player.intelect
<<"\npower - "<<player.power
<<"\nagility - "<<player.agility
<<"\nstamina - "<<player.stamina
<<"\n*************************\n";
player.game_class=2;
break;
case priest:
system("cls");
player.agility=0;
player.intelect=5;
player.power=0;
player.stamina=5;
player.hp=20;
cout<<"You choose priest!\nYour standart parametrs!\n\n**************************\n"
<<"intelect - "<<player.intelect
<<"\npower - "<<player.power
<<"\nagility - "<<player.agility
<<"\nstamina - "<<player.stamina
<<"\n*************************\n";
player.game_class=3;
break;
case ranger:
system("cls");
player.agility=8;
player.intelect=0;
player.power=0;
player.stamina=2;
player.hp=20;
cout<<"Your standart parametrs!\n\n**************************\n"
<<"intelect - "<<player.intelect
<<"\npower - "<<player.power
<<"\nagility - "<<player.agility
<<"\nstamina - "<<player.stamina
<<"\n*************************\n";
player.game_class=4;
break;
}
cout<<"\nAre you shure?(Y/N)\t";
cin>>proverka_na_vubor_classa;
if(proverka_na_vubor_classa=='y'||proverka_na_vubo r_classa=='Y'){
vtoraya_proverka_na_vubor_classa=false;
}
}
system("cls");
//конец выбора класса
Info("Now you will get into the main menu!");
Main_Menu();
cout<<"\n\n";
}
void Info(char str[100],bool sound=false){
int dl_str=strlen(str);
for(int i=0;i<dl_str;i++){
cout<<str[i];
if(sound){
if(i==0||i==dl_str-1){
cout<<"\a";
}
}
Sleep(100);
}
system("cls");
}
//Меню основное
bool Main_Menu(){
bool proverka_na_vuhod_iz_menu=true;
int user_choose_action_main_menu;
while(proverka_na_vuhod_iz_menu){
system("cls");
cout<<"Go to the Arena\t- 1\nGo to the shop\t- 2\nExit the game\t- 3\n";
cin>>user_choose_action_main_menu;
switch(user_choose_action_main_menu){
case 1:
system("cls");
Info("You will get to the arena soon!");
if(Arena(player)){
cout<<"Player win!";
}else{
cout<<"Player win!";
}
proverka_na_vuhod_iz_menu=false;
break;
case 2:
system("cls");
Info("You will get to the shop soon!");
proverka_na_vuhod_iz_menu=false;
break;
case 3:
system("cls");
Info("You will exit the game!");
proverka_na_vuhod_iz_menu=false;
return true;
break;
}
}

}
bool Arena(personaj player){
int player_action;
while(true){
if(player.hp<=0){
return false;
break;
}
if(computer.hp<=0){
return true;
break;
}
cout<<"Hit the Head!\t- 1\nHit the stomach!\t- 2\nHit \t- 3\n";
cin>>player_action;
switch(player_action){
case 1:
player.hp=player.hp-5;
computer.hp=computer.hp-10;
break;
case 2:
player.hp=player.hp-5;
computer.hp=computer.hp-10;
break;
case 3:
player.hp=player.hp-5;
computer.hp=computer.hp-10;
break;
}
}
}


пишет
Ошибка 1 error C2065: player: необъявленный идентификатор c:\users\антон\documents\visual studio 2008\projects\09.06.09\09.06.09\09.06.09.cpp 149
Ошибка 2 error C3861: Arena: идентификатор не найден c:\users\антон\documents\visual studio 2008\projects\09.06.09\09.06.09\09.06.09.cpp 149
Ошибка 3 error C2065: computer: необъявленный идентификатор c:\users\антон\documents\visual studio 2008\projects\09.06.09\09.06.09\09.06.09.cpp 178
Ошибка 4 error C2228: выражение слева от ".hp" должно представлять класс, структуру или объединение c:\users\антон\documents\visual studio 2008\projects\09.06.09\09.06.09\09.06.09.cpp 178
Ошибка 5 error C2065: computer: необъявленный идентификатор c:\users\антон\documents\visual studio 2008\projects\09.06.09\09.06.09\09.06.09.cpp 187
Ошибка 6 error C2228: выражение слева от ".hp" должно представлять класс, структуру или объединение c:\users\антон\documents\visual studio 2008\projects\09.06.09\09.06.09\09.06.09.cpp 187
Ошибка 7 error C2065: computer: необъявленный идентификатор c:\users\антон\documents\visual studio 2008\projects\09.06.09\09.06.09\09.06.09.cpp 187
Ошибка 8 error C2228: выражение слева от ".hp" должно представлять класс, структуру или объединение c:\users\антон\documents\visual studio 2008\projects\09.06.09\09.06.09\09.06.09.cpp 187
Ошибка 9 error C2065: computer: необъявленный идентификатор c:\users\антон\documents\visual studio 2008\projects\09.06.09\09.06.09\09.06.09.cpp 191
Ошибка 10 error C2228: выражение слева от ".hp" должно представлять класс, структуру или объединение c:\users\антон\documents\visual studio 2008\projects\09.06.09\09.06.09\09.06.09.cpp 191
Ошибка 11 error C2065: computer: необъявленный идентификатор c:\users\антон\documents\visual studio 2008\projects\09.06.09\09.06.09\09.06.09.cpp 191
Ошибка 12 error C2228: выражение слева от ".hp" должно представлять класс, структуру или объединение c:\users\антон\documents\visual studio 2008\projects\09.06.09\09.06.09\09.06.09.cpp 191
Ошибка 13 error C2065: computer: необъявленный идентификатор c:\users\антон\documents\visual studio 2008\projects\09.06.09\09.06.09\09.06.09.cpp 195
Ошибка 14 error C2228: выражение слева от ".hp" должно представлять класс, структуру или объединение c:\users\антон\documents\visual studio 2008\projects\09.06.09\09.06.09\09.06.09.cpp 195
Ошибка 15 error C2065: computer: необъявленный идентификатор c:\users\антон\documents\visual studio 2008\projects\09.06.09\09.06.09\09.06.09.cpp 195
Ошибка 16 error C2228: выражение слева от ".hp" должно представлять класс, структуру или объединение c:\users\антон\documents\visual studio 2008\projects\09.06.09\09.06.09\09.06.09.cpp 195

как передать правильно функции арена, значения типа плеер?

Ra$cal
10.06.2009, 19:08
bool Arena(personaj& player){
...

Fata1ex
10.06.2009, 19:13
Сначала ты спрашиваешь в чем ошибка, а потом выкладываешь список ошибок >.<
Все ошибки указаны компилятором.

Djezul
10.06.2009, 19:14
тоже самое((

Djezul
10.06.2009, 19:16
Сначала ты спрашиваешь в чем ошибка, а потом выкладываешь список ошибок >.<
Все ошибки указаны компилятором.

Я думал ты понял о чём я , я только неделю учу си и ещё не сильно в нём ориентируюсь, так что ошибки компилятора мне ни о чем не говорят, я понимаю что они указаны, но что надо исправить в коде , чтобы их небыло, и что это за ошибки, мсдл не сильно помогло(

Ra$cal
10.06.2009, 19:18
это не какие то магические ошибки. они вполне четко описывают проблему. поэтому читай сообщение и исправляй.

почитай тогда книжку "Как программировать на с++". От этого будет больше толка.

Djezul
10.06.2009, 19:21
я читаю выражение слева от ".hp" должно представлять класс, структуру или объединение , но оно и представляет структуру или обьединение

я читаю арена не обьявлена, хотя у меня всё обьёвлено

Fata1ex
10.06.2009, 19:21
Вообщем насколько я понял твои функции не знают об объектах, которые ты пытаешься использовать. Передавай им объекты по ссылке.
+ учись сразу разбивать код на модули, очень сложно читать все сразу.

Lee_fx
10.06.2009, 19:26
...
personaj player,computer;
bool Arena(personaj player);
void main()
...

Jakeroid
10.06.2009, 20:18
Сейчас читаю книгу Джесса Либерти "С++ за 21 день". Все ясно и хорошо. НО, хотелось бы еще что нибудь про работу с файлами, открытие сокетов и так далее. Что можите посоветовать? Желательно что-то для начинающего и то, что есть в сети. Потому, что возможности купить нет совсем.

Ra$cal
10.06.2009, 20:26
Сейчас читаю книгу Джесса Либерти "С++ за 21 день". Все ясно и хорошо. НО, хотелось бы еще что нибудь про работу с файлами, открытие сокетов и так далее. Что можите посоветовать? Желательно что-то для начинающего и то, что есть в сети. Потому, что возможности купить нет совсем.
главное понять суть с++. про работу с файлами читай в мсдн(потоки с++ или api на выбор). по сетевому программированию все немного сложнее. для начала хватит того же мсдн. статьи на rsdn так же помогут. из книжек сложно что либо посоветовать. тут важнее опыт, ибо все зависит от типа программы. бывает достаточно просто открыть сокет передать и все. в более серьезных программах передать на сокеты инфу - это самая тривиальная часть. подсистема работы с сетью может содержать и пул потоков, и реализацию протокола своего, замарочки с синхронизацией. так что тут нет особого рецепта. хотя если кто подкинет толковую книжку - буду благодарен.

razb
10.06.2009, 20:33
про работу с файлами читай в мсдн(потоки с++ или api на выбор). по сетевому программированию все немного сложнее. для начала хватит того же мсдн. статьи на rsdn так же помогут.
Небольшое уточнение, это все поможет если собираешься писать под win )
Под nix очень большая библиотека документации находится тут _http://www.codase.com/linux.html

Jakeroid
10.06.2009, 23:44
Небольшое уточнение, это все поможет если собираешься писать под win )
Под nix очень большая библиотека документации находится тут _http://www.codase.com/linux.html
Спасибо. Я пока собераюсь писать по винь. Ладно буду копаться и дальше читать книжку свою :)

О, еще вопросик. Где найти книженцию иил список задачек для тренеровки языка С++? А то в голову не лезут идеи, а тренироваться надо. И желательно что-то НЕ вроде "вывести на экран слово...", а че нить повеселее.

Ra$cal
11.06.2009, 00:37
Мозговой 85 нетривиальных проектов, решений и задач.djvu
не очень с с++ связано, зато раздолье для фантазии. чтобы использовать на всю мощь плюсы нада хорошо понимать, что они дают. активно юзать классы, наследование. там есть некоторые задачки, которые очень интересно решить немного посидев попроектировав классы.

ss88
11.06.2009, 01:30
Спасибо. Я пока собераюсь писать по винь. Ладно буду копаться и дальше читать книжку свою :)

О, еще вопросик. Где найти книженцию иил список задачек для тренеровки языка С++? А то в голову не лезут идеи, а тренироваться надо. И желательно что-то НЕ вроде "вывести на экран слово...", а че нить повеселее.

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

SHARA
11.06.2009, 08:00
Здрасте. У меня проблема следующего характера. Новичок в С++
Писал тренировочную программу, которая запрашивает пароль, при правильном вводе пароле открывается меню с дальнейшим выбором действий. Ошибка происходит где в функции inform_employee() как мне кажется, что-то я напортачил с массивами строк,
Пример кода

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
bool password();
int option();
void inform_employee();
void inform_sales();
int menu;
int main()
{

if (password()) {
do {
menu=option();
switch(menu) {
case 1:
inform_employee();
break;
case 2:
inform_sales();
break;
case 3:
cout<<"Exit";
break;
}
} while (menu !=3);


}
else cout<<"Deny"<<endl;

return 0;
}
bool password()
{
char s[60];
cout<<"Enter Yout password"<<endl;
gets(s);
if(strcmp(s, "password")) {
cout<<" Otcazano";
return false;
}

return true;
}
int option()
{
cout<<"Hellow, Welcome to Database"<<endl;
cout<<"Enter any option"<<endl;
cout<<" 1.Information about employee "<<endl;
cout<<" 2.Information about Sales"<<endl;
cout<<"3. Exit"<<endl;
cin>>menu;
return menu;
}
void inform_employee ()
{
const char s2 [20] [50] = {

{"Sokolov Anton Nikolaevich"}
{"Ivanov Ivan Ivanovich"}
{"Petov Alexander Alekseevich"}
{"Nikitin Andrew Viktorovich"}
{"Ingener Yuriy Alexandrovich"}
{"Dzuba Yaroslav Igorovich"}
{"Rastegaev Alexander Vladimirovich"}
{"Platonov Ivan Anatolevich"}
{"Sosin Igor Borisovich"}
{"Angirova Amuly Blyd'"}
{"Ageeva Dasha Blyd'"}
{"Saxnik Pavel Vycheslavovich"}
{"Malofeev Kirill Olegovich"}
{"Gumensky Aleksey Gnusovich"}
{"Kycherenko Ivan Petrovich"};
}


cout<< s2 [20] [50]<<" ";
}
void inform_sales()
{
float t;
float s3 [20];
for (t=0; t<15; t++) s[t]=rand();
for (t=0; t<15; t++) cout<<s[t]<<" " <<endl;;

}

_nic
11.06.2009, 09:52
Почему в вижул студио на такой строчке return(String(val).c_str()); (val типа инт) Ошибка " error C2228: выражение слева от ".c_str" должно представлять класс, структуру или объединение" Неужели вижул студио неподдерживает сишный стринг???? да иещё ругается что простанства имен std несуществует ,это как понимать?

new-sl
11.06.2009, 11:30
как зделать перехват нажатия клавиш смпомощю SetWindowHookEx и как создать ддл я искал находил тока на англиском но я в англиском несилён

razb
11.06.2009, 12:42
Почему в вижул студио на такой строчке
Во первый std класс string пишется с маленькой буквы s.
Во вторых у тебя не создан обьект типа string

Пример:
int i = 16;
char buffer[10];
string str(itoa(i, buffer, 9));
cout << str.c_str() << endl;

Что бы избежать itoa, etc. можно использовать stringstreams, например:

ostringstream oss;
i = 7;
oss << i;
cout << oss.str() << endl;

Ra$cal
11.06.2009, 17:49
во первых не задавай размеры массивов, если инициализируешь прямо при объявлении

const char s2 [] [] = {

во вторых что ты хотел сделать строкой cout<< s2 [20] [50]<<" "; . Если вывести все записи - то ты должен обойти в цикле весь массив. число записей высчитывается так
sizeof(s2)/sizeof(s2[0])

SHARA
11.06.2009, 17:57
Понятно
да инструкцией cout<< s2 [20] [50]<<" "; хотел вывести все записи. Ошибку понял.
А после того как я высчитаю число записей. Как мне их выводит через cout. Я немного не понял.
Заранее спасибо

Ra$cal
11.06.2009, 18:15
Mozy
креативный способ, но проще так

for( int i=0; i < sizeof(s2) / sizeof(s2[0]); i++){
cout << s2[i]<<endl;
}

Ra$cal
11.06.2009, 18:42
а самому по докам полазить нельзя? это не математика, где от вас требуется типовое решение. есть язык - используй все его средства. делаешь на си - делаешь без классов и stl. лаба на с++ - юзаешь и классы и stl. отмазка "это мы не проходили" канала в школе. программингу кстати не учат, программингу учатся. не думайте, что преподы дадут вам всю инфу. они дай бог научат основам языка и кривейшим способам создания и форматирования кода. остальное на вашей совести.

mr.The
11.06.2009, 20:51
Что в с++ с сравнением бинарных данных? =\


FILE *fp1, *fp2;

fp1 = fopen("bin.txt", "r");
fp2 = fopen("bin.txt", "r");

char olo1[15], olo2[15];

fread(&olo1,15,15,fp1);
fread(&olo2,15,15,fp2);


fclose(fp1);
fclose(fp2);

if(olo1==olo2) cout << "Ololo\n";

где bin.txt 15-ти байтных файл с бинарными данными. "Ololo\n" не выводится. Почему?

Irdis
11.06.2009, 20:55
т.к. ты сравниваешь адреса в памяти, а не данные по этим адресам

Ra$cal
11.06.2009, 21:09
memcmp в помощь

desTiny
11.06.2009, 21:14
>>это не математика, где от вас требуется типовое решение.
неудачное сравнение =)

if(olo1==olo2) - так ты адреса массивов сравниваешь

mr.The
11.06.2009, 21:15
fp1 = fopen("bin.txt", "r");
fp1 = fopen("bin.txt", "r");

char olo1[15], olo2[15];

fread(&olo1,15,15,fp1);
fread(&olo2,15,15,fp2);


fclose(fp1);
fclose(fp2);

if(memcmp(olo1,olo2,15)==0) cout << "Ololo\n";
да, а так работает.. как-то говнисто выглядит.

Ra$cal
11.06.2009, 21:40
неудачное сравнение =)
очень даже удачное. когда в универе давали задания были пункты типа решить систему уравнений методом крамера. и никак иначе.

да, а так работает.. как-то говнисто выглядит.
сделай класс оболочку и перегрузи у него оператор == и != =) и будет все красиво.

..::Hollywood::..
11.06.2009, 22:47
весь измаялся. вот код
#include <iostream>
using namespace std;
int main();
int Add (int x, int y);
{
cout << " In Add() ,received "<<x<<" and "<<y<<" \n";
return (x+y);
}
int main()
{
Add(3,5);
return 0;
}

Error 1 error C2447: '{' : missing function header (old-style formal list?) c:\documents and settings\мы\мои документы\visual studio 2008\projects\проба2\проба2\4.cpp

http://imglink.ru/thumbnails/11-06-09/7550eccd0df2792788b50e4beda278ff.jpg (http://imglink.ru/show-image.php?id=5a44f6d279e2526c54abe3013b57ee8b)

не компилируется ни одной из visual studio ни в express edition ни в полновесной visual studio 2008/
подскажите пожалуйста в чем дело.

Fata1ex
11.06.2009, 22:53
Может в прототипах :)

..::Hollywood::..
11.06.2009, 23:37
вот ссылка (http://forum.vingrad.ru/forum/topic-262379/anchor-entry1894229/0.html) где это обсуждалось.просто достала эта тема мать ее. че делать ума не приложу,новичок емае зеленый.

new-sl
12.06.2009, 00:41
вот ссылка (http://forum.vingrad.ru/forum/topic-262379/anchor-entry1894229/0.html) где это обсуждалось.просто достала эта тема мать ее. че делать ума не приложу,новичок емае зеленый.

lol

#include <iostream>
using namespace std;
int main();
int Add (int x, int y)
{
cout << " In Add() ,received "<<x<<" and "<<y<<" \n";
return (x+y);
}
int main()
{
Add(3,5);

system ("pause");
return 0;

}

..::Hollywood::..
12.06.2009, 10:37
спасибо.все ж начинали)))

SHARA
12.06.2009, 15:56
Mozy Прав это мы не проходили ахахахах. На самом деле вязлся С++ учить сам и до sizeof() я пока не дошел(теперь буду знать). Спасибо за ответ Mozy и Ra$cal

Djezul
12.06.2009, 20:38
как при выводе строки в файл сделать перевод строки? Пробовал имя_файла << "\n" , чёто не работает((

.ATK
12.06.2009, 20:58
\r\n

rushter
12.06.2009, 21:11
<< endl;

Djezul
12.06.2009, 21:16
спасибо помогло!

_nic
12.06.2009, 23:18
Подскажите почему эта ф-ция

char* regtp(DWORD tp)
{
if(tp==REG_BINARY){return("REG_BINARY");}
if(tp==REG_DWORD){return("REG_DWORD");}
if(tp==REG_DWORD_LITTLE_ENDIAN){return("REG_DWORD_LITTLE_ENDIAN");}
if(tp==REG_DWORD_BIG_ENDIAN){return("REG_DWORD_BIG_ENDIAN");}
if(tp==REG_EXPAND_SZ){return("REG_EXPAND_SZ");}
if(tp==REG_LINK){return("REG_LINK(reserved for system)");}
if(tp==REG_MULTI_SZ){return("REG_MULTI_SZ");}
if(tp==REG_NONE){return("REG_NONE");}
if(tp==REG_QWORD){return("REG_QWORD");}
if(tp==REG_QWORD_LITTLE_ENDIAN){return("REG_QWORD_LITTLE_ENDIAN");}
if(tp==REG_SZ){return("REG_SZ");}
}

В борладнском IDE работает нормально а в вижуал студио выбивает ошибку доступа к памяти?

Roston
12.06.2009, 23:32
привет всем....
надо мануал по графике в С... (<graphics.h>)
я понимаю что это оч старое.. но нуо для лабораторной работы.....
Компилятор Борланд С++ 3.0

Djezul
12.06.2009, 23:42
Появилось ещё несколько вопросов, можно ли как то узнать имя пользователь , который сейчас использует систему, и как после отправки запроса через функцию system() , ответить на вопрос продолжить , да . Вот пробовал после первого вопроса посылать 2 игриком, и потом 3 с аски кодом ентера, но почему то не выходит, скорее всего после 1 запроса прога сразу выводит сообщение и ждёт продолжения, а потом выполняются 2 вторых запроса, как можно решить эту проблему?

Ra$cal
13.06.2009, 03:09
GetUserName - получить имя пользователя. инклюдить windows.h может понадобится Advapi32.lib.

system() для взаимодействия использовать категорически не советую. максимум - system("pause"). ито лучше юзать getch и иже с ними

new-sl
13.06.2009, 11:29
Подскажите почему эта ф-ция

char* regtp(DWORD tp)
{
if(tp==REG_BINARY){return("REG_BINARY");}
if(tp==REG_DWORD){return("REG_DWORD");}
if(tp==REG_DWORD_LITTLE_ENDIAN){return("REG_DWORD_LITTLE_ENDIAN");}
if(tp==REG_DWORD_BIG_ENDIAN){return("REG_DWORD_BIG_ENDIAN");}
if(tp==REG_EXPAND_SZ){return("REG_EXPAND_SZ");}
if(tp==REG_LINK){return("REG_LINK(reserved for system)");}
if(tp==REG_MULTI_SZ){return("REG_MULTI_SZ");}
if(tp==REG_NONE){return("REG_NONE");}
if(tp==REG_QWORD){return("REG_QWORD");}
if(tp==REG_QWORD_LITTLE_ENDIAN){return("REG_QWORD_LITTLE_ENDIAN");}
if(tp==REG_SZ){return("REG_SZ");}
}

В борладнском IDE работает нормально а в вижуал студио выбивает ошибку доступа к памяти?





в принцыпи должно всё работать может тиы её неправилно исползуеш в вызывающеи функций
вот неболшои пример хоть и ламерски думаю поможет

#include <iostream>
using namespace std;

char *ft();

int main ()
{

cout<<ft()<<endl; /* !!!!!!!!!!!!!!!!!! я когда тут *ft() он выводил мине тока первую букву "H", может поетому и ошибка попробуи исползовать укозатель без * если ты ето делаеш */

system ("pause");
return 0;

}

char *ft ()
{
return ("Hello");

}


если неполучится значит ошибка гдето в сровнении
if(tp==REG_BINARY) ибо неизвестно откуда ти ето взял REG_BINARY наверное какаето гобалная переменая или константная ели нехуя ненаидеш значет не ветом куске ошибка :)

Djezul
13.06.2009, 15:36
GetUserName - получить имя пользователя. инклюдить windows.h может понадобится Advapi32.lib.

system() для взаимодействия использовать категорически не советую. максимум - system("pause"). ито лучше юзать getch и иже с ними

О спс. С этим разобрался.
А в чём ошибка тут,

int Shop(int size_of_inventory){
enum {Healing_botle=1,Power_botle=2,Intelect_botle=3,Ex it_the_shop=4};
bool shop=true;
int shop_action;
int shop_kol;
int i=0,j=0;;
int price;
system("cls");
Info("You will get to the shop soon!");
while(shop){
system("cls");
cout<<"Healing botle - 1 ||| Price - 100\nPower botle - 2 ||| Price - 300\nIntelect botle - 3 ||| Price - 300\n"
<<"---------------------------------\nExit the shop - 4\n\n";
cin>>shop_action;
switch(shop_action){
case Healing_botle:
cout<<"\nHow many?\n\n";
cin>>shop_kol;
price=100;
if(Shop_Buy(player.money,shop_kol,price)==1){
Shop_Error_Slotes(size_of_inventory,shop_kol);
player.money=player.money-(shop_kol*price);
for (i=size_of_inventory;i<10&&j<shop_kol;i++,j++,size_of_inventory++){
player.inventar[i].name=1;
player.inventar[i].bonus=player.hp+30;
}
}
i=0;
j=0;
break;
case Power_botle:
cout<<"\nHow many?\n\n";
cin>>shop_kol;
price=300;
if(Shop_Buy(player.money,shop_kol,price)==1){
Shop_Error_Slotes(size_of_inventory,shop_kol);
player.money=player.money-(shop_kol*price);
for (i=size_of_inventory;i<10&&j<shop_kol;i++,j++,size_of_inventory++){
player.inventar[i].name=2;
player.inventar[i].bonus=player.power+30;
}
}
i=0;
j=0;
break;
case Intelect_botle:
cout<<"\nHow many?\n\n";
cin>>shop_kol;
price=300;
if(Shop_Buy(player.money,shop_kol,price)==1){
Shop_Error_Slotes(size_of_inventory,shop_kol);
player.money=player.money-(shop_kol*price);
for (i=size_of_inventory;i<10&&j<shop_kol;i++,j++,size_of_inventory++){
player.inventar[i].name=3;
player.inventar[i].bonus=player.intelect+30;
}
}
i=0;
j=0;
break;
case Exit_the_shop:
shop=false;
break;
}
}
shop=true;
return size_of_inventory;
}


прототип создаю , вызываю так,
case Shop:
Shop(size_of_inventory);

break;

Компилятор выкидует с ошибкой , Ошибка 1 error C2064: результатом вычисления фрагмента не является функция, принимающая 1 аргументов c:\users\антон\documents\visual studio 2008\projects\bk\bk\bk.cpp 138

Немогу разобраться , что это за ошибка уже в мсдн втыкаю 20 минут :confused:

а и такой вопрос, как сделать рандомное число из промежутка? Доспустим, чтобы всегда бралось разное число из промежутка от 1 до 100

razb
13.06.2009, 15:54
case Shop:
В case'e не может быть ф-ции.

Djezul
13.06.2009, 16:05
как не может если у меня выше написано
case Inventary:
Inventory(size_of_inventory);
break;

и всё норм, а что тогда можно сделать? Просто позаменять на if всё?

Roston
13.06.2009, 16:09
привет всем....
надо мануал по графике в С... (<graphics.h>)
я понимаю что это оч старое.. но нуо для лабораторной работы.....
Компилятор Борланд С++ 3.0

ап

Djezul
13.06.2009, 16:09
Поменял всё на иф , таже самая ошибка!

razb
13.06.2009, 16:21
Виложи нормальный код с точным описанием ошибки!

Djezul
13.06.2009, 16:25
это и есть точный код, а описание ошибки такое какое выдаёт компилятор, скопировал полностью, компилятор висуал студио 2008

Ra$cal
13.06.2009, 16:54
Djezul
ты лучше начни с улучшения кода и ооп. то что ты щас пишешь, это по сути си стайл. если бы ты юзал ооп, вся программа уменьшилась бы раз так в 8. та даже если ты банально прекратишь копипастить код, сделаешь функции для покупки товаров, вывода инфы итп, ты уже сократишь код программы и упростишь возможности ее модификации. привыкай, что просто написать программу - мало. потом ее надо поддерживат, улучшать и исправлять.

Djezul
13.06.2009, 18:01
Я её как раз и улучшаю, поэтому и перевожу всё в функции, а ооп я не использую , так как пишу на си, сначала, хочю его выучить, а учить лучше на практике__)) , тем более название раздела си/си++ , я думал и так понятно что это си. Кстати проблему я решил, просто названия функции и константы совпадали, вот и всё))

razb
13.06.2009, 18:17
тем более название раздела си/си++ , я думал и так понятно что это си.
Достаточно взглянуть на использование потоковых классов что говорит о том что ты используешь с++. Советую перечитать книгу и понять отличия этих языков.

Djezul
13.06.2009, 18:33
Возможно ты и прав, не буду спорить так как я пока мало что в этом понимаю, но в компьютерной школе , куда я стал недавно ходить, мы учим пока си а не си++ , и там нам препод сказал делать так.

Fata1ex
13.06.2009, 18:38
razb, прав: использовать потоки в C некорректно :(

Roston
13.06.2009, 19:05
привет всем....
надо мануал по графике в С... (<graphics.h>)
я понимаю что это оч старое.. но нуо для лабораторной работы.....
Компилятор Борланд С++ 3.0

да помогите ёпт

Fata1ex
13.06.2009, 19:15
graphics.h (http://www.citforum.ru/programming/bcpp/r79_4.shtml)

razb
13.06.2009, 19:18
да помогите ёпт
Поиск заюзать не судьба?
_http://parallel.ru/docs/www.citforum.ru/programming/bcpp/r77_3.shtml

Fata1ex
13.06.2009, 19:20
razb, мы дали ссылки на один и тот же ресурс :)

Roston
13.06.2009, 22:49
а чё нить обширней нету??? мне еше надо графическую менюшку создать

razb
14.06.2009, 01:59
а чё нить обширней нету??? мне еше надо графическую менюшку создать
А что еще надо? там описание прототипов всех ф-ций библиотеки или ты хочешь готовый код на тарелочке )

_nic
15.06.2009, 15:37
Подскажите на какой строке в этой ф-ции стек повреждается

char *listds()
{
HANDLE hh=GetProcessHeap();
char buff[1024],out[1024];
void *rbuf=HeapAlloc(hh,HEAP_ZERO_MEMORY,1024*4);
void *rbuf1=HeapAlloc(hh,HEAP_ZERO_MEMORY,1024*4);
void *rbuf2=HeapAlloc(hh,HEAP_ZERO_MEMORY,1024*4);
void *rbuf3=HeapAlloc(hh,HEAP_ZERO_MEMORY,1024*4);
char *buf=(char*)rbuf;char *buf1=(char*)rbuf1;char *buf2=(char*)rbuf2;
char *buf3=(char*)rbuf3;
struct {
UINT type;
LPCSTR name;
} DTF [] = {
{ DRIVE_UNKNOWN, " (Unknown) " },
{ DRIVE_NO_ROOT_DIR, " (Invalid path) " },
{ DRIVE_REMOVABLE, " (Removable) " },
{ DRIVE_FIXED, " (Logic Volume) " },
{ DRIVE_REMOTE, " (Network drive) " },
{ DRIVE_CDROM, " (CD-ROM) " },
{ DRIVE_RAMDISK, " (RAM disk) " },
{ 0, NULL},
};
GetLogicalDriveStrings(sizeof(buff)/sizeof(char),buff);
DWORD FBA;DWORD TNOB;DWORD TNOFB;
for(int i=0; i<1024-1; i++)
if( buff[i]==0)
{
if(buff[i+1] != 0)
buff[i] =(char) 0xD;
else
break;
}strcpy(buf,buff);
for(;;)
{
strncpy(buf1,buf,3);buf+=4;
strcat(buf2,buf1);strcat(buf2,DTF[GetDriveType(buf1)].name);
if(GetVolumeInformation(buf1,0,0,0,0,0,0,0)==true)
{
GetDiskFreeSpaceEx(buf1,(PULARGE_INTEGER)&FBA,(PULARGE_INTEGER)&TNOB,(PULARGE_INTEGER)&TNOFB);
sprintf(buf3,"%d",TNOFB/(1024));strcat(buf2,"avalaible kbytes:");
strcat(buf2,buf3);strcat(buf2,"\n");
memset(buf3,NULL,1024);
}
if(GetVolumeInformation(buf1,0,0,0,0,0,0,0)!=true)
{
strcat(buf2,"<No Disk>\n");
}
if(strlen(buf)==0){break;}
}
strcpy(out,buf2);
HeapFree(hh,0,rbuf);
HeapFree(hh,0,rbuf1);
HeapFree(hh,0,rbuf2);
HeapFree(hh,0,rbuf3);
return(out);
}

0verbreaK
15.06.2009, 19:56
в дебаг вставляется _chkesp не было переполнения

kRa$I-I
15.06.2009, 20:24
Всем привет. У меня такой вопрос. Поставил себе Visual Studio 2008 Team System создаю пустой НЕ CLR проект подключаю прототипы фунций Winsock2 и он выдает целую кучу ошибок. Это я что-то не так делаю или у всех так?
Выглядит это так:
#include <windows.h>
#include <winsock2.h>

int main()
{
WSAData wsaData;
int ret = WSAStartup(MAKEWORD(1,1), &wsaData);
if(ret == SOCKET_ERROR) ExitProcess(0);
SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(s==0) ExitProcess(0);

.........................
Sleep(3000);
return 0;
}
Причем ошибки как я понял в заголовочном файле.....приводить их не буду их 68 шт.

Вопрос №2
Как убрать консольное окошечко которое выскакивает при каждом запуске приложения........
Заранее спасибо за ответы.

mr.The
15.06.2009, 21:33
есть две переменные
char *first="Text";
char second[255];

как присвоить переменной second значение переменной first?
компилятор ругается на "invalid conversion from `char*' to `char'"

Ra$cal
15.06.2009, 21:46
mr.The
strcpy(second, first);

kRa$I-I
15.06.2009, 21:52
to mr.The
Первая переменная есть указатель на область памяти в 1 байт, выделенная под переменную типа char. Делая так char *first = "Text" - ты успешно записываешь в место адреса "Te"(2 байта)
Вторая переменная - массив из 255 элементов.
Я думаю правильно так
char first[5]= "Text";
char second[255];
for(int i=0; i<5; i++)
{ second[i]=first[i];
cout << second[i];
}

fker
15.06.2009, 22:30
Первая переменная есть указатель на область памяти в 1 байт, выделенная под переменную типа char. Делая так char *first = "Text" - ты успешно записываешь в место адреса "Te"(2 байта)
По моему бред. первое объявление есть указатель на массив символов, заранее неопределенной длины, инициализируя указатель он какбэ объявляет что этот массив будет размером 4байта+'\0' точнее слово "Text"

char first[5]= "Text";
char second[255];
for(int i=0; i<5; i++)
{ second[i]=first[i];
cout << second[i];
}

а если нам нужно работать со строкой не посимвольно? например вывеси ее сразу :
printf("%s",second);
а она будет до этого заполлнена, выведутся - TextXXXXXX X-символы которыми была до этого заполнена.
Самый нормальный вариант имхо, использовать, как уже говорили выше - strcpy из string.h

mr.The
15.06.2009, 22:51
strcpy(second, first);
спс.
kRa$I-I, твой вариант работает, но этот короче и быстрее.
strcpy из string.h
эта либа автоматом подключается? оно и без неё скомпилилось)

UPD: посоветуйте хороший отладчик. немогу баг словить..

razb
16.06.2009, 01:21
UPD: посоветуйте хороший отладчик. немогу баг словить..
gdb

Ra$cal
16.06.2009, 02:42
ollydbg =)

slesh
16.06.2009, 09:20
syser *CRAZY*

metaldisc
16.06.2009, 20:57
del

metaldisc
16.06.2009, 21:09
каждый хитрый мазахист между про чем ананист, ну прям как slesh

..::Hollywood::..
18.06.2009, 23:52
вот для сетевого программирования в Delphi рекомендуется изучать winsock , а в с++ что поучить по сетевому программированию?или без разницы?спасибо

Fata1ex
19.06.2009, 00:23
Winsock. Wininet.

--StraNger--
19.06.2009, 07:00
рекомендую winsock
как для Delphi так и для с++ функции одинаковые
библиотека довольна распространена, в сети есть много информации и исходников

Roston
19.06.2009, 08:43
привет всем... не подскажете почему виснет графический режим в дос... сначала думал что выхожу за пределы екрана... потом пробовал самое елементарное то всё равно ДОС режим повисал... кто укажет причину????

Fata1ex
19.06.2009, 10:09
Экстрасенсов тут нет, к сожалению. Приведи код.

Roston
19.06.2009, 10:39
да то не изза кода... я проверял на других компах всё гут... а на ноуте какие то траблы.... вот даже такую елементарную задачу при компиляции повисает

#include<stdio.h>
#include<dos.h>
#include<conio.h>
#include<stdlib.h>
#include<graphics.h>
#include<string.h>
void myprint (int X, int Y,int shadow, int color, int size, char *text);
int main()
{
int c,color,X,Y,shadow,style,size;
char *text;
char a;
int gdriver=DETECT, gmode, errorcode;
initgraph(&gdriver,&gmode, "");
errorcode=graphresult();
if(errorcode!=grOk)
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
getch();
return (0);
}
printf("Hi, enter coordinates(X,Y) where will be our text\n");
scanf("%d,%d",&X,&Y);
printf("Do you want shadow?(y/n)\n");
scanf("\n%c",&a);
if (a=='y')
c=1;
else
{
if (a=='n')
c=0;
else
{
printf("Error, as default shadow won't use\n");
c=0;
}
}
printf("Enter size(0-3)\n");
scanf("%d",&size);

printf("\nAt last enter your text\n");
scanf("%s\n",text);
color=4;
cleardevice();
myprint(X,Y,c,color,size,text);
getch();
closegraph();
return 0;
}
void myprint(int X, int Y,int shadow, int color, int size, char *text)
{
settextstyle(0,0,size);
setcolor(7);
outtextxy(X+shadow,Y-shadow,text);
setcolor(color);
outtextxy(X,Y,text);
}

slesh
19.06.2009, 10:50
Это всё глюки и настройки эмулятора доса в винде.
Хз покаким причинам, но иногда он вообще с того нессего перестаёт работать (
Запускай такие проги под эмулятором какимнить другим. DosBox тебе в помошь.

..::Hollywood::..
19.06.2009, 12:41
Вот скажите пожалуйста почему при присваивании переменной множества двух других (извините за скудословие,пока не вник во все ньюансы) типа
unsigned short int Area = (Width * Length)
мы Width и Length заключаем в скобки а при использовании псевдонима typedef unsigned short int USHORE ;
мы не закрываем в скобки
USHORE Area= Width * Length ????
есть ли разница или нет?
и еще \n и endl это ведь одинаковые вещи ?обе они означают разрыв строки?(спрашиваю последнее потому , что в книге идет в первой строчке \n , а потом endl в двух других,и написано обратить внимание на это.везде поставил \n и все работает,глупость автора?)
спасибо

razb
19.06.2009, 13:40
Вот скажите пожалуйста почему при присваивании переменной множества двух других (извините за скудословие,пока не вник во все ньюансы) типа
unsigned short int Area = (Width * Length)
мы Width и Length заключаем в скобки а при использовании псевдонима typedef unsigned short int USHORE ;
мы не закрываем в скобки
USHORE Area= Width * Length ????
есть ли разница или нет?
В этом случае скобки можно опустить тк у оператора присваивания приоритет низший нежели у оператора умножение.
и еще \n и endl это ведь одинаковые вещи ?обе они означают разрыв строки?(спрашиваю последнее потому , что в книге идет в первой строчке \n , а потом endl в двух других,и написано обратить внимание на это.везде поставил \n и все работает,глупость автора?)
спасибо
\n означает только перевод строки, а endl еще и очищение потока, хотя \n компиляторами расматривается тоже как очищение потока хотя это и не стандартизировано(вообще не уверен, но вроде так)

..::Hollywood::..
19.06.2009, 14:04
razb вот нарыл.
символ /n это символ форматирования , который указывает объекту cout на необходимость вывода на экран символа новой строки
endl этот оператор так же выводит на экран символ разрыва строки (джесс либерти Cpp за 21 день)
___________________________
и еще,псевдониму можно присваивать любое имя или исключительно исходя из типа переменной и ключевого слова?спасибо

Fata1ex
19.06.2009, 21:16
Любое кроме зарезервированных.

..::Hollywood::..
19.06.2009, 23:21
они же Ключевые слова? while , main , if , for ?

razb
19.06.2009, 23:22
endl этот оператор так же выводит на экран символ разрыва строки
Он также дает команду отправки данных с потока на устройство в\в. Вот тут обсуждение, если интересно можешь почитать
http://www.velocityreviews.com/forums/t284212-quotendl-and-quotnquot.html

они же Ключевые слова? while , main , if , for ?
да.

Roston
21.06.2009, 00:14
опять же тот же граф. режим

Подкажите как мне преобразовать такое

char present[]={"Made by Roston"};

что бы я мог использовать его в цикле в функции outtextxy
ну тобишь я буду выводить по одной букве...
типо

for(i=0;i<n;i++)
outtext(150,150,present[i]);

но переменную оно выводить не хочет

slesh
21.06.2009, 12:15
outtext(150,150,
ты же всё время выводишь в одну и ту же позицию o_O
т.е. тебе еще нужно позицию по Y передвигать

Roston
21.06.2009, 14:08
так оно бы хотя бы выводила букву на букве... а пишет что типо невозможно преобразовать....

Ra$cal
21.06.2009, 16:28
ну есть подозрение что выводить оно должно char*, а ты передаешь char. наверняка ждется строка с нулевым терминатором на конце. вот и сделай функцию char_to_str, которая в массив из двух байт будет сувать букву по 0 индексу и '\0' по первому.
зы: какие именно параметры хавает outtext яхз, поэтому если не угадал - сори.

Roston
21.06.2009, 18:05
всё разобралсо... надо через буфер

char buf[2];
for(i=0; i<n; i++)
{
buf[0] = present[i];
buf[1] = 0;
outtext(150,150,buf);
}p

Ant1b10t1k
21.06.2009, 18:41
Мне нужно брать с файла 3.тхт пока он не будет окончен а с остальных брать по строке, и если дошло до конца брать сначала и так пока файл 3.тхт не будет окончен.


ifstream fin( "1.txt" );
ifstream fim( "2.txt" );
ifstream fib( "3.txt" );

string mlstr;
string mainstr;
string str_name;

do
{
getline( fib, str_name );
getline( fin, mainstr );
getline( fim, malstr );

somefunction(str_name, mainstr, malstr);
}

while(!fib.eof() &&!fin.eof() &&!fim.eof());

Ra$cal
21.06.2009, 18:56
всё разобралсо... надо через буфер
похоже у меня есть зачатки телепатических способностей. нада будет попробовать тазик воды зарядить.

Ra$cal
21.06.2009, 20:50
Ant1b10t1k

типа такого

void cycle_input(ifstream& file)
{
if(file.eof())
file.seekg(0, ios_base::beg);
}

void main()
{

ifstream fin( "1.txt" );
ifstream fim( "2.txt" );
ifstream fib( "3.txt" );

string mlstr;
string mainstr;
string str_name;

do
{
getline( fib, str_name );

getline( fin, mainstr );
cycle_input(fin);

getline( fim, malstr );
cycle_input(fim);

somefunction(str_name, mainstr, malstr);
}
while(!fib.eof());
}

Ant1b10t1k
21.06.2009, 22:25
не вышло что то у меня, вот отрвок. кода что сдесь не так. Напомню мне нужно брать с файла потока(fib) пока он не будет окончен а с остальных брать по строке, и если дошло до конца брать сначала и так пока файл поток (fib) не будет окончен.


void cycle_input(ifstream& file)
{
if(file.eof())
file.seekg(0, ios_base::beg);
}


do
{
cycle_input(fin);
cycle_input(fim);
cycle_input(fit);
cycle_input(fite);
cycle_input(file);

getline( fib, str_1 );
getline( fin, mainstr );
getline( fim, mailstr );
getline( fit, str_themes);
getline( fite, str_text );
getline (file,str_name);


size_t pos = mainstr.find( ';' );
size_t pos2 = mainstr.find( '\0' );
size_t pos3 = mailstr.find(';');
size_t pos4 = str_1.find('\0');
size_t pos5 = str_themes.find('\0');
size_t pos6 = str_text.find('\0');
size_t pos7 = str_name.find('\0');
if ( pos !=string::npos )
{

string strlog = mainstr.substr( 0, pos);
string strp1 = mainstr.substr(pos+1,pos2);
string strm2 = mailstr.substr(0,pos3);
string m3 = str_base.substr(0,pos4);
string themes = str_themes.substr(0, pos5);
string text = str_text.substr(0, pos6);
string name=str_name.substr(0, pos7);

sendbuffer(strlog,strp1,strm2, m3, themes, text, name);

}
}

while(!fib.eof());

Ra$cal
22.06.2009, 02:34
мда. file.seekg(0, ios_base::beg); работает только при чтении файла, открытого с можификатором binary. чтото как то потоки ввода ацки кривые и я не вижу адекватного способа сбросить указатель чтения на начало файла. попробуй закрыть открыть. или просто юзай другой способ чтения

через жопу но работает.
void cycle_input(ifstream& file, string& filename)
{
if(!file.eof())
return;

file.close();
file.clear();

file.open(filename.c_str(), ios::in);

}

void main()
{

string fin_filename = "1.txt";
string fim_filename = "2.txt";
string fib_filename = "3.txt";

ifstream fin(fin_filename.c_str() );
ifstream fim( fim_filename.c_str() );
ifstream fib( fib_filename.c_str() );

string mlstr;
string mainstr;
string str_name;

do
{
getline( fib, str_name );

cycle_input(fin, fin_filename);
getline( fin, mainstr );

cycle_input(fim, fim_filename);
getline( fim, mlstr );
}
while(!fib.eof());

system("pause");
}

razb
22.06.2009, 18:45
Такой вопрос:
Существует ли в языке С++ команда которая полностью очищает содержимое файла
не удаляя сам файл ?
Нет, по крайней мере в стандартной библиотеке.

Fata1ex
22.06.2009, 19:47
WinMain(), вопрос был: есть ли такая функция в стандарте языка.

Useroff
23.06.2009, 07:31
Короче, проблемма вот в чем.
Есть цикл for(;;), в нем находится вся программа, так же есть переменная live.
Если она ровняется 1, то выполняется одно действие, если 2, то другое, если 3, то
break;

А если ввести другие знаки, кроме цифр, то получится так, что for(;;) будет работать безконечно.

Подскажите, как профиксеть ?

Fata1ex
23.06.2009, 07:47
Напиши код. Я нифига не понял ^^
Возможно тебе поможет оператор case и использование default.
Откуда взялся while, если цикл for. Или цикл просто бесконечный.

Вообщем насколько я понял так:

while(1) {
switch( ) {

case 0:

case 1:

...

case N:

default:

}}

Любые действия со стороны юзера ты можешь контролировать. Или же ты можешь ввести обработку исключений.

Useroff
23.06.2009, 08:25
Ладн, задам вопрос вот так:
Есть переменная live


for(;;) {
float live

cin >> live;
if (live==1)
{
Код...
}
if (live==2)
{
Код...
}
if (live=3)
{
cout << "Bye !";
break;
}
}


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

Fata1ex
23.06.2009, 08:33
Ответ я, как ни странно, уже дал.

Useroff
23.06.2009, 08:43
Ответ я, как ни странно, уже дал.
Сорри, стормазил я чет, совсем забыл про else.
Терь написал
else
break;

Fata1ex
23.06.2009, 08:44
Использование такого огромного количества условных операций не есть хорошо. Для таких случаев и придумали оператор множественного выбора. Используй его.

Fata1ex
23.06.2009, 10:55
exit(1);break;
оО
+ разве я не то же самое написал парой постов выше? ) Зачем писать одно и тоже?

ss88
23.06.2009, 11:35
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <windows.h>
typedef struct
{char JMPCODE[3]; //JMP на код завантажника
char OS[8]; //назва ОС, під якою форматировалсядиск
uint16_t bpersect; //Байт у секторі
unsigned char secperclust; //Секторів у кластері
uint16_t reservsect; //У зарезервованих секторів
unsigned char numFAT;
} boot_t;

int main(int argc, char ** argv){
char * disk_name = "\\\\.\\PhysicalDrive1";
boot_t boot;
HANDLE h_disk=CreateFile(disk_name,GENERIC_READ,FILE_SHAR E_READ | FILE_SHARE_WRITE,NULL, OPEN_EXISTING, 0, NULL);
uint32_t read;
if(h_disk != INVALID_HANDLE_VALUE)
printf("the %s successfully opened\n", disk_name);
printf("%d\n",GetLastError());
if(ReadFile(h_disk,buf,10,&r,NULL))
printf("The start of boot block successfully read\n");
printf("%d\n",GetLastError());
CloseHandle(h_disk);
exit(EXIT_SUCCESS);
}

проблема состоит в том, что устройство оно открывает, а вот считывание не проходит и последней ошибкой является ошибка №87 - неправильный параметр, можете подскажите, что я тут неправильно сделал?

ss88
23.06.2009, 12:50
До самого дошло, что не так... Пипец, ненавижу иногда свою невнимательность.... ведь секторами-то читать надо, а не байтами )))

.::f-duck::.
23.06.2009, 15:25
Что лучше? C++ или C#
И в каком плане лучше?

Fata1ex
23.06.2009, 15:30
Зависит от того, что ты хочешь получить. Что же?
Каждый оптимален в своей области.


http://ru.wikipedia.org/wiki/%D0%A1%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D 0%B5_%D1%8F%D0%B7%D1%8B%D0%BA%D0%BE%D0%B2_%D0%BF%D 1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1% 80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F

http://www.imho.ws/archive/index.php?t-86747.html

http://www.cyberforum.ru/programming-theory/thread12269.html

http://www.nuclex.org/pages/csharp-vs-cxx-performance


ps Это я нашел буквально за 2 минуты юзания гугла. Учимся использовать поиск :(

_nic
23.06.2009, 16:43
А можно из нескольких потоков работать с одним и тем жем указателем от ф-ции CreateFile ?

razb
23.06.2009, 17:30
А можно из нескольких потоков работать с одним и тем жем указателем от ф-ции CreateFile ?
Можно, только необходимо использовать мьютексы, условные переменные, etc. для предотвращения повреждения данных при одновременном обращении нескольких потоков.

Ra$cal
23.06.2009, 20:35
юзай параметр overlapped в функциях WriteFile и ReadFile. иначе добиться адекватной работы при многопоточности будет очень сложно.

mixkorshun
23.06.2009, 22:15
ПЛЗ! срочно..
подскажите как в c++ удалить указатель(LPVOID void*), размер котрого cbSize
void FIFOList::DeleteItem(LPVOID pItem){
delete pItem;
}
void FIFOList::DeleteItem(LPVOID pItem){
char* pTemp;
pTemp = (char*)pItem;
delete[szSize] pTemp;
}
эти варианты у меня не прошли( первый то ясно, а второй доработать вроде как недолго уже..

Ra$cal
24.06.2009, 00:23
господи руки бы за такое отрывать. вроде делаешь на с++, но зачем же LPVOID то? Для этого делаешь абстрактный класс, если нада хранить элементы разных типов, и делаешь конкретный класс, наследованный от базового.
а по поводу удаления - на сколько помню при выделении памяти в самой куче хранится информация о размере блока памяти, поэтому не пытайся наипать систему. делай делит для указателя и все. есесно это не проканает с двумерными (и более) массивами и получишь реки утекшей памяти.

mixkorshun
24.06.2009, 00:40
Ra$cal
не умничай! я спрашивал как мне прогу по другому прогу реализовать?!! реализуй мне без этого список с элементами переменной длины!! а?! вот по этому мне надо удалять длину n-го кол-ва байт, а вопрос в топ для новичков размещен только из за того что он по синтаксису! не надо учить меня структурам и.т.п. я тож не мало знаю

Ra$cal
24.06.2009, 01:26
нужна переменная длина - сделай класс-контейнер, который хранит указатель на блок памяти и длину блока. перегрузи оператор [] и *. но на чистом lpvoid ты ничего не сделаешь, кроме утечек памяти и гемора с отладкой.
зы: еще раз говорю, размер блока памяти хранится в куче. нельзя удалить лишь часть блока. только delete p;
запись delete [x] p; применима только в одном случае - если до этого был код p[x] = new blablabla; остальные вариации в лучшем случае или удалят весь блок или вообще ниче не удалят, а в худшем покоцают кучу и рано или поздно получишь необрабатываемую ошибку и падение программы.

mixkorshun
24.06.2009, 02:01
Ra$cal
смотри, сделана структура в которой 2указателя(на пред и след эл-т), и размер буфера данных, выделяю память под весь блок вместе сданными, расставляю указатели и копирую данные, но при этом этот выделенный блок не канает под структуру, только при преобразовании жестком(т.е. наложении), когда я удаляю эл-т то мне нужно этот эл-т удалить, зная адресс, размер...

Ra$cal
24.06.2009, 02:25
struct item{
item* next;
item* prev;
LPVOID data;
int size;
};

выделять память под это добро так

item new_item = new item;
new_item.data = (LPVOID) new char[20];
new_item.size = 20;

удалять вроде сначала с data(хотя уже не помню, ибо оч давно не юзаю чистые указатели для таких целей, но вроде рекурсивно вызываться не будет удаление для всех полей структуры, только не задашь деструктор и в нем сделаешь освобождение памяти)

delete [] new_item.data;
delete new_item;

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

mixkorshun
24.06.2009, 02:44
Ra$cal
мой код ИМХО корявый, т.к. на скорости, он выделяет память под все, накладывает структуру на начало, а данные копирует memcpy в конец... тоже работает, но удаляет с повреждением кучи... ИМХО данные рядом со структурой удобнее

Ra$cal
24.06.2009, 02:50
угу. запаришься отлаживать. юзай обычные решения. под скорость всегда проще и быстрее оптимизировать более простой код, нежели страшный но быстрый код привести к рабочему состоянию(не говоря про дальнейшую поддержку и исправление багов).

bug1z
27.06.2009, 23:06
РЕ адепты!
помагайте!
накопилась несколько вопросов по С++
1)Какой ф-ей можно удалить скрытый в системе файл?
писал:

#include <fstream>
#include <iostream>
#include < windows.h >
using namespace std;
int main()
{
DeleteFileA("C:\\boot.ini");
}

но не пашет..
2) Дайте плз линку на хорошую статью по прботе с файлами в С++
3) у меня в книге (С++ за 21 день) описано программирование под консоль, всё ок..но на сколько сложнее писать оконные приложения?
4) где читать о работе с соетами на С++?
Зарание спасибо!

BrainDeaD
27.06.2009, 23:09
3)с правильными инструментами не составляет большой сложности.

Fata1ex
27.06.2009, 23:11
MSDN + GOOGLE творят чудеса!

bug1z
27.06.2009, 23:13
2BrainDeaD
О каких инструментах идёт речь?
О редакторе ресурсов?
2Fata1ex
вот только не надо меня к гуглу посылать..если бы я нашол ответы на свои вопросы то я б явно не постил их здесь!

BrainDeaD
27.06.2009, 23:19
2BrainDeaD
О каких инструментах идёт речь?
О редакторе ресурсов?
Qt4 или арсенал Visual Studio

1)чтоб убить скрытый файл нужно сначала поменять его аттрибут на нескрытый, а потом удалять.
инфа здесь (http://msdn.microsoft.com/en-us/library/aa365522(VS.85).aspx)

Ra$cal
28.06.2009, 00:11
Qt4 для новичка будет сложновато. Хотя и лучше чем mfc. но советую все таки начать с мфц.

razb
28.06.2009, 01:27
Qt4 для новичка будет сложновато. Хотя и лучше чем mfc. но советую все таки начать с мфц.
Ну мой совет будет с точностью наоборот )
mfc очень неудобен в плане написание приложений да и вообще он уже умер (с) =) уж лучше юзать wtl. После перехода с mfc на Qt, сразу видно его преимущества в простоте иерархии всех его классов и взаимодействия обьектов. Ну это все имхо и доказывать тру mfc кодерам не буду ))

Вообще следует попробывать и одно и другое и сделать для себя выводы )

Ra$cal
28.06.2009, 01:36
дык я и не советую юзать мфц в жизни =) просто для понимания, что оно такое, стоит попробовать. но для повседневного юзанья да - он умер и причем давно. любой аналог будет удобнее и более гибким.

_nic
29.06.2009, 09:03
Как по пути к дисковому устройству ,например - "\Device\CdRom0", определить имя диска этого устройства?

_antony
29.06.2009, 11:44
Как по пути к дисковому устройству ,например - "\Device\CdRom0", определить имя диска этого устройства?
если в ринг0 то при помощи IoVolumeDeviceToDosName().


NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject , IN PUNICODE_STRING RegistryPath )
{
NTSTATUS ns;
PFILE_OBJECT pFileObject;
PDEVICE_OBJECT pDev;
UNICODE_STRING usDiskName;
UNICODE_STRING usLinkName;


RtlInitUnicodeString( &usDiskName , L"\\Device\\CdRom0" );

ns = IoGetDeviceObjectPointer( &usDiskName , FILE_ALL_ACCESS , &pFileObject , &pDev );

if( !NT_SUCCESS(ns) )
{
KdPrint(("IoGetDeviceObjectPointer failed with status : %08X\n" , ns ));
goto _end;
}

ns = IoVolumeDeviceToDosName( pDev , &usLinkName );

if( !NT_SUCCESS(ns) )
{
KdPrint(("IoVolumeDeviceToDosName failed with status : %08X\n" , ns ));
goto _end;
}

KdPrint(("Symbolick link is :%ws \n" , usLinkName.Buffer ));

_end:
return ns;
}


если в юзермоде то.
имя диска G - это символьная ссылка на объект устройства \Device\CdRom0 например.
Все символьные ссылки расположены в каталоге \??.
Следовательно можно пройтись по каталогу ( NtOpenDirectoryObject , NtQueryDirectoryObject ) и получить всю необходимую информацию о символьной ссылке ( NtOpenSymbolicLinkObject , NtQuerySymbolicLinkObject ).

NtOpenSymbolicLinkObject - http://msdn.microsoft.com/en-us/library/bb470236(VS.85).aspx

NtQuerySymbolicLinkObject - http://msdn.microsoft.com/en-us/library/bb470241(VS.85).aspx

И если поможет я тут выкладывал в теме свою утилиту для просмотра символьных ссылок.

http://sav1or.name/images/symlinks.JPG

Надеюсь помог , удачи!

_nic
29.06.2009, 12:10
Я несовсем понял что это за католог такой \?? Чем его открывать?

slesh
29.06.2009, 12:47
А вообще можно методом тыка перебрать все диски и у знать их девайсы. Для этого есть апишка специальная

char data[256];
char disk[]="A:";
for (int i='A'; i<='Z'; i++)
{
disk[0] = i;
QueryDosDeviceA(disk, data, 256);
printf("%c: - %s\n", i, data);
}

_antony
29.06.2009, 12:48
Я несовсем понял что это за католог такой \?? Чем его открывать?


#include<stdio.h>
#include<windows.h>
#include"ntdll.h"

#pragma comment ( lib , "ntdll.lib" )

int main( int argc , char*argv[] )
{
NTSTATUS ns;
HANDLE hDirectory;
UNICODE_STRING usDirectoryName;
OBJECT_ATTRIBUTES oa;

RtlInitUnicodeString( &usDirectoryName , L"\\GLOBAL??" ); // windows 2000 - \??

InitializeObjectAttributes( &oa , &usDirectoryName , OBJ_CASE_INSENSITIVE , NULL , NULL );

ns = NtOpenDirectoryObject( &hDirectory , DIRECTORY_QUERY | DIRECTORY_TRAVERSE , &oa );

if( !NT_SUCCESS(ns) )
{
printf("NtOpenDirectoryObject failed with status : %08X\n" , ns );
return -1;
}
CloseHandle( hDirectory );
return 0;
}



А вообще если , что-то тут не понятно лучше обратитесь к Руссиновичу глава 3 , Диспетчер Обьектов.

slesh
29.06.2009, 13:05
мой код можно замодить вот до такого состояния:

UCHAR GetDiskByDevice(char * device)
{
char data[256];
char disk[]="A:";
for (int i='A'; i<='Z'; i++)
{
disk[0] = i;
QueryDosDeviceA(disk, data, 256);
if (!strcmp(data,device)) return i;
}
return 0;
}
int main(int argc, char* argv[])
{
UCHAR disk;
disk = GetDiskByDevice("\\Device\\CdRom1");
printf("%c\n",disk);
return 0;
}


Даешь имя устройства, а получаешь букву диска. Или 0 если не найдено

razb
30.06.2009, 01:43
Через чего удобнее и правильнее работать с файлами ?
Нашёл много способов интересует какие лучше использовать...
Можешь более конкретизировать вопрос?
Используй стандартные средства работы с файлами.