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

Велемир
12.08.2009, 22:07
result=add_values (1, 2); - в воздухе подвис, да и тип не указан, ты б в мейн засунул его что ли.
Вдобавок какая то из букв 'а' написана не на англ...

А нафига там тип указывать ещё раз,если уже указан ?

Велемир
12.08.2009, 22:09
Line 2: error: stray '\320' in program
compilation terminated due to -Wfatal-errors.


***

fker
12.08.2009, 22:12
буквы тогда убери,
если описываешь ф-ю после main, нужно после инклудов писать прототип ф-ии
попробуй вместо
int add_values (int а, int b) ;
написать
int add_values (int, int) ;
А нафига там тип указывать ещё раз,если уже указан ?
Советую покурить - Область действия переменных;
Все вопросы, которые сейчас задаешь, есть на первых страницах практически любых книг по С.

horlyk
12.08.2009, 22:15
#include <iostream>
using namespace std;
int add_values (int, int) ;
void main()
{
cout << add_values (1, 2) << endl;
}
int add_values (int a, int b)
{
return (a+b);
}

Это 100% заработает. Кста, про русскую букву были правы :)

Велемир
12.08.2009, 22:17
Та же ошибка,епт................ща разъебу все эти компили нахрен.

http://codepad.org/8H092bcO

horlyk
12.08.2009, 22:17
Ты вообще каким компилятором пользуешься?

З.Ы.

Забей на эту херню - юзай нормальный компилятор!

Велемир
12.08.2009, 22:20
#include <iostream.h>

int add_values (int a, int b)

{
return (a+ b);
}

int main ()

{
cout << " 100 + 200 = " << add_values(100, 200) << endl;
cout << " 500 + 501 = " << add_values(500, 501) << endl ;
cout << "-1 + 1 = " << add_values(-1, 1) << endl;
}


Этот-то пример работает.... а чем отличается,не пойму.

Велемир
12.08.2009, 22:21
В том-то и дело,что не могу поставить НОРМАЛЬНЫЙ компилятор.То гребаный фрйморк нужен,уже 3 штуки переставил,ему пох.Dev-c++ вообще отказывается компилить...ппц

horlyk
12.08.2009, 22:23
#include <iostream>
using namespace std;
int add_values (int, int) ;
int main()
{
cout << add_values (1, 2) << endl;
return 0;
}
int add_values (int a, int b)
{
return (a+b);
}


Это уже там работает)

Велемир
12.08.2009, 22:23
Я так понял,алгоритм такой:

1) Описание функции за пределами функции main().
2) Использование описанной функции в main()

По мне так всё логично,на РНР оч похоже.

Велемир
12.08.2009, 22:23
Это уже там работает)

А зачем пространство имён юзать,когда и так работает ?

ЗЫ: Так и не понял,в чём была ошибка.Буквы `а` все поправил.

horlyk
12.08.2009, 22:30
А зачем пространство имён юзать,когда и так работает ?

ЗЫ: Так и не понял,в чём была ошибка.Буквы `а` все поправил.

1. Не используй боян - скачай нормальный компилятор и отпадут подобного рода вопросы :)
Вообще, не все компиляторы разрешают юзать cin\cout и т.д. без std::. Следовательно, дабы не писать больше кода - используют пространство имен. Тут видимо не нужно. И вообще, я впервые вижу, чтобы с типом int у мейна не было обязательного возврата значения оО.

2. Я когда код твой скопировал чтоб редачить - мой компилятор выругался на одну из буков а, я ее заменил английской и все заработало.

Велемир
12.08.2009, 22:33
гг))) круть.А что та ошибка значит ? Хмм...Ну,хоть что-то на сегодня я понял: в main() нужно обязательно возвращать значения.

horlyk
12.08.2009, 22:35
Там получается, что void, как возвращаемое значение ф-и main() не допустимо, потому и кидало ошибку.

в main() нужно обязательно возвращать значения.
С типом int - да, с void не нужно)

Ra$cal
12.08.2009, 22:50
может книжки почитаешь? это не пхп. тут методом тыка не получится писать. слишком много нюансов. уж лучше смотреть в сторону сишарпа с таким подходом.

horlyk
12.08.2009, 22:53
Вспоминается как наш препод говорил "Не ломитесь с криком БАНЗАЙ! дальше, пока не освоите то, перед чем его кричите")

З.Ы. Ra$cal прав на 100%

Велемир
12.08.2009, 23:41
может книжки почитаешь? это не пхп. тут методом тыка не получится писать. слишком много нюансов. уж лучше смотреть в сторону сишарпа с таким подходом.

Интересно,а я что делаю ? Просто мне многогго не понять.Вот и задаю вопросы.Кстати,форум для этого и предназначен,не так ли ? не знаю,как тут остальные,считающие меня каким-то полоумным кретином с кучей невнятноразделённых вопросов,но я иначе не могу,уж извини.

Ra$cal
12.08.2009, 23:51
ну если ты пролистаешь страниц этак цать назад то увидишь, что тому же horlyk'у я подробно отвечал на вопросы. Но по его вопросам видно было, что он читает чтото. А у тебя вопросы, которые в первой главе любой книги разжёвываются. Поэтому и возникла идея, что ты решил все вопросы задавать нам, вместо изучения книг и уточнения непоняток тут.

horlyk
12.08.2009, 23:52
Ну мне тоже писали в принципе чтоб я книги читал :), ток у мну вопросы совсем другие были и я потом понял что хотел сделать то, что не поддается ни одному здравому объяснению). Просто понимаешь, разница в том, что это самые азы, которые в любой книге подробно описываются. Никто же не запрещает задавать вопросы, да и не один человек тебе пример писал + советы :)

Lee_fx
13.08.2009, 11:09
Доброго времени суток, подскажите как сохранить число, больше 32 бит, в двух переменных и соответственно потом его прочитать из них.

char num[] = "4294967295000";
unsigned int a[2];

razb
13.08.2009, 12:40
2 Lee_fx
long что ли уже отменили?

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

Kaimi
13.08.2009, 12:54
long что ли уже отменили?

А мне вот студия говорит что размер int и long одинаков (

Lee_fx
13.08.2009, 13:24
А если число будет больше 64 бит? оно даже в long long не уместится, хочется его "разгрузить" по 32-х битным переменным. По идее ведь это возможно. Хотелось бы на моем примере посмотреть как.

razb
13.08.2009, 14:14
Можно воспользоваться сторонним классом, подробности тут _http://www.gidforums.com/t-17248.html

Lee_fx
13.08.2009, 14:49
Блин, мне самому интересно как это реализовывается, таких классов полно, в исходниках фиг разберешься, вот и спрашиваю тут)
Хотелось бы алгоритм хотя бы на словах.

Ra$cal
13.08.2009, 16:20
гугл отменили? ссылка прямо на античат

тыц (http://forum.antichat.ru/nextoldesttothread50394.html)
тыц два (http://algolist.manual.ru/maths/long.zip)

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

Feksess
13.08.2009, 17:22
Какие команды для торможения програмы есть кроме system("PAUSE")в компиляторе Dev c++?

Ra$cal
13.08.2009, 17:26
как таковых команд нету в с++. это вызов системной функции типа. вообще останавливают вызовом getch или cin.

Feksess
13.08.2009, 17:28
как таковых команд нету в с++. это вызов системной функции типа. вообще останавливают вызовом getch или cin.
СПС=)

Feksess
14.08.2009, 13:24
как таковых команд нету в с++. это вызов системной функции типа. вообще останавливают вызовом getch или cin.
Как именно оно пишетса?Я просто только начал и не знаю
(

razb
14.08.2009, 13:25
Как именно оно пишетса?Я просто только начал и не знаю
(
std::cin.get();
getch();

Feksess
14.08.2009, 14:07
std::cin.get();
getch();
Спс)

DauR
14.08.2009, 20:35
Здравствуйте можете сказать почему не компилируется?
// vivodit raznosvetnyi text
#include<conio.h>
void main() {
clrscr();
textcolor(RED);
cprintf("Kajdi \n\r");
textcolor(LIGHTRED); // oranjevyi zamenim alym
cprintf("ohotnik \n\r");
textcolor(YELLOW);
cprintf("jelaet \n\r");
textcolor(GREEN);
cprintf("znat' \n\r");
textcolor(LIGHTBLUE);
cprintf("gde \n\r");
textcolor(BLUE);
cprintf("sidyat \n\r");
textcolor(MAGENTA);
cprintf("fazani!\n\r");
textcolor(LIGHTRAY);
cprintf("\nDl9 zaverweni9 najmite <ENTER>");
getch();
}

Glazz
14.08.2009, 21:37
а что, в консоли можно цвет изменять? там ведь два цвета - черный и белый. Какую ошибку то пишет?

Ins3t
14.08.2009, 21:44
2Glazz, можно.
Вот простейший пример:

#include <iostream.h>
#include <stdlib.h>
#include <windows.h>
int main()
{
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
for(unsigned c1=0; c1<=0xF; c1++)
for(unsigned c2=0; c2<=0xF; c2++){
unsigned color=c2+(c1<<4);
SetConsoleTextAttribute(hConsole, color);
cout<<"bgColor: "<<c1<<" textColor: "<<c2<<" Color: "<<hex<<color<<endl;
};
system("PAUSE");
return 0;
}

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

horlyk
14.08.2009, 22:07
А есть где-то весь перечень встроенных команд консольки? А то я чет гуглил и не нашел, мож просто плохо гуглил...

.ATK
14.08.2009, 22:07
help ??

horlyk
14.08.2009, 22:18
Умно, а там что искать? Команду system() вообще не находит.

Ra$cal
14.08.2009, 22:24
для вендов (http://msdn.microsoft.com/en-us/library/ms682073%28VS.85%29.aspx)

horlyk
14.08.2009, 22:28
Опа, оно! пасиб)

Lee_fx
14.08.2009, 23:35
гугл отменили? ссылка прямо на античат

тыц (http://forum.antichat.ru/nextoldesttothread50394.html)
тыц два (http://algolist.manual.ru/maths/long.zip)

ps: что за мода просить пересказывать на форумах то, что можно самому почитать, но влом. этой теме много статей посвящено, а ты хочешь все до одного поста ужать и выдавить из посетителей. если не понятно - значит или рано, или не особо надо. читай до просветления кароч. будут вопросы конкретные - задавай.
Очень познавательно, но, если не заметно, я модно спрашивал о другом. Вопрос в том можно ли разместить, к примеру, 50-ти битное число в нескольких переменных меньшего размера ( как пример в двух unsigned int ), если учитывать что число представлено строкой.

Ra$cal
14.08.2009, 23:45
ну а ты пробовал читать эти ссылки? там вроде как дан ответ

horlyk
15.08.2009, 14:08
Очень познавательно, но, если не заметно, я модно спрашивал о другом. Вопрос в том можно ли разместить, к примеру, 50-ти битное число в нескольких переменных меньшего размера ( как пример в двух unsigned int ), если учитывать что число представлено строкой.

Долго не напрягаясь, написал вот это:

#include <iostream>
using namespace std;
typedef unsigned long int ULI;

void main()
{
char www[] = "1234567899876543219898989898989898989897";
char temp[sizeof(www)/9+1][9];
ULI a[sizeof(www)/9+1];

int i = 0, j = 0;

for(int j0 = 0; i < sizeof(www)/9+1; j0++, j++)
{
temp[i][j] = www[j0];
if(j == 8)
{
j = -1;
a[i] = atoi(temp[i]);
cout << a[i];
i++;
}
}
cout << endl;
}

ImNaruto
15.08.2009, 14:52
у мя наверн тупой вопрос по сравнению с другими:
как сделать так чтобы после конца кода (когда говорят нажмите кнопку чтобы выйти)
начинать сначала?

horlyk
15.08.2009, 15:02
у мя наверн тупой вопрос по сравнению с другими:
как сделать так чтобы после конца кода (когда говорят нажмите кнопку чтобы выйти)
начинать сначала?

Используй рекурсию.

#include <iostream>
using namespace std;
int main()
{
cout << "www\n";
system("PAUSE");
return main();
}

dinar_007
15.08.2009, 15:18
у мя наверн тупой вопрос по сравнению с другими:
как сделать так чтобы после конца кода (когда говорят нажмите кнопку чтобы выйти)
начинать сначала?
while (1) {
.....
}
Используй рекурсию.

#include <iostream>
using namespace std;
int main()
{
cout << "www\n";
system("PAUSE");
return main();
}
Тупее не придумаешь... Кто за стеком будет следить?!

horlyk
15.08.2009, 15:56
Тупее не придумаешь... Кто за стёком будет следить?!
Сразу становится ясно о понятиях человека :)

4p3
15.08.2009, 15:56
Используй рекурсию.

#include <iostream>
using namespace std;
int main()
{
cout << "www\n";
system("PAUSE");
return main();
}

Осторожно, ведь ты ничего не возвращаешь.
Нету возможности выйти из программы.

horlyk
15.08.2009, 16:04
Осторожно, ведь ты ничего не возвращаешь.
Нету возможности выйти из программы.
Ну я маленький примерчик привел для Lee_fx.

Кстати, а чего, если постоянно нажимать или зажать ентер, постоянно растет потребление памяти? с чем это связано?

ImNaruto
15.08.2009, 16:36
if (quit == 2)
exit
какая функция должна быть вместо exit?

horlyk
15.08.2009, 16:41
exit(1);

ImNaruto
15.08.2009, 16:44
ага! я понял что гдето рядом !!!
+а калькулятор (+-*/) в 4 день изучения си++ это норм или по-лохански(учусь по книге си ++ за 21 день)?
+ как делать блоки наподобии main()?

razb
15.08.2009, 17:02
ага! я понял что гдето рядом !!!
+а калькулятор (+-*/) в 4 день изучения си++ это норм или по-лохански(учусь по книге си ++ за 21 день)?
+ как делать блоки наподобии main()?
Может ты для начала книжку почитаешь, а не будешь спрашивать тут каждую минуту?

ImNaruto
15.08.2009, 17:25
в книге говориться тока про функция void но там нельзя использовать return!поэтому спрашиваю!

Lee_fx
15.08.2009, 17:32
ну а ты пробовал читать эти ссылки? там вроде как дан ответ

Я думал не о переводе в другую СС, хотелось бы сделать что-то типа

char num[] = "....";
// в двоичном коде например 00010001 11111111 10010001 00100101 11110001
Это число в 32 бита не влезает, но в 64 поместится, вот и хотелось бы его разместить в двух блоках по 32
uint a = 00000000 00000000 00000000 00010001
uint b = 11111111 10010001 00100101 11110001

Такое возможно?

horlyk
15.08.2009, 18:34
Я думал не о переводе в другую СС, хотелось бы сделать что-то типа

char num[] = "....";
// в двоичном коде например 00010001 11111111 10010001 00100101 11110001
Это число в 32 бита не влезает, но в 64 поместится, вот и хотелось бы его разместить в двух блоках по 32
uint a = 00000000 00000000 00000000 00010001
uint b = 11111111 10010001 00100101 11110001

Такое возможно?

Ты мой пост читал?

Lee_fx
16.08.2009, 21:22
Ты мой пост читал?
читал, я же не это имел ввиду)

fker
17.08.2009, 03:37
получаю я почту по протоколу РОР3
например
RETR 3
ответ сервера я сохраняю в буфер char buff[1024];
и мне необходимо записать в файл, чтобы все было в читабельном виде, после записи получается следующее
Return-path: <xxxxxxxx@mail.ru>

Received: from mail by f252.mail.ru with local
id 1MRkFs-0009dR-00
for yyyyyyyy@mail.ru; Fri, 17 Jul 2009 14:01:28 +0400
Received: from [94.51.137.194] by win.mail.ru with HTTP;
Fri, 17 Jul 2009 14:01:28 +0400
From: =?koi8-r?Q?=ED=C1=D2=C9=CE=C1_=FE=C5=DE=CE=C5=D7=C1?= <xxxxxx@mail.ru>
To: =?koi8-r?Q?=EF=CC=D8=C7=C1_=F7=C9=CB=D4=CF=D2=CF=D7=CE=C1 ?= <yyyyyyyy@mail.ru>
Subject: =?koi8-r?Q?Re=3A_?=
Mime-Version: 1.0
X-Mailer: mPOP Web-Mail 2.19
X-Originating-IP: [94.51.137.194]
Date: Fri, 17 Jul 2009 14:01:28 +0400
References: <E1MRU0n-00075w-00.yyyyyyy-mail-ru@f187.mail.ru>
X-Mru-Data: 444:1:1:32:32:1
In-Reply-To: <E1MRU0n-00073w-00.yyyyyyy-mail-ru@f187.mail.ru>
Reply-To: =?koi8-r?Q?=ED=C1=D2=C9=CE=C1_=FE=C5=DE=CE=C5=D7=C1?= <xxxxxx@mail.ru>
Content-Type: text/plain; charset=koi8-r
Content-Transfer-Encoding: 8bit
Message-Id: <E1MRkFs-0006dR-00.xxxxx-mail-ru@f252.mail.ru>
X-Spam: Not detected
X-Mras: Ok

йЪЧЕЭЕОЙЕ рПМХЮБФЕМШ РМБФЕЦБ: еж ппп "пТЙЖМЬКН лПУНЕФЙЛУ" 4
вБОЛ рПМХЮБФЕМС: хТБМШУЛЙК ВБОЛ ув тж мЕОЙОУЛПЕ пув 11
йоо 7704270172 вйл 046577674
л/УЮ: 3 0 1 0 1 8 1 0 5 0 0 0 0 0 0 0 0 6 7 4
уЮЕФ РПМХЮБФЕМС: 4 0 7 0 2 8 1 0 9 1 6 0 9 0 1 0 4 7 5 1
оБЙНЕОПЧБОЙЕ РМБФЕЦБ: ЪБ ФПЧБТ дЙУФТ ____________________
рП ОБЛМ _______________________________________
рМБФЕМШЭЙЛ: _______________________________________________
Как я понимаю проблемы с кодировкой, каким образом можно перекодировать из koi8-r в win1251?
ps пишу в VS,
может быть есть какие-нибудь готовые либы для перекодировки?


И еще один вопросик, точнее просьба, если есть подкинте примерчиков на С, как раскодировать и сохранить аттач
пример:
Content-Disposition: attachment; filename="kvitanciqSberbank.doc"

Content-Transfer-Encoding: base64


0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAAAAAAAAAAAAAACAAAAgAAAAAAAAAAA
EAAAggAAAAEAAAD+////AAAAAH4AAAB/AAAA////////////////////////////////////////
AQD+/wMKAAD/////BgkCAAAA
AADAAAAAAAAARh8AAADE7urz7OXt8iBNaWNyb3NvZnQgT2ZmaW NlIFdvcmQACgAAAE1TV29yZERv
YwAQAAAAV29yZC5Eb2N1bWVudC44APQ5snEAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAA
//много вырезано
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA A=

------nxcrLGJQ-RzITuat2OupmhXsL:1249303664--

Ra$cal
17.08.2009, 04:49
про примерчик - гугл на тему "base64 c"
http://ru.wikipedia.org/wiki/Base64 - вот почитай для общего развития

по поводу кодировки - погуглил и нашел такое
http://www.rsdn.ru/forum/src/257031.flat.aspx

неужели так сложно гуглом воспользоваться? тем более яхз нужно ли тебе в юникод или анси. хотя одно в другое после норм конвертации преобразовать не проблема.

кароч учись юзать гугл.

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

fker
17.08.2009, 16:13
спасибо.

DFrost
17.08.2009, 17:06
Я видел, что некоторые приложения запускаются каким-то образом что на них не срабатывает OpenProcess. Как???
Процесс скрывает себя. Так часто ведут себя хорошие бэкдоры. Процесс есть, но информация от ядра обрабатывается и изменяется, и поэтому он становится невидимым.(Если ты об этом)

slesh
17.08.2009, 21:42
банальный хук в ядре на ZwOpenProcess


NTSTATUS NewZwOpenProcess (OUT PHANDLE ProcessHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, IN PCLIENT_ID ClientId OPTIONAL)
{
HANDLE ProcessId;
if ((ULONG *)ClientId > MmUserProbeAddress) return STATUS_INVALID_PARAMETER;
__try
{
ProcessId = ClientId->UniqueProcess;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
return STATUS_INVALID_PARAMETER;
}

if (ProcessId == ProtectedPid)
{
return STATUS_ACCESS_DENIED;
}
else
{
return TrueZwOpenProcess(ProcessHandle, DesiredAccess, ObjectAttributes, ClientId);
}

}

........................................
switch (*NtBuildNumber)
{
case 2195 : //win 2k
OpenProcId = 0x06A;
break;

case 2600 : //win xp
OpenProcId = 0x07A;
break;

default :
return STATUS_NOT_IMPLEMENTED;
break;
}


TrueZwOpenProcess = NTCALL(OpenProcId);

__asm
{
cli
mov eax, cr0
mov CR0Reg,eax
and eax,0xFFFEFFFF
mov cr0, eax
}

NTCALL(OpenProcId) = NewZwOpenProcess;

__asm
{
mov eax, CR0Reg
mov cr0, eax
sti
}

Ra$cal
18.08.2009, 19:03
Почему сразу хук. Может человек привилегии не запросил для своего процесса. Деталей маловато в вопросе.

-m0rgan-
19.08.2009, 00:38
Привет всем, подскажите, как работать с большими числами в С++ ?
Нажно чтото типа:
...
int i = 1;
while(i<=1000000000000000000000000000000000000000000000000 00000000000000000000000000000000)
{
++i;
cout<<i;
}
...

Но увы инт принимает только 20 цыфр, как быть?

Ra$cal
19.08.2009, 01:00
ищи тут (http://sourceforge.net/search/?type_of_search=soft&words=Arbitrary-precision+arithmetic&search=Search)

Первый же поиск в вики дал такое...
http://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic#Libraries

razb
19.08.2009, 01:36
Смотри класс BigInt

Дикс
19.08.2009, 07:49
почему нельзя присоединить к объекту класса string - цифру?


int n = 5;
string str = "test";

str.append(n);
cout << str;

St0nX
19.08.2009, 08:57
string& append ( const string& str );
Appends a copy of str.
string& append ( const string& str, size_t pos, size_t n );
Appends a copy of a substring of str. The substring is the portion of str that begins at the character position pos and takes up to n characters (it takes less than n if the end of string is reached before).
If the position passed is past the end of str, an out_of_range exception is thrown.
string& append ( const char * s, size_t n );
Appends a copy of the string formed by the first n characters in the array of characters pointed by s.
string& append ( const char * s );
Appends a copy of the string formed by the null-terminated character sequence (C string) pointed by s. The length of this character sequence is determined by the first ocurrence of a null character (as determined by traits.length(s)).
string& append ( size_t n, char c );
Appends a string formed by the repetition n times of character c.

Потому и нельзя :)

int n = 5;
string str = "test";

str.append((char *)n);
cout << str;

если только так и это уже будет не число. или так


int n = 5;
char f[5];
string str = "test";
itoa(n,f,10);
str.append(f);
cout << str;

Дикс
19.08.2009, 10:15
str.append((char *)n);

так не получается, пробовал

ещё вопрос:

descr = new char[100];
strcpy(descr, "std");

if(descr == "std")
...


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

Ra$cal
19.08.2009, 10:45
книжки почитать...
strcmp юзай

ps: локальные строки делать динамическими с фиксированной длиной - бред. если размер тебе известен - делай фиксированный массив.

St0nX
19.08.2009, 11:13
descr это указатель и содержит только адрес выделеной памяти. Если хочеш сравнить юзай strcmp или сам посимвольно перебери и сравни. Как то так:
int FindString(char *str1,char *str2)
{
int nstr1,nstr2,i,j,nstr,sstr;
nstr1=strlen(str1);
nstr2=strlen(str2);
if(nstr1>nstr2)
{
nstr=nstr1-nstr2;
for(i=0;i<nstr;i++)
{
sstr=0;
for(j=0;j<nstr2;j++)
{
if(str1[j+i]==str2[j])
{
sstr++;
}
}
if(sstr==nstr2)
{
return 1;
}
}
}
else
{
return -1;
}
return 0;
}

razb
19.08.2009, 12:52
почему нельзя присоединить к объекту класса string - цифру?
если только так и это уже будет не число. или так
int n = 5;
char f[5];
string str = "test";
itoa(n,f,5);
str.append(f);
cout << str;

Проще использовать для преобразования stringstreams )

Дикс
20.08.2009, 10:46
помогите разобраться
если создавать объект обычным способом - всё нормально
а если через конструктор-копировшик - то ошибка

http://www.sendspace.com/file/6c3idu
в архиве класс и пример, показывающий ошибку (самая последняя строка)

razb
20.08.2009, 12:51
Все же не поленился и скачал, и так ...
descr = new char;
strcpy(descr, "empty");
Это простите что такое? ))
По вашему строка "empty" имеет длину в 1 символ?
Аналогично
object.setDescr("description");
Выделяем память не под массив а удаляем как массив delete [] descr;

Поставьте descr = new char[100]; (или же другую нужную длину).

П.С. И вообще в подобных случаях ну очень хорошо помогает отладчик )

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

St0nX
20.08.2009, 14:02
char *mas;
int a;
printf("a= ");
scanf("%d",&a);
mas = new char[a];
delete(mas);
mas = 0;

вот простой пример как

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

razb
20.08.2009, 14:14
блин, а мне тока что здесь же говорили что создавать динамический массив с известным размером глупо
а как же тогда создавать массивы, если длина неизвестна изначально?
Есть очень удобный класс string для строк, если не известно кол-во элементов - есть не менее удобный контейнер vector )

h4xx0r
20.08.2009, 15:40
блин, а мне тока что здесь же говорили что создавать динамический массив с известным размером глупо
а как же тогда создавать массивы, если длина неизвестна изначально?
Тот кто это сказал, видимо имел в виду создание массива под буфер для чтения из файла или сокета, например char buff[1024] то есть в этом случае ты знаешь что не будешь читать туда более 1024. А когда длина неизвестна (например нужно скачать страницу в память) то перевыделяешь память, затем копируешь туда содержимое буфера и так далее. Почитай книгу по C без ++.

Ra$cal
20.08.2009, 19:17
блин, а мне тока что здесь же говорили что создавать динамический массив с известным размером глупо
а как же тогда создавать массивы, если длина неизвестна изначально?

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

new-sl
20.08.2009, 21:08
как сравнить два массива типа char name1[100]; ? ато блин что я тока неперепробовал мине тока вот етото страшныи способ пришол в голову но чето он мине както ненравится некрасиви какоито

#include <iostream>
using namespace std;

int main ()
{
char array1[10];
char array2[10];
cin>>array1;
cin>>array2;
int i=0,j=0;
for (;i<sizeof(array1)&&i<sizeof(array2);i++)
{
if(array1[i]==array2[i])
j++;

}

if(j==i)
cout <<"same name\n";
else
cout<<"not same name\n";

system ("pause");
return 0;
}

Ra$cal
20.08.2009, 21:17
new-sl
функция memcmp

mailbrush
21.08.2009, 14:13
Создаю консольное приложение (т.е. приложение без формы) с TTcpClient.
//---------------------------------------------------------------------------

#include <vcl.h>
#include <windows.h>
#include <Sockets.hpp>
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
TTcpClient *TcpClient1;

WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
TcpClient1 = new TTcpClient(this);
return 0;
}
//---------------------------------------------------------------------------

И получаю ошибку 'this' can only be used within a member function c++

Первый раз кодю в Borland C++, говорят, он лучше, всегда кодил в Delphi:)

В чем моя ошибка?

Ra$cal
21.08.2009, 14:20
проблема та же, что и у всех - книжки не читаем. читаем главу что есть this и почему он не валиден в функциях, не принадлежащих классам и в статических методах класса. c++ - не делфи. тут нада немного думать и немного знать...

mailbrush
21.08.2009, 16:50
Вместо this поставил текущий объект, т.е. TcpClient1 :)

new-sl
21.08.2009, 19:15
даите пожауиста хорошое пособие по связаным спискам я искал в гоогле но чето немагу ничо талковова наити

Fata1ex
22.08.2009, 11:35
Поищи в данном топике. Совсем недавно обсуждалась тема.

Дикс
22.08.2009, 12:16
нужен человек, хорошо знающий С++, чтобы дописать и исправить три небольших программки на голых плюсах

подробности в аське 867766 90

horlyk
22.08.2009, 22:29
Объясните плз принцип перегрузки оператора [] и совместное использование его с оператором = , а то никак догнать не могу как он работает...


class Animal
{
public:
Animal() {}
Animal(int a): age(a) { }
~Animal() { };
int Get() { return age; }
private:
int age;
};

template <class T>
class Array
{
public:
Array() { size = 10; pType = new T[size]; for(int i = 0; i < size; i++) { pType[i] = 0; } }
Array(const Array& rhs);
~Array() { delete [] pType; }
int GetSize() {return size;}

Array& operator = (const Array& rhs);
T& operator [] (int offset) { return pType[offset]; }

private:
T* pType;
int size;
};


template<class T>
Array<T>& Array<T>::operator =(const Array &rhs)
{
if(this == &rhs)
return this;
delete [] pType;

pType = new T[rhs.GetSize()];

for( int i = 0; i < rhs.GetSize(); i++)
pType[i] = rhs[i];
return *this;
}


void main()
{
Array<int> arr;
Array<Animal> zoo;

Animal* pAnimal;

for(int i = 0; i < 10; i++)
{
arr[i] = i*3;// !Начиная с этого места!
pAnimal = new Animal(i*2);
zoo[i] = *pAnimal;
}
}

Что вызывается первым, а что вторым(с метки в коде)
и какая цепочка следует?

Ra$cal
22.08.2009, 23:04
встаешь на строку
zoo[i] = *pAnimal;


и жмешь Step Into и наблюдаешь, как это все работает. Увидишь и создание копии объекта и порядок вызова операторов.

horlyk
22.08.2009, 23:31
встаешь на строку
zoo[i] = *pAnimal;

и жмешь Step Into и наблюдаешь, как это все работает. Увидишь и создание копии объекта и порядок вызова операторов.

опа, дошло все сразу! пасиб) плохо что не писалось в книге про эти примочки. Я обычно F10 постоянно при отладке использовал - хз где узнал об этом.

Spyder
23.08.2009, 04:52
хелп, срочно
нужен исходник на pure c
задача: выполнить системную команду(unix), сама команда берется как аргумент, и возвращает результат выполнения
т.е на перле я бы написал system($_[0]) или system($ARGV[0])
хеелп(

Ra$cal
23.08.2009, 05:44
да по сути так же

#include <stdlib.h>


int _tmain(int argc, char* argv[])
{
system(argv[1]);

return 0;
}

-m0rgan-
23.08.2009, 22:49
Привет, мытаюсь создать оконное приложение на С++
#include <windows.h>

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MessageBox(NULL, "Простейшая программа!","WinAPI App", 0); //сообщение
return 0;
}

Компилятор ругается:
1.cpp
c:\documents and settings\********\мои документы\visual studio 2008\projects\w\w\1.cpp(8) : error C2664: 'MessageBoxW' : cannot convert parameter 2 from 'const char [22]' to 'LPCWSTR'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
Build log was saved at "file://c:\Documents and Settings\********\Мои документы\Visual Studio 2008\Projects\w\w\Debug\BuildLog.htm"
w - 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========


Юзаю Visual Studio 2008

И посоветуйте пожалуйста книгу по программированию на С++ с WinAPI
Зарание благодарен.

slesh
23.08.2009, 23:09
VS подефолту считает что все API юзают wide char
по этом настрйо в проекте чтобы был не юникод и не расширенные строки.
Или пиши функцию MessageBoxA
или если юзаеш MessageBoxW то перед стркоами пиши букву L типа
L"строка"

Ra$cal
23.08.2009, 23:12
ставь L перед строками или TEXT("blablabla")

MessageBox(NULL, L"Простейшая программа!",L"WinAPI App", 0); //сообщение

-m0rgan-
23.08.2009, 23:15
slesh,Ra$cal - благодарю, заработало!
А что на счет книги, а то как то страшно выглядит этот АПИ, да и консольные ф-и в нем не фурычут =\

И как быть если мне нужно вывесть из переменной данные:
int a = 111;
MessageBox(NULL, a,L"WinAPI App", 0); //сообщение

slesh
23.08.2009, 23:42
тогда тебе нужно из числа в строку и строку уже выводить.
можно заюзать к примеру sprintf() чтобы в буфер загнать по шаблону

-m0rgan-
24.08.2009, 00:45
С этим более мение понятно..
Но вот захотел потестить ф-ю GetDlgItemText(), но она теребует хендл родительского окна, то есть окна с которого она вызывается, напимер CreateWindow. Как его узнать?

Ra$cal
24.08.2009, 03:29
GetParent, FindWindow. Зависит от того, чье это окно. Если твое - то ты должен знать его. Если в чужом процессе - можно найти

ImNaruto
24.08.2009, 15:29
multiple definition of 'abonent::abonent()'
first defined here

Че за ошибка?

Ra$cal
24.08.2009, 16:21
видимо конструктор объявлен не один раз.

Дикс
24.08.2009, 16:57
подскажите, как можно нормально загрузить текстовый файл в массив типа string?

на данный момент хотелось бы создать массив указателей на объекты типа string, но я толком не знаю как это сделать. string **strs; или string *strs[]; - не то.
и проблема в том, что файл режется по пробелам, а не по переводам строк.


#include <iostream>
#include <fstream>

using namespace std;

int main()
{
string strings[1000];

string cookies;
ifstream fin("cookies.txt");

if(!fin)
{
cout << "cant open cookies.txt" << endl;
return 1;
}

int n = 0;

while(!fin.eof()){
fin >> strings[n];
cout << strings[n] << endl;
n++;
}

fin.close();
return 0;
}

Smapt
24.08.2009, 17:40
Дикс,


#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
string * strings = new string[1000]; //Массив указателей на стринг.

string cookies;
ifstream fin("123.txt");

if(!fin)
{
cout << "cant open file" << endl;
return 1;
}

int n = 0;

while(!fin.eof()){
getline(fin, strings[n]); //Читает строку.
cout << strings[n] << endl;
n++;
}

fin.close();

return 0;
}

mailbrush
24.08.2009, 23:55
Есть ли готовая функция копирования подстроки из строки, когда известен начальный и конечный символ подстроки? Объясню. Есть строка
Hello_world!
Начальный символ 6, конечный 11. Функция должна возвратить слово world.

Ну или же не возвращать, а записывать в переменную, всеравно...

-m0rgan-
25.08.2009, 00:12
уже разобрался)

Ra$cal
25.08.2009, 00:12
во первых чтобы бесконечно выводить можно просто написать while(true)
во-вторых месаджбокс синхронный и останвливает поток, вызвавший функцию. нажми он и выскочит еще один. если хочешь много много окошек делать - или создавай потоки и в них уже вызов месаджбокса. вариант второй - в ресурсах создай окошко и создавай его немоадальным через апи CreateDialog

-m0rgan-
25.08.2009, 00:30
Да меня сам принцип работы интерисовал)

А возможно сделать чтото типа такого:
.................................................. ....................................
int MessageBox( HWND hWnd,
LPCTSTR lpText,
LPCTSTR lpCaption,
UINT uType
);
.................................................. ....................................

Допустим мы имеем:
MessageBox(NULL,L"TEST",L"CAPTION",MB_OK);

И сделать условие типа:

if(lpText == "TEST")
{
............
}

У меня почемуто не получалось, говорит что lpText не объявлен, но он ведь должен объявлятся в самой функцие, не так ли?

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

char text [] = {"TEST"};
MessageBox(0, text, "caption", MB_OK);
if(strcmp(text, "TEXT") == 0{
...
}

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

Smapt
25.08.2009, 11:11
Есть ли готовая функция копирования подстроки из строки, когда известен начальный и конечный символ подстроки? Объясню. Есть строка
Hello_world!
Начальный символ 6, конечный 11. Функция должна возвратить слово world.

Ну или же не возвращать, а записывать в переменную, всеравно...


char * pczHw = "hello world!";
char * pczBuff[100];
ZeroMemory(pczBuff,100);
memcpy(pczBuff,pczHw+6,5);

Memcpy кпирует 5 символов с 6, т.е. с 6 по 11.

mailbrush
25.08.2009, 11:47
Спасибо конечно, но проблему решил :)
string substr(const string &str, int start, int length)
{
if (start < 0 ) start+=str.length();
if (length < 0 ) length=str.length()+length-start;
if (length < 0 ) return "";
return str.substr(start,length);
}

Возникла новая проблема с winsock или _beginthread - точно не знаю. Если вызывать вот это http://forum.antichat.ru/showpost.php?p=373579&postcount=6 один раз, или по очереди (я изменил буффер до 5120 вместо 1023), товсе ок, принимается 5кб, но если же с помощью _beginthread(Thread, 0, NULL); //Thread - void Thread (void *a) {http://forum.antichat.ru/showpost.php?p=373579&postcount=6} то принимается 2кб... В чем может быть проблема? УРЛ/ip подключения есс-но сменил.

Smapt
25.08.2009, 12:04
Тебе именно 5 кб нужно принять? Пропробуй через while принимать пока не получишь 5 кб.

Получишь весь ответ полностью...

char response[1024]; // буффер под ответ

while( recv(my_sock,(char*)response,sizeofresponse),0)!=S OCKET_ERROR && strlen((const char *)response)!=0)
{
printf("%s\n",response);
ZeroMemory(response,sizeof(response));
}


Если нужно получать часть ответа и рвать соеденение - можно попробывать считать полученные данные...



#define max_response_len 5120 // 5кб))

char response[1024]; // буффер под ответ
int response_len = 0;
while( recv(my_sock,(char*)response,sizeofresponse),0) != SOCKET_ERROR && strlen((const char *)response)!=0 && response_len < max_response_len)
{
printf("%s\n",response);
response_len+=strlen((const char *)response);

ZeroMemory(response,sizeof(response));
}

razb
25.08.2009, 12:18
озникла новая проблема с winsock или _beginthread - точно не знаю.
Код в студию ...

Gar|k
25.08.2009, 12:49
2 Smapt ппц код... && strlen((const char *)response)!=0 вот это ваще лишнее int recv возвращает количество принятых байт его и нужно проверять

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


//---TCP/IP функции

// отослать ВСЕ ... - правильная функция
int sendall(SOCKET s, char *buf, int len, int flags)
{
int total = 0;
int n;

while(total < len)
{
n = send(s, buf+total, len-total, flags);
if(n == -1) { break; }
total += n;
}

return (n==-1 ? -1 : total);
}

// принять ВСЕ ... - правильная функция
int recvall(SOCKET s, char *buf, int len, int flags)
{
int total = 0;
int n;

while(total < len)
{
n = recv(s, buf+total, len-total, flags);
if(n == -1) { break; }
total += n;
}

return (n==-1 ? -1 : total);
}

Smapt
25.08.2009, 12:59
2Gar|k, ну да, в теории ты прав... а на практике у меня получалось что сервер принимающий без "&& strlen((const char *)response)!=0" зацикливался при некоректном отключении клиента :confused: (например при плохом сетевом соеденении)... Понимаю, звучит это как-то бредово но нечего другого кроме strlen не помогло.

mailbrush
25.08.2009, 13:11
Такс... Проблему решил :) С циклом все ок работает. Но опять новая проблема =\

void BlaBlaBla( void *a)
{
int i;
Get("/forum/profile.php?mode=viewprofile&u="+IntToStr(1000+i).c_str(),"tfile.ru"); // тут орет invalid pointer addition.
i++;
}

void Get(char *url, char *host)
{
BlaBlaBla
}

Задолбали эти типы данных в c++ =\ Конвертировать только :) Как это решить?

Smapt
25.08.2009, 13:18
void BlaBlaBla( void *a)
{
int i;
Get("tfile.ru","/forum/profile.php?mode=viewprofile&u=%d",1000+i);
i++;
}




void Get(char* host, char * Format, ...)
{
va_list ap; // For arguments
va_start( ap, Format );
int buff_size = _vscprintf(Format,ap)+1;
char * buff = new char[buff_size];
vsprintf(buff,Format,ap);

//В переменной buff будет строчка "/forum/profile.php?mode=viewprofile&u=1000" (или не 1000 зависит от того что передашь)

va_end ( ap );
delete[] buff;
}

mailbrush
25.08.2009, 13:37
void Get(char* host, char * Format, ...)
1. Вместо троеточия что?
2. Теперь ошибка, что ф-ции нету _vscprintf.

Smapt
25.08.2009, 13:44
<stdio.h> подключена? Нужно именно проеточие... Функция будет работать по принципу функции printf, в переменную format передаётся "маска" напимер "name %s age %d\n" а в "троеточие" передаётся набор параметров:

char * name = "nikolay";
int age = 18;
printf("name %s age %d\n",name,age);
//выведит строку "name nikolay age 18"


точно так же будет работать и твой Get.

mailbrush
25.08.2009, 14:01
Подключена.
ЗЫ: Работаю в Borland C++ Builder 6

Smapt
25.08.2009, 14:05
Билдера нету под рукой... но попробуй так:

void BlaBlaBla( void *a)
{
int i;
Get("/forum/profile.php?mode=viewprofile&u="+IntToStr(1000+i),"tfile.ru");
i++;
}

void Get(String url, char *host)
{
BlaBlaBla
}

razb
25.08.2009, 14:06
1. Вместо троеточия что?
Как уже не раз говорилось лучше почитать пару книжек а не набирать говнокод и молится что бы он работал

mailbrush
25.08.2009, 14:10
Как уже не раз говорилось лучше почитать пару книжек а не набирать говнокод и молится что бы он работал
Типа обиделся, что + не поставил? Не надо отсылать меня к книжкам. Обрати внимание на название темы "[c/c++] Новичкам: задаем вопросы". Была бы твоя воля, ты бы переименовал "[c/c++] Новичкам: НЕ задаем вопросы - читаем книги!".

razb
25.08.2009, 14:27
На правах оффтопа ))
Типа обиделся, что + не поставил?
Мне вообще плевать на репу, это далеко не показатель чьих то знаний

Просто смотрю на все эти вопросы и плакать хочется, на все твои вопросы есть ответы на первых 10 страницах гугла + 100 первых стр. любого учебника по с\с++
Я рад помочь если где то что то не ясно или не понятно и ответа нигде нет, а тут смотришь большинство постов в стиле "хочу написать что то крутое, да вот не знаю чем int от char отличается" )

mailbrush
25.08.2009, 14:32
Поверь, я бы не задавал вопросы, не нагуглив их.

razb
25.08.2009, 14:45
Get("/forum/profile.php?mode=viewprofile&u="+IntToStr(1000+i).c_str(),"tfile.ru"); // тут орет invalid pointer addition.
Ты пытаешься сложить два указателя на строки, а не их самих это не пхп, для конкатенации есть специальная ф-ция strcat() и если бы ты удосужился почитать хоть немножко любой учебник эти вопросы бы сразу отпали.

mailbrush
26.08.2009, 10:40
Еще вопрос, есть код:
int id = 0;

void Thread( void *a)
{
Get(IntToStr(1000+id).c_str());
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
int i;
for(i=0;i<=1;i++)
_beginthread(Thread, 0, NULL);
}
//---------------------------------------------------------------------------


Вобщем я пишу парсер. Мне надо, чтобы каждый поток отдельно парсил аккаунты. id++ не поканает тут. Как реализовать это?

slesh
26.08.2009, 12:01
void Thread( void *a)
{
int mid;

mid = id++;
Get(IntToStr(1000+mid).c_str());
}
Или как вариант можеш юзать синхронизацию при изменениии. или интерлоки юзать
mid = InterlockedIncrement(&id) - 1;
т.е. id увеличится 100% на 1 и вернется его текущее значение. от которого ты отнимиш 1 чтобы получить предыдущее. Антерлок онснован на атомарном доступе. т.е. блокировка шины памяти идет и в этоге никто другой не сможет изменить значение.
В этоге такая конструкция (без учета того что это вызов апишки)представляет собой такой код:

mov ecx,[esp+4] ; ecx = адресу переменной X
mov eax,1
lock xadd [ecx],eax; блокирем шину памяти, прибавляем значение регистра eax к тому участку памяти где хранится X а предыдущее значение закидываем в eax.
inc eax ; увеличиваем eax на 1 - хз зачем MS это делает. сам не понимаю. Типа вернет не старое значение а новое. тупость

т.е. даже если после lock xadd [ecx],eax выполнение получит другой поток, то всё будет нормально потому что значение хранится в регисте, а при смене потока автоматом сохраняются значения всех регистров. И потом уже данные будут браться не их паременной X а из регистра eax.
темболее что lock xadd [ecx],eax не может прерваться на половине выполнения. И даже если у тебя многопроцессорная система, то всё равно потоки другова процессора не смогут в этотже момент времяни изменить значение переменной.
Вот такаявот хитро-простая синхронизация может быть сделана

bons
26.08.2009, 12:05
Вобщем я пишу парсер. Мне надо, чтобы каждый поток отдельно парсил аккаунты. id++ не поканает тут. Как реализовать это?
я так понял тебе нужно передавать в каждый поток переменную id, каждый раз инкрементируя ее. Для этого нужно почитать тут: http://msdn.microsoft.com/en-us/library/kdzttdcb%28VS.71%29.aspx

Дальше есть неколько замечаний:
- название функции должно отображать то, что она делает а не особенности ее реализации. Thread - так функцию никто не называет. То же касается и Get. Я например не уверен что вообще понял твой вопрос именно из-за дурацких названий функций. переменная 'a' вообще супер...

- писать сетевые приложения на потоках не стоит, это приводит к потреблению кучи ресурсов. Юзай асинхронные сокеты, тем более в windows полно их разновидностей

- хотел еще сказать что писать на борланд билдере не стоит вообще.. но тут вроде это уже говорили.

slesh
26.08.2009, 12:25
- писать сетевые приложения на потоках не стоит, это приводит к потреблению кучи ресурсов.

Сетевые какраз и должны работать на потоках потому как работа с сетью - это самое медленное что может быть.
Или если тебя устраивает скорость улитки, то вперед!
Если не юзать потоки то тогда придется тебе работать с неблокируемыми сокетами. Это конечно удобно, но довольно проблематично для новечков.

CPU C2D + Win2k3 и 500 тредов работы с сетью особото и не наггружают сервак зато дают скорость в 250 раз быстрее чем в один поток. потому как даже если у тебя мего скоростной канал, то ты идут большие задержки при ответе сервера. А если данные придут когда поток не выполняется, то они будут находиться в системном буфере и потом благополочку считаются из него. В современных условиях потеря памяти в 100 мб при хз каком кол-ве потоков - это неиграет роли вообще.

bons
26.08.2009, 12:39
ога при достаточно широком канале потоков может быть очень и очень много. CPU C2D + Win2k3 - не у всех такая производительность. Интересно что подумает об авторе программы человек у компа которого оперативной памяти допустим 128. И если софт пишется не только для себя то было бы разумно потратить пару часов на изучение неблокирующих сокетов - повышение производительности капитальное

Ra$cal
26.08.2009, 15:36
если оперативы мало нада смотреть в сторону пула потоков. он как раз предназначен для балансирования потребления ресурсов\скорости работы потоков.

ps: вроде как в буст все планировали добавить. но чет так и не посмотрел есть он там или нет...

Велемир
27.08.2009, 19:55
Всем привет.Очень нужен хороший учебник по си,поскольку в библиотеках не нашёл.Также компилятор не помешал бы.Есть что-нибудь хорошее(исключая древние компильки).

POS_troi
27.08.2009, 20:06
gcc как компилятор

Велемир
27.08.2009, 21:12
Линукс как мечта.У меня винда.К тому же,в универе мы прогать бум на старье.А дома нужно нормальное...

ntldr
27.08.2009, 22:31
Как лучше всего из программы в юзермоде вызвать функцию из моего драйвера?
Что будет если я например в XP SP3 сделаю int 2eh вместо SYSENTER?

slesh
27.08.2009, 23:33
2 ntldr
1) в DriverEntry пишеш

NTSTATUS st;
PCWSTR dDeviceName = L"\\Device\\DRVNAME";
PCWSTR dSymbolicLinkName = L"\\DosDevices\\DRVNAME";

RtlInitUnicodeString(&DeviceName, dDeviceName);
RtlInitUnicodeString(&SymbolicLinkName, dSymbolicLinkName);
st = IoCreateDevice(DriverObject, 0, &DeviceName, FILE_DEVICE_UNKNOWN, 0, FALSE, &deviceObject);
if (NT_SUCCESS(st)) st=IoCreateSymbolicLink(&SymbolicLinkName, &DeviceName);
if (!NT_SUCCESS(st)) return STATUS_DRIVER_INTERNAL_ERROR;
DriverObject->DriverUnload=DriverUnload;
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DriverDispatcher;


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

NTSTATUS DriverDispatcher(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
NTSTATUS status=STATUS_SUCCESS;
PIO_STACK_LOCATION irpStack;

irpStack = IoGetCurrentIrpStackLocation (Irp);
Irp->IoStatus.Information=0;
if (irpStack->MajorFunction == IRP_MJ_DEVICE_CONTROL)
{
if (irpStack->Parameters.DeviceIoControl.IoControlCode==IOCTL_QU ERY)
{
DPRINT("QUERY");
тут ты делаеш всю обработку. Короче читай работу с дровами
} else status = STATUS_INVALID_DEVICE_REQUEST;
}
Irp->IoStatus.Status = status;
IoCompleteRequest(Irp,IO_NO_INCREMENT);
return status;
}

А в проге открываеш файл
CreateFile("\\\\.\\DRVNAME) и через DeviceIoControl отправляй запросы дрову.
PS - IOCTL_QUERY это моя буфкция обработчик которая строится так:
#define IOCTL_QUERY CTL_CODE(FILE_DEVICE_UNKNOWN, 0x01, METHOD_OUT_DIRECT, FILE_ALL_ACCESS)
METHOD_OUT_DIRECT значит прямой доступ к выходному буферу(без использования промежуточного)
Это всё описано в книге Солдатов В.П. Программирование драйверов Windows.

2) врядли будет пахать int 2eh потому как он устанавливается как дань традициям, но всё равно юзается тока sysenter если винда начиная с XP и проц начиная с P2

denisov21g21
28.08.2009, 10:57
служба поддержки VDS manager
591-493-245

razb
28.08.2009, 12:00
Линукс как мечта.У меня винда.К тому же,в универе мы прогать бум на старье.А дома нужно нормальное...
mingw как порт gcc под винду )

Mr.Sylar
28.08.2009, 13:06
:confused: :confused: :confused: Народ, я совсем недавно начал изучать С++, объясните, что такое функция и как к ней обращаться заранее спасибо!!! :confused: :confused: :confused:

agrofyl2
28.08.2009, 16:06
Функция - http://www.google.com/search?&q=define:%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8 F&
Обратится - просто function(аргументы)

POS_troi
28.08.2009, 16:34
В любой части программы - после того места где описана сама функция

вставляеш

function_name() - если функция без аргументов (function_name - имя функции- например Main)

или

function_name(аргумент1 , Аргумент2, .... и т.д.) - если с аргументами.


Сама функция выглядит

int Summa(int x, int y)
{
int z;
z = x+y;

return z;
}

Вызов в свою очередь будет происходить так

int result;
result = Summa(4,6);


В итоге в result будет сумма чисел 4 и 6.

Извиняюсь - как всегда не обновил страницу перед ответом.

Обратится - просто function(аргументы)

не обязательно, функция может быть и без аргументов.

ImNaruto
28.08.2009, 16:50
Ктонить объясните как созранять значение переменных в файл.

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

POS_troi
28.08.2009, 17:03
2ImNaruto

Используй поиск - как по форуму так и по гуглу/яндексу

как на мой взгляд то лучше использовать ini файл

http://devoid.com.ua/c-builder/cpp-builder-for-beginners/load-and-save-properties-in-ini-files.html

2Ra$cal

ну что же поделать =)

по этой теме уже можно написать буку

-m0rgan-
28.08.2009, 17:44
привет, подскажите пожаляйста ф-ю для определения времени выполнения цикла(while)
зарание спасибо!

-m0rgan-
28.08.2009, 17:50
И что?
она должна определять время выполнения цикла на каждой тачке.

Ra$cal
28.08.2009, 18:03
GetTickCount перед входом в цикл и после выхода

или мой самописный класс, который считает с точностью до наносекунд (http://www.everfall.com/paste/id.php?ovzqr4iqnxs1)

eldar85
28.08.2009, 19:51
Всем здрасти) Подскажите пожалуйста, какой функцией делать очистку консоли в Эклипсе под линуксом? System ("cls") в Эклипсе не дает ни каких результатов. В заранее благодарю.

razb
28.08.2009, 19:58
system("clear");

Mozy
29.08.2009, 12:06
Есть ли книги на русском языке по MFC ?
И что можно почитать про переход к программированию графического интерфейса пользователя

razb
29.08.2009, 13:39
Мешков и Тихомиров "Visual C++ и MFC"
Программирование на VISUAL C++ 6.0

Mozy
29.08.2009, 17:17
А что лучше изучать MFC или Qt ?

Ra$cal
29.08.2009, 18:40
в мфц учить особо нечего. список классов и все. в кутэ все веселее и продуманнее. так что имхо нет особой проблемы ознакомиться с мфц и заняться кутэ.

Shaitan-Devil
30.08.2009, 08:44
А что лучше изучать MFC или Qt ?
Имхо лучше изучать QT, ибо MFC уже умирает, а QT довольно развивющаяся технология, к тому же кроссплатформенная.

POS_troi
31.08.2009, 19:49
Мужики, помогите однако, башка что-то уже не варит.

Winsock + HTTP GET

Получаю ответ от сервера

while(recv(soc,RecvBuff,sizeof(RecvBuff),0)) //while((i = recv(soc,RecvBuff,sizeof(RecvBuff),0))!=0)
{

//Обрезаем заголовок
for(int i = 0; RecvBuff[i]!=0; ++i)
{

if((RecvBuff[i]=='\r')&&(RecvBuff[i+1]=='\n')&&(RecvBuff[i+2]=='\r')&&(RecvBuff[i+3]=='\n'))
{
temp = (char*)&RecvBuff[i]+4;
break;
}

}
}


Данный код просто отлично отрезает заголовок ответа сервера но вот хотел бы узнать как будет лучше сделать обратное действие - вырезать контент но оставить заголовок.

пример если можно.

Ra$cal
31.08.2009, 20:01
человек явно не слышал про функцию strstr ...
тут нет особо хитрых алгоритмов. ищутся границы - начало и конец. выделяется память, туда складываются нужные фрагменты. ну еще можешь регэкспы прикрутить. но для начала стоит ознакомиться со стандартной библиотекой

POS_troi
31.08.2009, 20:04
человек явно не слышал про функцию strstr

Знаю.. я спросил не как это сделать а как лучше это сделать.

Ra$cal
31.08.2009, 20:18
что в твоем понимании лучше? в моем - поддержка кода, легкость понимания кода. поэтому лучше юзать strstr, ибо вместо твоих 7 строк имеем одну, название которой красноречиво говорит о назначении этой строки.

ps: а еще лучше выделить этот код в отдельную функцию и назвать ее getContent или cutHeader

wiply
01.09.2009, 03:00
А вообще в сетевых программах лучше пользоваться сишными функциями и строками или stl? Для меня это вопрос, ведь всякие strstr это остатки от си, и непонятно когда что лучше использовать?

Ra$cal
01.09.2009, 14:33
ну сокету все равно придется передавать просто массив байтов. просто нужно сделать классы враперы над сокетами, которые скрывают работу с чистыми указателями
http://www.codeproject.com/KB/IP/client_server_socket.aspx
вот например. во всем остальном коде использовать классы. если передаются двоичные данные - значит делать классы, которые преобразуют бинарные данные в классы. вообще без острой неоюходимочти внутри ядра программы, если пишешь на с++, использовать чистые массивы и указатели нада ну ооочень редко. разве что для передачи в некоторые апи. больше причин для использования не вижу.

razb
01.09.2009, 14:37
А вообще в сетевых программах лучше пользоваться сишными функциями и строками или stl? Для меня это вопрос, ведь всякие strstr это остатки от си, и непонятно когда что лучше использовать?
STL )

Hiro Protagonist
02.09.2009, 01:39
"... остатки от си"
убило. Это не остатки, это RTL! >____<

Dead4ik
02.09.2009, 21:49
Надеюсь не пошлют лесом=) Скиньте плз код проекта, в котором вводится числа, потом он присвается к константам, потом с ними выполняется любое математическое действие.=)

.ATK
02.09.2009, 21:50
Надеюсь не пошлют лесом=) Скиньте плз код проекта, в котором вводится числа, потом он присвается к константам, потом с ними выполняется любое математическое действие.=)

константы и есть на то константы, что их значение нельзя изменять....

Dead4ik
02.09.2009, 22:20
константы и есть на то константы, что их значение нельзя изменять....
Изменить нельзя, но начальное значение дать же можно.

Fata1ex
02.09.2009, 22:25
Скиньте плз код проекта, в котором вводится числа, потом он присвается к константам, потом с ними выполняется любое математическое действие
переведи на русский, пожалуйста

Dead4ik
02.09.2009, 22:30
переведи на русский, пожалуйста
Нужен проект, который при запуске сначала попросит ввести например 2 числа, потом оно будет с этими числами делать любое математическое действие

Ra$cal
02.09.2009, 22:39
в раздел помощи студентам иди за "сделайте мне тото". тут обсуждаются конкретные вопросы реализации чего-либо.

ICQ Hool
03.09.2009, 00:36
использую Visual C, проект mfc,
есть Tree Control

я использую для создания дерева такой код:

HTREEITEM room_1=m_tree.InsertItem("room_1",korp1);

m_tree.InsertItem("counter:",room_1);

подскажите пожалуйста как сделать чтобы после counter: стояла переменная(value) которая вычисляется в самой программе, например значение i из структуры ms т.е ms.i

с меня плюсы!

Ra$cal
03.09.2009, 01:12
CString item_text;
item_text.Format("counter: %d", ms.i);
m_tree.InsertItem(item_text,room_1);

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

ICQ Hool
03.09.2009, 08:24
Ra$cal, получилось, супер, но фишка в том, что у меня очень много таких как counter: у которых должны быть значения
это я к тому что слишком много ручками делать =)

_nic
03.09.2009, 16:36
Подскажите как вывести в цикле содержимое контейнера list.В том порядке в котором оно заносилось в него.

Ra$cal
03.09.2009, 17:11
http://www.cplusplus.com/reference/stl/list/begin/

SaiRus
04.09.2009, 12:41
смена mac адреса, что читать?с++ builder

slesh
04.09.2009, 13:02
читай програмирование микрокантроллеров.
Потому как мак адрес - это физический адрес твоего компа.
Вернее не компа а устройства связи. И он вшит в память этого устройства. И сменить его довольно проблематично.

Kaimi
04.09.2009, 13:12
смена mac адреса, что читать?с++ builder

http://www.codeproject.com/KB/applications/MacIdChanger.aspx

St0nX
04.09.2009, 13:50
смена mac адреса, что читать?с++ builder
http://devices.natetrue.com/macshift/macshift.zip
Сорец С++ и ехе.

ICQ Hool
04.09.2009, 16:49
Ra$cal, получилось, супер, но фишка в том, что у меня очень много таких как counter: у которых должны быть значения
это я к тому что слишком много ручками делать =)
с этим справился, всё действительно надо делать ручками


есть еще вопрос, делаю открывашку в вижале

CFileDialog fd(true);
if (fd.DoModal()==IDOK)
{
m_list.ResetContent();
m_list.AddString(fd.m_ofn.lpstrFile);

int fh = _open("1.dat",_O_RDWR | _O_BINARY);
...

как мне вместо 1.dat поставить тот файл который я выбираю в fd

Ra$cal
04.09.2009, 17:05
а гуглить пробовал?
http://www.google.ru/search?q=CFileDialog+&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ru:official&client=firefox

ICQ Hool
04.09.2009, 17:33
Ra$cal, извини
для тех кому это тоже может пригодиться
CString szlstfile = fd.GetPathName();


int fh = _open(szlstfile,_O_RDWR | _O_BINARY);

M@ZAX@KEP
04.09.2009, 19:25
Люди, есть little просьба... может ктонить кидануть ссылки на исходники сааавсем простеньких (м.б. даже бесполезных) прог для C++ Builder (Borland)? Желательно чтоб разные элементы были (поля ввода, кнопки, флажки, переключатели и т. п. х.) мне просто с целью поковыряца в образцах чтобы освоить этого зверя)) Заранее спс++ :D

Ra$cal
04.09.2009, 20:32
ICQ Hool
просто не забывай открывать доки =) там очень много написано. гораздо быстрее поискать там чем сразу постить вопрос на форум и ждать ответа.

Korotnoe
05.09.2009, 22:58
Что это за ошибка
[Linker Error] Unresolved external '_Form1' referenced from D:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\PROJECT1.OBJ
[Linker Error] Unresolved external 'TForm1::' referenced from D:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\PROJECT1.OBJ

Пишу простую программу в билдере. и это показывается(

Dosia
06.09.2009, 11:04
посмотри тут: __http://forum.shelek.ru/index.php/topic,4844.0.html , похожая тема

компилятор считает, что ты создал приложение с применением VCL, если создаш обычный проект. И естественно ишет объекты VCL, о чем тебе и сказал в описании ошибки.

-m0rgan-
06.09.2009, 21:02
Привет!
Подскажите плз, как сделать наклажной вывод цифер?
Например:
int a = 0;
while(a != 10)
{
a++;
cout<<a;
}
...

Необходимо чтоб выводило не 123456789, а сначало 1, затем 1исчезает и появляется 2, ну как в процентной загрузке.

Зарание благодарен!

Kaimi
06.09.2009, 21:08
\r добавляй в вывод

slesh
06.09.2009, 23:33
/|\
+--------------------------------------
как сказал вот этот человек | юзай \r типа
printf("%i\n", ТВОЁЧИСЛО);

-m0rgan-
07.09.2009, 20:17
спс, разобрался, а вот еще вопрос:
есть цикл:
int a = 0;
while(a != 999999999)
{
a++;
cout<<a;
}
...
Всебы хорошо, но коут (cout<<a;) очень сильно замедляет процесс выполнения цикла :(
Как ы исбавится от этой проблемы?

Ra$cal
07.09.2009, 22:04
не выводим в консоль\файл, или формируем блок и пишем вместо 100 раз по одному символу 100 символов за один раз.

ICQ Hool
07.09.2009, 22:55
помогите пожалуйста найти решение для организации масштабируемых графиков в visual c, проект mfc

нет ли какого-нибудь аддона чтобы в контролсах появилось что-нибудь на подобии tchart как в билдере?

умею рисовать по пикселям с помощью dc.SetPixel, dc.LineTo и dc.MoveTo, но это геморой...

погуглил, легче CGraph ничего нету?

scrat
07.09.2009, 22:57
помогите пожалуйста найти решение для организации масштабируемых графиков в visual c, проект mfc

нет ли какого-нибудь аддона чтобы в контролсах появилось что-нибудь на подобии tchart как в билдере?

умею рисовать по пикселям с помощью dc.SetPixel, dc.LineTo и dc.MoveTo, но это геморой...

погуглил, легче CGraph ничего нету?
разьве что откинуть mfc, который умер лет 10 назад и заюзать windows forms с zedgraph

n4e/\@
08.09.2009, 10:54
помогите пожалуйста найти решение для организации масштабируемых графиков в visual c, проект mfc

нет ли какого-нибудь аддона чтобы в контролсах появилось что-нибудь на подобии tchart как в билдере?

умею рисовать по пикселям с помощью dc.SetPixel, dc.LineTo и dc.MoveTo, но это геморой...

погуглил, легче CGraph ничего нету?
Еслия правильно понял, может лучше для этого использовать, qt+qplot

razb
08.09.2009, 12:11
Qt однозначно )

M_script_
08.09.2009, 15:48
Всебы хорошо, но коут (cout<<a;) очень сильно замедляет процесс выполнения цикла :(
Как ы исбавится от этой проблемы?

Не выводи ничего. И вобще - непонятен смысл этого кода. Зачем он нужен, может по-другому лучше реализовать? (дополнено: не прочитал первое сообщение, про вывод цифр, только про cout<<a, исправил)

for(int a = 0; a < 999999999; a++)
{
if(!(a%100)) // выводить каждые 100 цифр
{
system("cls"); // очистка консоли под виндой
cout<<a;
}
}

ICQ Hool
08.09.2009, 19:40
scrat, n4e/\@ спасибо за ответы, остановился на CGraph...
я опять в затруднении

есть дерево ctreectrl

сounter.Format("counter: %d", ms.i);

HTREEITEM room_1=m_tree.InsertItem("room_1",korp1);
m_tree.InsertItem(counter,room_1);
....

как мне при выделении или нажатии на элемент(counter) дерева вытащить значение значение ms.i ?

ну или при нажатии на чекбокс, наверно это сложнее потому что нужен только один элемент дерева...

текст получил m_tree.GetItemText(m_tree.GetSelectedItem());
а как получить ms.i ?

intNet
08.09.2009, 22:21
Снова я по этой теме... Скиньте часть кода работы через socks5 (winsock). Сейчас доступа к дом. компу не имею, выложить наработки не могу. Но программа давала не тот рузультат уже на начальном приветствии клиента(char auth[10] = "\0x05\0x01\0x00).

Ra$cal
08.09.2009, 22:25
http://msdn.microsoft.com/en-us/library/bb759988%28VS.85%29.aspx

часть Notifications

awdrg
08.09.2009, 22:51
Помогите пожалуйста с вопросом.
Имеется кусок кода, через который я соединяюсь с web страницей, отправляю ей запрос и получаю в ответ ее исходник. Интересует следующая строка в запросе (header):
Accept-Encoding: gzip,deflate

Если ее не добавлять то идет чистый текст, но запакованый он весит в 5-20 раз меньше
Как ее можно распаковать?

ICQ Hool
09.09.2009, 07:37
ничего не получается =(

n4e/\@
09.09.2009, 08:46
Как ее можно распаковать?
Можно использовать библиотеку zlib, вот пару ссылок:
http://www.realcoding.net/article/view/4177 (рус)
http://www.codeproject.com/KB/cpp/cgzip.aspx (eng)
http://cboard.cprogramming.com/cplusplus-programming/119170-gzip-cplusplus-function-crashes-my-program.html (eng)

_nic
09.09.2009, 20:13
Как из одного вектора запихать аллокатор в другой вектор?

St0nX
09.09.2009, 21:11
Начал изучать Qt4 в первом же примере, по книге "Qt 4 программирование GUI на C++", вылезли такие ошибки при компиляции.

new.cpp:1:28: error: QApplication.hpp: No such file or directory
new.cpp:2:22: error: Qlabel.hpp: No such file or directory
new.cpp: In function ‘int main(int, char**)’:
new.cpp:5: ошибка: нет декларации ‘QApplication’ в этой области видимости
new.cpp:5: ошибка: expected `;' before ‘app’
new.cpp:6: ошибка: нет декларации ‘QLabel’ в этой области видимости
new.cpp:6: ошибка: нет декларации ‘label’ в этой области видимости
new.cpp:6: ошибка: expected type-specifier before ‘QLabel’
new.cpp:6: ошибка: expected `;' before ‘QLabel’
new.cpp:8: ошибка: нет декларации ‘app’ в этой области видимости
new.cpp: At global scope:
new.cpp:3: предупреждение: параметр ‘argc’ не используется
new.cpp:3: предупреждение: параметр ‘argv’ не используется
make: *** [new.o] Ошибка 1

Вот код:
#include <QApplication>
#include <Qlabel>

int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QLabel *label = new QLabel("Hello Qt!");
label->show();
return app.exec();
}

BrainDeaD
09.09.2009, 21:25
или не хватает библиотек, или компайлер их не видит. с qt у тебя будет ещё очень много проблем и вопросов. советую тебе обосноваться на каком нибудь кодерском форуме, где обсуждается qt. на пример prog.org.ru. ачат, думаю, не совсем подходящее место для вопросов по qt.

n4e/\@
09.09.2009, 21:49
2St0nX Там во первых ошибка в заголовке, QLabel, L надо с большой буквы писать.
Но ошибка в путях. Возможно надо указывать более полный путь до библиотеки например <QtGui/QApplication> если не поможет то можно попробовать писать так: qapplication.h

St0nX
09.09.2009, 22:02
2St0nX Там во первых ошибка в заголовке, QLabel, L надо с большой буквы писать.
Но ошибка в путях. Возможно надо указывать более полный путь до библиотеки например <QtGui/QApplication> если не поможет то можно попробовать писать так: qapplication.h
Ничего не помогло :(
qt4.5.0 под убунту может чего там настроить надо? Ставил из репозитория.

Gin
09.09.2009, 22:09
Столкнулся с такой дурацкой проблемой раньше писал на пхп такого вопроса не возникало, а на С++ возник, суть в следующем.
есть функция someFunction()
она читает из потока данные
как записать весь поток в переменную и эту переменную вернуть как значение.
Разумеется поток произвольного значения.
ЗЫ
Не пинайте сильно если объяснил коряво.

St0nX
09.09.2009, 22:12
Столкнулся с такой дурацкой проблемой раньше писал на пхп такого вопроса не возникало, а на С++ возник, суть в следующем.
есть функция someFunction()
она читает из потока данные
как записать весь поток в переменную и эту переменную вернуть как значение.
Разумеется поток произвольного значения.
ЗЫ
Не пинайте сильно если объяснил коряво.
Скинь код. Так непонятно чё то что ты хочеш и что ты понимаеш под потоком...

Gin
09.09.2009, 22:25
stat=1;
char get[1024]="";
while(stat) {

ret=recv(sClient, get, 1024, 0);//Получаем данные
cout << get;

if(ret==0) stat=0;
if(ret==SOCKET_ERROR) {
cout << "Socket error" << endl;
return 0;
}

}

Вот это фрагмент кода, использую винсокет тут, мне нужно чтоб в переменной get был весь ответ сервера, а не его часть, потом вернуть это значение. Возможно ли это сделать :?

n4e/\@
09.09.2009, 22:33
std::string a;
while(recv(sClient, get, 1024, 0)!=NULL)
a+=get;
.....
return a;

St0nX
09.09.2009, 22:33
Да получай ответ в цикле пока recv не возвратит 0 сам ответ прибавляеш к get и все. Потом переменную возвращаеш как ты тут 0 возвратил

n4e/\@
09.09.2009, 22:39
Ничего не помогло :(
qt4.5.0 под убунту может чего там настроить надо? Ставил из репозитория.
Только что проверил, на виртуальной убунте, там такие же ошибки были, решилось установкой libqt4, там они разные я поставил все.

Gin
09.09.2009, 23:14
В продолжении, а как вывести в консольном приложении объект string
cout<< и printf не получается. Может есть стандартные функции?

Сразу чтоб не постить много.

С помощью какой функции можно найти подстроку в объекте string :?

Заранее спасибо.

Ra$cal
09.09.2009, 23:25
string str;
cout<< str.c_str();

Hiro Protagonist
09.09.2009, 23:33
2Gin



//Резервируем и выделяем побайтно память
buffer = (char *)VirtualAlloc(NULL, 1000, MEM_RESERVE, PAGE_READWRITE);
buffer = (char *)VirtualAlloc(buffer, 1, MEM_COMMIT, PAGE_READWRITE);

//Читаем из сокета побайтно, чтобы быть уверенными, что вся инфа дошла
while(recv(sRemoteSock, &buffer[i], 1, 0))
{
//Если встретили перевод строки, то ппц конец передачи
if(buffer[i] == '\n')
{
buffer[i] = '\0';
printf("[>] Client say : %s\n", buffer);

VirtualFree(buffer, 0 , MEM_RELEASE);
i = 0;
break;
}
else
{
//Выделяем ещё один байт
buffer = (char *)VirtualAlloc(buffer + i++ + 1, 1, MEM_COMMIT, PAGE_READWRITE);
}
}



Как то так ) Тут концом сообщения считается перевод строки (можно переделать). Можно в принципе поблочно считывать, а не побайтно.

Ra$cal
09.09.2009, 23:48
какой нах VirtualAlloc O_o на худой конец malloc, или new для c++.

n4e/\@
09.09.2009, 23:54
Че то как то сложно, ведь в string'e есть метод find. И к тому же есть функция strtok, которая разбивает строку на лексемы(при первом вызове задается по какому символу разделяем, в последующих вызовах передаем NULL)
И кстати у меня std::cout << переменная_стринг выводится без проблем, т.е. не надо преобразовывать в char по средствам c_str().
Но я всегда подключал <string>

*uNkN0Wn*
09.09.2009, 23:55
Скажите пожалуйста как найти серийник к Codegear 2007 никак не найду.

Hiro Protagonist
09.09.2009, 23:58
2Ra$cal

а есть какойнибудь цинус использовать вместо API CRT-функции? Мне так например проще ) хотя да при работе с ANSI строками я буду использовать CRT, да и то не всегда. Так что мне не совсем понятно ваше негодование по этому поводу )

ЗЫ
Да и давайте не будем тут о кросплатформенности ^_____^

Gin
10.09.2009, 00:06
Огромное спасибо, ваша помощь просто не оценима !
(не сочтите за флуд)

Ra$cal
10.09.2009, 01:01
Hiro Protagonist
ну давай еще в питоне будем VirtualAlloc юзать. Самый простой пример - выделяя память через апи ты получишь выравнивание страницы до 4096 байт, таким образом в случае аллока мелких блоков ты просто засрешь оперативу. Это раз. Во вторых - утечки памяти таким образом не отследить - это два. Заменить вызов VirtualAlloc на HeapAlloc было бы гораздо логичнее и правильнее, но это так же приведет к гемору - контроль размера кучи, невозможность отслеживания утечек памяти.

Если тебе эти проблемы до сих пор не известны - то сочувствую. Они есть, просто ты о них не знал =)

И еще - никогда не смешивают разные стили и технологии. Если юзают qt - юзают его классы. Если boost - то его. Например filesystem и классы работы с файлами qt не перемешивают в адеквате. Это банально упрощает читабельность кода.

Hiro Protagonist
10.09.2009, 01:24
2Ra$cal

Мы говорим о Питоне? Код на Си (прошу заметить именно на Си), значит мы и говорим про Си.

Самый простой пример - выделяя память через апи ты получишь выравнивание страницы до 1024 байт

О да, о да. Как будто используя другие функции мы этого не получим. Память всегда выделяется по странично. Библиотечные функции работают лишь по выделенному региону(ам) на куче, эмулируя выделение памяти. А кучи (Heap* функции) надо сказать довольно глючный инструмент ), который не рчень то и рекомендуется использовать. В конечном итоге все использует VirtualAlloc )

И да ты прав, у меня не такие большие проекты, чтобы использовать автоматизированный контроль утечек памяти - достаточно внимательности ) . Ну так и инструменты выбирают под задачу, а не наоборот.

Хотя надо признать в вышеприведенном куске смысла коммитить каждый байт нету ^______^ да, говнокод ) но пытаюсь исправится ).

Ra$cal
10.09.2009, 01:55
Код на Си (прошу заметить именно на Си), значит мы и говорим про Си.
Именно поэтому я и рекомендую использовать Си-стайл. А именно malloc и free. Правда логично? =)

О да, о да. Как будто используя другие функции мы этого не получим. Память всегда выделяется по странично. Библиотечные функции работают лишь по выделенному региону(ам) на куче, эмулируя выделение памяти.
Так вот именно поэтому они и работают так, эмулируя кучу - чтобы использовать память эффективно. В твоем же случае гарантированно память будет неиспользована. В случае с crt - память будет исплоьзована. Еще одна засада - дефолтная куча создается при создании процесса =) Так что ты ее просто динамишь, соотв так же просираешь =)

А кучи (Heap* функции) надо сказать довольно глючный инструмент ), который не рчень то и рекомендуется использовать. В конечном итоге все использует VirtualAlloc )
Именно поэтому и следует не писать велосипед на костылях, а юзать malloc =)

Ну так и инструменты выбирают под задачу, а не наоборот.
И? Не вижу тут оправдания неумелого использования языка =)

Дикс
10.09.2009, 11:46
сорри, не туда
дел

POS_troi
10.09.2009, 12:06
sudo passwd root

Пробывал?

только не пойму - С++ тут каким боком =))

Gin
10.09.2009, 12:47
Хочу написать чекер, но на странице много яваскриптов, возник вопрос для корректной работы с яваскриптами достаточно отправлять корректные HTTP заголовки или нужны еще какие либо надстройки для правильной работы.

Извините за сумбурное изложение, но надеюсь меня поймете.
Если не тяжело покажите в какую сторону копать, по части программирование на С++ для сети (в частности для веба).
Спасибо.

Дикс
10.09.2009, 12:52
смотри, не отправляет ли заголовков сам яваскрипт
+ он может изменять на лету скрытые поля - это надо отслеживать, иначе сервер данные формы не примет
в остальном яваскрипт роли не играет, насколько мне известно

Gin
10.09.2009, 13:10
2Диск and 2All
Если я отслежу последовательность своих действий HTTPAnalyzer'ом к примеру ну и просто сохраню все отсланные моим браузером заголовки (разумеется поменяю то что нужно мне) так оно будет работать или все же тут есть свои ньансы?

Gin
10.09.2009, 23:57
Возник еще вопрос
Вообщем нужно создать много файлов определенного содержания вида
file1.txt
file2.txt
проблема в том что не могу привести тип int to string


std::string name;
int i;
name.append("file");
name.append((char)i);
name.append(".txt");


Отказывается работать вообще, как только не пытался уже подскажите плз что делать.

Ra$cal
11.09.2009, 00:01
юзай itoa.

Gin
11.09.2009, 00:05
Пробовал всеравно ругается

Ra$cal
11.09.2009, 00:18
и как же ты пробовал? O_o

string str = "";
char tmp [20];
itoa(10, tmp, 10);
str.append(string(tmp));
cout << str.c_str();

Gin
11.09.2009, 00:27
нет так не пробовал, решил проблему через sprintf

int i;
char*ch;
sprintf(ch, "%d", i);
name+=ch;

Ra$cal
11.09.2009, 00:59
char*ch;

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

Gin
11.09.2009, 02:01
2Ra$cal
окей пасиб щас переделаю.
ЗЫ
Не могу тебе '+' поставить за помощь т.к. тебе последнему ставил

razb
11.09.2009, 12:52
Возник еще вопрос
Вообщем нужно создать много файлов определенного содержания вида
file1.txt
file2.txt
проблема в том что не могу привести тип int to string
юзай stringstreams )

Mozy
11.09.2009, 14:12
Возник еще вопрос
Вообщем нужно создать много файлов определенного содержания вида
file1.txt
file2.txt
проблема в том что не могу привести тип int to string


Вот нашёл у себя в проектах

int func(int)
{
int port=42; //число которое будем преобразовывать
char buff[32];//буфер, если число большое то делай побольше, хотя и так уже 32 знака
char* ch; // то к чему приводим
ch = _itoa(port,buff,10); // супер фукц, которая все за нас делает,
//параметры:
//1) число для преобразования
//буфер для хранения
//радикс, ставь его = 10
//фкц возвращает тип char* потому просто присваиваем его ch
return 0;
}

intNet
11.09.2009, 22:32
Помогите найти ошибку в ф-ции:

function check_socks5(host: string; port: u_short; timeout: integer): BOOL;
var
s: TSocket;
addr: sockaddr_in;
buf: array[1..64] of char;
tv: TTimeVal;
data: string;
begin
result:=false;
s:= Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
If s = INVALID_SOCKET then exit;
tv.tv_sec:=timeout;
tv.tv_usec:=0;
setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, @tv, sizeof(TTimeVal));
FillChar(addr, sizeOf(sockaddr_in), 0);
Addr.sin_family:=af_INET;
Addr.sin_port:=hTons(port);
Addr.sin_addr.S_addr:=Inet_ADDR(pchar(host));
if Connect(s, addr, SizeOf(TSockAddr)) = SOCKET_ERROR then exit;
data:=#5#1#0;
if send(s, data[1], length(data),0) = SOCKET_ERROR then exit;
if recv(s, buf, 2, 0) = SOCKET_ERROR then exit;
if buf[1] <> #5 then exit;
if buf[2] <> #0 then exit;
data:=#5#1#0#3+chr(length(host))+host+chr(port div 256) + char(port mod 256);
if send(s, data[1], length(data), 0) = SOCKET_ERROR then exit;
if recv(s, buf, 2, 0) = SOCKET_ERROR then exit;
if buf[1] <> #5 then exit;
if buf[2] <> #0 then exit;
ShutDown(s, sd_Both);
CloseSocket(s);
result:=true;
end;

Функция должна возвращать true если прокся ок и false если прокся не ок.

Ra$cal
11.09.2009, 23:11
[c/c++] Новичкам: задаем вопросы
ты топиком точно не ошибся?

Большой джо
12.09.2009, 14:58
вот начал программировать на c++, немного разобрался, но не понимаю как сделать GUI, если кому не в лом, скиньте линк на книжку с описанием!))

BrainDeaD
12.09.2009, 15:10
в основном, gui делается с помощью библиотек, типа qt.
сейчас актуальна qt 4, но книги для неё я видел только в продаже и на англ(edit: давно не искал. уже есть на русском.).
у меня имеется книга по qt 3 на русском. чтобы понять сам смысл вполне достаточно.
если хочешь, залью.

Ra$cal
12.09.2009, 15:20
книг и на русском вполне достаточно. у меня на полке лежит -
http://www.books.ru/shop/books/527821
http://www.books.ru/shop/books/588549

Большой джо
12.09.2009, 17:40
у меня имеется книга по qt 3 на русском. чтобы понять сам смысл вполне достаточно.
если хочешь, залью.
Залей пожалуста!)

BrainDeaD
12.09.2009, 18:10
Залей пожалуста!)
no problem :)
http://slil.ru/27976419

Большой джо
12.09.2009, 18:17
Благодарю)) слушай, я скачал, qt3, пользуюсь прогой dev-cpp, или как то так, как библиотеку в неё вмазать?)

BrainDeaD
12.09.2009, 18:21
ты извини, я qt со времён qt 3 не занимался, не помню уже точно что по чём. тебе сюда (http://www.prog.org.ru/index.php?action=forum) , там тебе помогут.

Большой джо
12.09.2009, 18:23
ты извини, я qt со времён qt 3 не занимался, не помню уже точно что по чём. тебе сюда (http://www.prog.org.ru/index.php?action=forum) , там тебе помогут.
Ok!))

Hiro Protagonist
12.09.2009, 18:39
2Большой джо

Счас меня Ra$cal будет публично распинать опять, но вставлю свои пять копеек )). Имхо перед тем как использовать сторонии фреймворки для gui, необходимо сначала изучить средства предоставляемые winapi для создания оконных приложений. После этого можно уже будет самостоятельно оценить ту или иную гуи-библиотеку и выбирать уже самостоятельно. Поэтому имхо стоит почитать Петцольда или Финогенова к примеру. Разобраться как построена графическая подсистема, оконные сообщения, коллбэки и тд. После этого не составит труда разобраться в любой оконной библиотеке. Но это большое ИМХО. Ибо я дальше небольшого опыта юзания wxWidgets не ушел. Так что решать тебе.

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

#include "xxxx.h" (xxxx.h - должны быть расположена по знакомым компилятору путям)
и подключить в свойствах проекта (в разделе линковки) необходимые либы.

Hiro Protagonist
12.09.2009, 18:53
2Большой джо

Счас меня Ra$cal будет публично распинать опять, но вставлю свои пять копеек )). Имхо перед тем как использовать сторонии фреймворки для gui, необходимо сначала изучить средства предоставляемые winapi для создания оконных приложений. После этого можно уже будет самостоятельно оценить ту или иную гуи-библиотеку и выбирать самостоятельно. Поэтому имхо стоит почитать Петцольда или Финогенова к примеру. Разобраться как построена графическая подсистема, оконные сообщения, коллбэки и тд. После этого не составит труда разобраться в любой оконной библиотеке. Но это большое ИМХО. Ибо я дальше небольшого опыта юзания wxWidgets не ушел. Так что решать тебе.

Петцольд Ч. Программирование для Windows 95
http://www.softtime.ru/cpp_info/petzold.php
Не смотри, что настолько старая, про графику там не устарело. И да это лучшее по GUI, что когда-нибудь было написано.
Можно ещё наших поискать - Финогенова, Щупака и тд, нолучше ту, что я дал.

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

#include "xxxx.h" (xxxx.h - должны быть расположена по знакомым компилятору путям)
и подключить в свойствах проекта (в разделе линковки) необходимые либы.

Большой джо
12.09.2009, 18:58
2Большой джо

Счас меня Ra$cal будет публично распинать опять, но вставлю свои пять копеек )). Имхо перед тем как использовать сторонии фреймворки для gui, необходимо сначала изучить средства предоставляемые winapi для создания оконных приложений. После этого можно уже будет самостоятельно оценить ту или иную гуи-библиотеку и выбирать уже самостоятельно. Поэтому имхо стоит почитать Петцольда или Финогенова к примеру. Разобраться как построена графическая подсистема, оконные сообщения, коллбэки и тд. После этого не составит труда разобраться в любой оконной библиотеке. Но это большое ИМХО. Ибо я дальше небольшого опыта юзания wxWidgets не ушел. Так что решать тебе.

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

#include "xxxx.h" (xxxx.h - должны быть расположена по знакомым компилятору путям)
и подключить в свойствах проекта (в разделе линковки) необходимые либы.
Спс, гляну!)