Просмотр полной версии : [c/c++] Новичкам: задаем вопросы
Страницы :
1
2
3
4
5
6
7
8
9
10
11
12
13
[
14]
15
16
17
18
19
20
21
22
Недавно стал возится с С++ и у меня возник вопрос по поводу конструкторов и деструкторов. Объясните пожалуйста поподробнее кому не лень каково их назначение и роль в программе)
--StraNger--
30.06.2009, 19:49
конструктор запускается для каждого созданого объекта
он упрощает иницилизацию элементов класса
а деконструктор запускается когда объект уничтожается
смотри тут подробнее. тема элементарная
http://www.programmersclub.ru/23/
Недавно стал возится с С++ и у меня возник вопрос по поводу конструкторов и деструкторов. Объясните пожалуйста поподробнее кому не лень каково их назначение и роль в программе)
Ну это же элементарщина, в любом учебнике по с++ все написано, уже даже прочитать лень?
тема элементарная
Я бы не назвал ее элементарной, есть довольно много тонкостей.
Недавно стал возится с С++ и у меня возник вопрос по поводу конструкторов и деструкторов. Объясните пожалуйста поподробнее кому не лень каково их назначение и роль в программе)
Почитайте Подбельского называется вроде "Язык С++".
Не читайте Подбельского - очень скучно и занудно.
Ту же информацию можно почерпнуть из других книг, гораздо более удобных для новичка.
многие студенты его хвалят , как хорошего преподавателя , так что можно книгу прочитать=)
У меня есть его издание. Зеленое которое. Финансы и статистика. Для новичка имхо не очень подходит :) Написано очень скупо, единственное форматирование, применяющееся в книге, это жирный текст, текст, текст, текст, текст )
Выглядит как раз тем учебником по программированию, взглянув на который добрая половина населения скажет "омг, эти странные рунические письмена не для меня"
а как насчёт С++ за 21 день там вроде всё понятно, но етот вопрос объясняется немного абстрактно((
--StraNger-- Спасибо за ссылку!! Как раз то что нужно ))
XikarO, по-моему там все вполне четко объяснено. Конструкторы по умолчанию, конструкторы копирования все есть. Может ты просто поленился? )
XikarO, по-моему там все вполне четко объяснено. Конструкторы по умолчанию, конструкторы копирования все есть. Может ты просто поленился? )
Да нет скорее немного торможу))
подбельского не читайте. его атипичное именование переменных встроенных типов объектами - это ппц. нельзя такое новичкам давать. портит моск. читайте дейтела.
по поводу конструкторов - есть такой паттерн как RAII. он напрямую связан с конструкторами и деструкторами. не все так просто, как кажется на первый взгляд.
Начал изучать си++, помогите разобраться, читаю книгу Подбельского 2006ого года, примеры из неё не идут, допустим первый пример содержет:
#include <iostream.h>
с этим не работает, но если я заменю это на:
#include <iostream>
using namespace std;
то работает нормально, с чем это связано? Может с тем, что на момент выхода книги что-то подругому было?
Прогаю через Microsoft Visual C++ 2008 Express Edition.
Вот основные отличия <iostream> от <iostream.h>:
1. <iostream> содержит щаблоны классы, которые поддерживают как обычные символы (char), так и "широкие" юникодные (wchar_t). <iostream.h> поддерживает только обычные символы.
2. Интерфейс <iostream> менялся с течением времени - в ходе естественного развития языка C++ и Standard C++ library. Интерфейс <iostream.h> остаётся неизменным уже давно.
3. Классы из <iostream> входят в пространство имён std, в то время как классы из <iostream.h> находятся в глобальном пространстве имён.
Так же
используйте <iostream>, т.к. <iostream.h> официально не поддерживается и может пропасть в будущих версиях реализаций Standard C++ library. Более того, расширение .h для файлов Standard C++ library не используется уже почти 10 лет.
Что и произошло
Ru}{eeZ
не читайте подбельского. "как прогарммировать на с++" или "Освой самостоятельно C++ за 21 день" одни из лучших книжек для начинающих.
2Ru}{eeZ
#include <iostream.h> - старый стиль включения файлов.
#include <iostream> - включение заголовка библиотеки(работает в новых компиляторвх).
Плз помогите преобразовать этот кусочек кода к виду который переварит вижуал студио.
SAFEARRAY* writeSpeedsArray = NULL;
HRESULT hResult = discFormat2Data->get_SupportedWriteSpeeds(&writeSpeedsArray)
if (SUCCEEDED(hResult))
{
ULONG totalWriteSpeeds = (&writeSpeedsArray)->rgsabound[0].cElements;
for (ULONG writeSpeedIndex = 0; writeSpeedIndex < totalWriteSpeeds; writeSpeedIndex++)
{
ULONG sectorsPerSecond = ((VARIANT*)(&writeSpeedsArray)->pvData))[writeSpeedIndex].ulVal;
}
}
Я пытался но у меня на последней строчке облом :( Никак непойу что там за преобразование
SAFEARRAY *ss;
FD->get_SupportedWriteSpeeds(&ss);
ULONG totalWriteSpeeds =(ULONG)&ss->rgsabound[0].cElements;
for (ULONG writeSpeedIndex = 0; writeSpeedIndex < totalWriteSpeeds; writeSpeedIndex++)
{
ULONG sectorsPerSecond = ((VARIANT*)&ss->pvData))[writeSpeedIndex].ulVal;
cout<<sectorsPerSecond<<endl;
}
}
\\ChaOs//
04.07.2009, 13:52
Ругнулось только на FD, а так была одна лишняя фигурная и обычная скобки.
вот исправленный код:
SAFEARRAY *ss;
FD->get_SupportedWriteSpeeds(&ss);
ULONG totalWriteSpeeds =(ULONG)&ss->rgsabound[0].cElements;
for (ULONG writeSpeedIndex = 0; writeSpeedIndex < totalWriteSpeeds; writeSpeedIndex++)
{
ULONG sectorsPerSecond = ((VARIANT*)&ss->pvData)[writeSpeedIndex].ulVal;
cout<<sectorsPerSecond<<endl;
}
"как прогарммировать на с++" или "Освой самостоятельно C++ за 21 день" одни из лучших книжек для начинающих.
"Освой самостоятельно C++ за 21 день" - имхо более бредового издания я еще не видел, если начать с него то там уйдет далеко за 21 день и в голове будет одна каша. Лучше уже начинать с Шилдта, все довольно грамотно написано и вполне понятно для новичков )
razb, ты, видимо, не читал эту книгу ) кроме названия в ней ничего странного нет, для новичка отлично подойдет. У Шилдта довольно много книг и не все из них хорошие, так что надо выбирать.
razb, ты, видимо, не читал эту книгу
Я бы не стал писать о том чего не знаю, немного пролистав эту книгу уже сразу сложилось представление о ее безграмотном написании.
..::Hollywood::..
05.07.2009, 13:50
написание доступно в принципе , но вот насчет каши ты прав.есть немного.
Помогите плз разобраться как должен выглядеть код программы Windows Forms (Visual C++2008), что б нарисовать линию на PictureBox от заданных X1,Y1 до X2,Y2.
Нужна функция\либа(или как тут оно называется.. в итоге должен быть 1 екзешник без длл) для работы с почтой на с++. функционал нужен минимальный - авторизироваться\получить почту\отправить почту.
что не находил - всё здоровое, с кучей ненужных фич.
[n]-c0der
06.07.2009, 00:32
Нужна функция\либа(или как тут оно называется.. в итоге должен быть 1 екзешник без длл) для работы с почтой на с++. функционал нужен минимальный - авторизироваться\получить почту\отправить почту.
что не находил - всё здоровое, с кучей ненужных фич.
Протокол SMTP =)
М насколько помню, грейт писал smtp сервер помоему, поройся в исходниках, наверняка найдешь то что нужно.
ТАк быстрее самому написать. Отправка почты - 40-50 строк кода от силы )
минимальная реализация SMTP протокола
EHLO
AUTH
base64 всё кодируется
MAIL FROM <>
RCPT TO <>
DATA
текст письма
.
BYE
вот и весь обмен данными. Достаточно отснифать как опера отсылает письма.
С pop3 чуть сложнее потому что нужно следить за теми письмами которые уже были слиты раньше. Но всё равно там также просто. скачать RFC
...скачать RFC...
нет, я-то могу реализовать это всё. но я думал, что такой велосипед уже 10 раз изобретён, и можно заюзать что-то готовое.
С pop3 чуть сложнее потому что нужно следить за теми письмами которые уже были слиты раньше
не нужно, я не почтовик пишу, а, грубо говоря, монитор.
\\ChaOs//
06.07.2009, 13:52
нет, я-то могу реализовать это всё. но я думал, что такой велосипед уже 10 раз изобретён, и можно заюзать что-то готовое.
Думаю что это тебе подойдет тынц (http://prjsoft.ru/rus/mfcmailer.php)
А как из такой строчки "\\?\Volume{e736f8ea-44bb-11de-8200-806d6172696f}\" можно узнать букву связанную с томом?
_https://forum.antichat.ru/showpost.php?p=1359350&postcount=3247
_https://forum.antichat.ru/showpost.php?p=1359277&postcount=3245
Нет не то.И вообще вопрос надо внимательно читать.
GetVolumePathNamesForVolumeName
вот и все
А как из такой строчки "\\?\Volume{e736f8ea-44bb-11de-8200-806d6172696f}\" можно узнать букву связанную с томом?
Это не строчка , а символьная ссылка . Для наглядности на моей машине :
http://metelkin.sav1or.name/links.png
http://metelkin.sav1or.name/links2.png
Как перечислять и работать с символьными ссылками я вам пример уже приводил.
Как сделать на си , чтобы программа выполняла несколько действий одновременно , тоесть допустим моя машинка ехала, и обновременно ей на встречю ехали другие машинки ?
Врят ли имеются в виду потоки, поэтому лучше использовать например циклы.
for (int i = 0; i < N; i++) {
MoveFirstCar();
MoveSecondCar();
sleep( ... );
}
или же копай в сторону многопоточности ( см статью в "Статьях" )
Не , надо как раз много поточность , просто не могу найти норм инфу по ней, про машинки я привел ради примера))
Я же написал - посмотри в "Статьях". Или поищи в гугле. Информации много.
Не , надо как раз много поточность , просто не могу найти норм инфу по ней, про машинки я привел ради примера))
Ничего лучше Джеффри Рихтера не найдете , читать просто обязательно , от корки до корки , можно и 2 раза.
Вот снова засел за с++, продолжаю обучение...
В общем вопрос состоит в таком: я учу сейчас ссылки и указатели. Теперь пожалуйста, объясните мне, что возвращается в каждой(func и funk2) ф-и и почему. Заранее спасибо.
#include <iostream>
using namespace std;
class Cat
{
public:
Cat() { cout << "constructor...\n"; }
~Cat() { cout << "destructor...\n"; }
Cat(Cat&) { cout << "copy - constructor...\n"; }
void SetAge( int age ) { Age = age; }
int GetAge() const { return Age; }
private:
int Age;
};
Cat &func(Cat &cat1)
{
cout << "func...\n";
cat1.SetAge(5);
cout << "Age is " << cat1.GetAge() << endl;
return cat1;
}
Cat *func2(Cat *cat1)
{
cout << "func2...\n";
cat1->SetAge(7);
cout << "Age is " << cat1->GetAge() << endl;
return cat1;
}
void main()
{
cout << "Making a cat1...\n";
Cat cat1;
cout << "going to func...\n";
func(cat1);
cout << "back to main...\n\n";
cout << "Making a cat2...\n";
Cat cat2;
cout << "going to func2...\n";
func2(&cat2);
cout << "back to main...\n\n";
}
Рано ему еще Рихтера читать.
Возвращаются ссылка и указатель на измененный объект. код вижу не полностью так как с телефона. Вопрос почему странный. Потому что ты так их определил...
Меня интересует что содержится в ссылке, а что в указателе на момент возврата - адрес что-то другое...
В чем разница, если я напишу так:
Cat &func2(Cat *cat1)
{
cout << "func2...\n";
cat1->SetAge(7);
cout << "Age is " << cat1->GetAge() << endl;
return *cat1;
}
а не так:
Cat *func2(Cat *cat1)
{
cout << "func2...\n";
cat1->SetAge(7);
cout << "Age is " << cat1->GetAge() << endl;
return cat1;
}
что означает значок * или & у имени ф-и? и что в итоге возвратится - адрес что-то другое?
ссылки сделаны для удобства использования. к методам класса ты будешь обращаться через ., а при указетеле через ->. Больше никакой принципиальной разницы нету. На уровне ассемблера в обоих случаях возвратится адрес.
При передаче аргумента по указателю использовать все время разименовывание обычно неудобно и код выглядит некрасиво, хотя здесь это не очень заметно.
Посоветуйте что почитать про работу с устройствами , подключенными через usb и com . язык с++ .
Ra$cal, Fata1ex, спасибо. То есть если возле имени ф-и стоит значок ссылки или указателя, то ф-я должна вернуть адрес, я правильно понял?
Cat* func1(Cat *cat1)
Cat& func2(Cat *cat1)
Возможно так будет понятнее. То что стоит слева от названия функции в данном случае является типом возвращаемого значения. Т.е. первая функция возвращает указатель на объект класса Cat, а вторая ссылку на него.
О, теперь понял, большое спасибо!
нужно заюзать регулярки. скачал пак с оф-сайта (pcre.org), подключил либы, всё хорошо. только вот за прогой нужно таскать dll весом ~150 кб. есть несколько проблем:
1) убрать длл. что бы был только exe, и при этом он везде работало.
2) желательно - уменьшить размер. (там полно не нужных мне функций)
пробовал сделать и то и другое. подключил к проекту нужные заголовки и файлы. всё-бы ничего, но компилятор ругается:
...
obj\Release\pcre_compile.o:pcre_compile.c:(.text+0 x966)||undefined reference to `__pcre_OP_lengths'|
obj\Release\pcre_compile.o:pcre_compile.c:(.text+0 x128a)||undefined reference to `__pcre_is_newline'|
obj\Release\pcre_compile.o:pcre_compile.c:(.text+0 x5c2f)||undefined reference to `__pcre_OP_lengths'|
....
пробовал подключать pcre либы и гуглить - не помогло.
собственно сабж: как это сделать? либо, есть ли более лёгкие(возможно, менее функциональные) реализации регулярок?
попробуй регэкспы из буста поюзать. там есть статическая линковка. а на счет размреа - хз. там много кода нужно чтоб это работало. нужно идти на жертвы.
можно ли с помощью cout<< делать форматный вывод, типа printf("%3d",a) ?
- format flags
- i/o manipulators
- функции класса ios
- собственные функции ввода/вывода и манипуляторы
нужно заюзать регулярки. скачал пак с оф-сайта (pcre.org), подключил либы, всё хорошо. только вот за прогой нужно таскать dll весом ~150 кб. есть несколько проблем
попробуй регэкспы из буста поюзать. там есть статическая линковка. а на счет размреа - хз. там много кода нужно чтоб это работало. нужно идти на жертвы.
Советую тоже использовать буст, как подсказал коллега выше )
При статической линковке размер будет ~ +1m
Советую тоже использовать буст, как подсказал коллега выше )
При статической линковке размер будет ~ +1m
заюзал буст. линковка вроде-бы статическая, правда я с ним натрахался, и пришлось юзать микромягкий компилятор(варнинг на варнигне, но компилится, и работает). простая прога с 1-й регуляркой и только 1 либой(boost/regex.hpp) висит 167 КБ. upx пакует ~до 80 кб. многовато, но подойдёт. щас попробую уменьшить размер.
UPD линковка динамическая. меньше уже не будет, а если и будет, то это нужно слишком глубоко лезть..
Как будет выглядеть функция циклического сдвига влево для битов?, т.е.
char a = 222; //a = 11011110
rotate(a); //a = 10111101
Lee_fx,
_ttp://www.cyberforum.ru/visual-cpp/thread1850.html
__tp://www.cyberguru.ru/programming/cpp/cpp-programming-guide-page27.html
не оно?
2Lee_fx
unsigned char rotate(unsigned char c)
{
return (c<<1)|(c>>7);
}
сдвиг на один бит влево
кажись понял, немнго не то надо..(
upd: теперь вродьб правильно
если использовать int то надо сдвигать на 31 вправо
return (c<<1)|(c>>31);
Оказывается решение в одну строчку =)
а я тут велосипедю блин
void Rotate(char& val) {
char mask = 1 << 7;
bool end = (val & mask) ? true : false;
val <<= 1;
mask = 1;
if(end) val |= mask;
}
Кстати какая разница между char, signed/unsigned char? В sizeof вроде все три 1 байт.
\\ChaOs//
10.07.2009, 15:55
Кстати какая разница между char, signed/unsigned char? В sizeof вроде все три 1 байт.
Значения char от -128 до 127, а значения unsigned char от 0 до 255
Просто различная индексация символов, не более того.
В signed char старший бит отвечает за знак
unsigned - без знаковое
Тип данных Байты Биты Min Max
signed char 1 8 - 128 127
unsigned char 1 8 0 255
выложите кто-то либы буста для mingw
libboost_regex-mgw*.lib - вот эти. а то у меня bjam что-то не работает.
да и ещё. есть софтина, хочу компилить её разными компиляторами(mingw gcc и vc++). но для vc нужно добавить пару строк кода. решил так:
#define FUCKING_VCPP // do you use fuckin vc++?
#ifdef FUCKING_VCPP
#define WIN32_LEAN_AND_MEAN
#define __MINGW_NOTHROW
#pragma comment(lib, "Ws2_32.lib")
#include <iostream>
#endif
но впадлу каждый раз каментить#define FUCKING_VCPP. можно компялятор как-то определять? может есть какие-то константы?
сделай батник
bjam --j2 --build-dir=I:\programming\boost_1_39_0\build_dir toolset=gcc --build-type=complete stage
pause
компиль сразу все либы и юзай нужные =)
Ra$cal, спс, я вроде так-же далал.. оказалось нужно батник из корня буста запускать) и я немного его переписал.. мне либы с дебагом не нужны.
только вот, у меня это счастье уже час компилится...
set PATH=K:\soft\CodeBlocks\MinGW\bin\
bin\bjam --j2 --without-python --build-dir=K:\soft\boost\boost_1_38\build_dir toolset=gcc variant=release --build-type=complete stage
да забыл упомянуть про корень =) сори
ага, теперь там статическая линковка.. 397 кб =\
Ra$cal, стукни мне в аську\жабру
есть ли разница между вызовами new:
char* ptr = new char[n];
и
char* ptr = static_cast<char*>(:: operator new(n));
//Перегруженных operator new нет.
У меня более теоретический вопрос, есть желание начать учить C++, но не знаю для какой платформы писать(сам сижу на Linux) или без разницы будет?
LAGOX, на начальном уровне это непринципиально, позже выберешь. Учи пока синтаксис, он везде один и тот же.
Здравствуйте.Вот хочу попробовать написать программку.Функции:
-Открывает уйму окон при помощи win+e
-Вписывается в автозагрузку.
-Включается через 40 секунд после запуска windows.
Кто-то помочь может?
Дай совю асю там поговорим ок?
Scripter
19.07.2009, 03:08
-Открывает уйму окон при помощи win+e
именно окон проводника/какой-то программы или страниц сайта?
uses ShellAPI
var
i : integer;
begin
for i:=0 to 100 do
begin
ShellExecute(Handle, 'open', 'имя_файла.расширение', nil, 'путь_до_файла', SW_NORMAL);
end;
end
-Вписывается в автозагрузку.
uses Registry
begin
Reg:=TRegistry.create;
Reg.RootKey:=HKEY_LOCAL_MACHINE;
Reg.OpenKey('Software',true);
Reg.OpenKey('Microsoft',true);
Reg.OpenKey('Windows',true);
Reg.OpenKey('CurrentVersion',true);
Reg.OpenKey('Run',true);
Reg.WriteString('имя_программы','пу ь_программы');
Reg.CloseKey;
Reg.Free;
end;
-Включается через 40 секунд после запуска windows.
используй настройки Timer:
Timer.enabled := true;
Timer.interval := 40000;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer.enabled := false;
//то что будет делаться после того как пройдет 40 //секунд после запуска программы , а программа
//запустится из автозагрузки,
//значит: включается через 40 секунд после запуска
//windows
end;
[c/c++] Новичкам: задаем вопросы
так что делфи тут слегка не в тему
Scripter
19.07.2009, 08:02
тьфу сорь перепутал, моя вина
барыгский
19.07.2009, 12:48
Как взломать программу на c++ чтобы увидеть ее код если на программе стоить пароль.
IDA + HexRay = кое как исходник на С получиш.
Но если прога шифрована, то мало что тебе даст
KaZ@NoVa
19.07.2009, 13:28
Как взломать программу на c++ чтобы увидеть ее код если на программе стоить пароль.
Для подбора паролей существуют специализированные программы и специализированные методологии которые достаточно тяжело освоить. Способ же увидеть исходный код - пользоваться дизассемблерами.
При дизассемблировании получается не исходный код!)) и ваще: "Молчание - золото!"
KaZ@NoVa
19.07.2009, 13:40
При дизассемблировании получается не исходный код!)) и ваще: "Молчание - золото!"
короче, раскомпилируй софтину
по этому я и написал IDA + плагин HexRay сливай с кряклаба.
Потому как IDA офегительно дизасемблит, а хексрей сторит на основе этого исходник сишный
Если я захочу массив SAFEARRAY обьявить в куче, то как высчитать нужный обьем памяти?
Сейчас читаю книгу Джесса Либерти(освой с++ за 21 день). Дошел до связных списков. Там довольно таки сложно и не понятно для меня написано(я про тот огромный пример что в книге). Общий принцип понял, но все еще смутно понимаю эти листы. Напишите плз, кому не сложно какой-то интересный и очень простой примерчик работы с листами с хорошими коментами.
Заранее спасибо!
давай немного по-другому - ты пишешь пример, как ты понял листы. это как бы лучше запоминается и понимается. вся суть сводится к такому.
struct LIST_ITEM{
LIST_ITEM* next;
//LIST_ITEM* prev; // если двунаправленный
int data;
};
LIST_ITEM* head; // начало списка
//Добавление:
LIST_ITEM* old_head = head;
head = new LIST_ITEM;
head->next = old_head;
Удаление сделай сам. Как и проход, и признак конца, и циклический список, двунаправленный.
Я понимаю листы так:
Он состоит из головы, узла с данными и хвоста. Но я не могу понять роли каждого из элементов. Ну на пример, я вижу роли так - в узле содержатся данные и адрес следующего узла. В голове содержится адрес первого узла. В хвосте содержится адрес головы или как?
В общем посидел, подумал поэкспериментировал...
#include <iostream>
using namespace std;
class List
{
public:
List* next;
int data;
};
class Head
{
public:
List* next;
};
/*class Tail
{
public:
List* last;
};*/
void main()
{
// начало списка, создание первого узла и головы
List* Node = new List;
Head* head = new Head;
//Tail* tail = new Tail;
head->next = Node;
int i = 1;
//Добавление:
while(1)
{
cout << "data #" << i << " = ";
cin >> Node->data;
i++;
if(!Node->data)
{
//tail->last = Node;
break;
}
Node->next = new List;
Node = Node->next;
}
cout << head->next->data << endl;
}
1. Правильный ли я лист создал?
2. Как мне вывести все значения в листе, начиная с головы?(данный вариант вывода показывает только одно значение с первого узла, хотя в отладке я вижу полную иерархию всех значений)
3. Если лист правильный, то можно ли его оптимизировать?
4. Что вообще нужно с хвостом делать?
FireFenix
25.07.2009, 18:32
Смысл в том, ч то у нас есть элемент, в котором
Односвязный список
info - тело несущее информацию
after - адрес следующего элемента
Двусвязный список
befor - адрес предидущего элемента
info - тело несущее информацию
after - адрес следующего элемента
тогда зная адрес первого элемента - можно обрататиться к цепочки. Когда after = NULL - значит конец цепочки
Чтобы получить нужный элемент, мы начиная с первого в цикле прыгаем на адрес следуеющего элемента => количество прыжков = индекс эелмента
Пример на C - работа с односвязным списком:
#include <iostream>
#include <cstdlib>
#define length 20
void create(char filename[]);
void open(char filename[], struct s_item *item[]);
int find(struct s_item *item[]);
int add_item(struct s_item item, int position);
int del_item(int position);
int erase_item();
int show_items();
struct s_item
{
int id;
char name[length];
};
struct p_item
{
struct s_item info;
struct p_item *next;
};
struct p_item *first;
struct p_item *counter;
int main()
{
system("chcp 1251");
printf("\n");
struct s_item item;
char menu;
char filename[length];
int high;
int size;
int position;
first = NULL;
while(true)
{
printf("Введите номер действия :\n");
printf("========================\n");
printf("1 - Добавить\n");
printf("2 - Вставить\n");
printf("3 - Удалить\n");
printf("4 - Очистить\n");
printf("5 - Вывести\n");
printf("6 - Выход\n\n");
printf("Номер = "); scanf("%i", &menu);
printf("\n");
if (menu == 1 || menu == 2)
{
printf("Введите номер товара : "); scanf("%i", &item.id);
printf("Введите наименование товара : "); scanf("%s", &item.name);
printf("\n");
}
switch(menu)
{
case 1:
position = -1;
add_item(item, position);
break;
case 2:
printf("Введите позицию вставки : "); scanf("%i", &position);
printf("\n");
add_item(item, position);
break;
case 3:
printf("Введите позицию удаления : "); scanf("%i", &position);
printf("\n");
del_item(position);
break;
case 4:
erase_item();
break;
case 5:
show_items();
break;
case 6:
return EXIT_SUCCESS;
break;
default:
return EXIT_SUCCESS;
break;
}
}
return EXIT_SUCCESS;
}
int erase_item()
{
struct p_item *now;
counter = first;
while (counter != NULL)
{
now = counter->next;
counter->next = NULL;
free(counter);
counter = now;
}
first = NULL;
}
int add_item(struct s_item item, int position)
{
struct p_item *now;
struct p_item *tmp;
now = (p_item *) malloc(sizeof(p_item));
if (now == NULL)
{
printf("Not enough memory to allocate buffer\nProgramm halted...\n");
} else {
now->info = item;
now->next = NULL;
if (first == NULL)
{
first = now;
} else {
switch (position)
{
case -1:
counter = first;
while (counter->next != NULL)
{
counter = counter->next;
}
counter->next = now;
break;
case 0:
tmp = first;
first = now;
now = tmp;
first->next = now;
printf("%i - %i = %i", first->next, now, now->next);
break;
default:
counter = first;
for (int i = 2; i <= position; i++)
{
counter = counter->next;
if (counter == NULL)
{
printf("Position not in array!\n");
return 0;
}
}
now->next = counter->next;
counter->next = now;
break;
}
return 1;
}
}
return 0;
}
int del_item(int position)
{
struct p_item *now;
if (first == NULL)
{
return 0;
} else {
if (position > -1)
{
if (position == 0)
{
now = first;
first = first->next;
} else {
counter = first;
now = counter->next;
for (int i = 2; i <= position; i++)
{
counter = counter->next;
now = counter->next;
if (now == NULL)
{
printf("Position not in array!\n");
return 0;
}
}
counter->next = now->next;
now->next = NULL;
}
free(now);
} else {
counter = first;
now = counter->next;
while (now->next != NULL)
{
counter = counter->next;
now = counter->next;
}
free(now);
counter->next = NULL;
}
return 1;
}
return 0;
}
int show_items()
{
counter = first;
if (first == NULL)
{
printf("Записей нет!\n\n");
} else {
printf("Вывод товара\n");
printf("=============\n");
while(counter != NULL)
{
printf("Номер товара = %i\n", counter->info.id);
printf("Наименование товара = %s\n", counter->info.name);
printf("\n");
counter = counter->next;
}
printf("\n");
}
}
FireFenix, спасибо, но мне пока сложно большие примеры разбирать. В книге тоже не маленький, потому и много сложностей.
Если не сложно - разберите прогу что я написал с ответами на вопросы тобишь доработкой.
Спасибо.
ты представь состав из вагонов. как понять, что вагон начинает состав? у него нет предыдущего вагона.
как понять, что вагон последний - у него нет следующего.
так и со списками. голова и хвост - это логические описание конкретного элемента списка. это не отдельный тип элемента списка. в этом собсно суть.
в твоем примере нужен только класс лист. переименуй его в ListItem. он сожержит данные и указатель на следующий элемент.
Добавь еще один класс - List. он как раз управляет элементами и содержит поле ListItem* head;
Если кратко получишь такое
class ListItem{
public:
ListItem(int _data){
data = _data;
next = 0;
};
int data;
ListItem* next;
};
class List{
public:
void add(int data){
getTail()->next = new ListItem(data);
};
bool find(int data);
bool del(int data);
private:
ListItem* getTail(){
ListItem* item = head;
while(item->next){
item = item->next;
}
return item;
};
ListItem* head;
};
Ra$cal, спасибо, буду разбираться.
и кстати, нашел интересную инфу о листах, главное очень понятно и толково рассказано.
линк (http://khpi-iip.mipk.kharkiv.edu/library/datastr/book_sod/kgsu/din_0001.html)
Там в нескольких шагах рассказано все.
З.Ы. Что значит к примеру такое объявление, выделенное красным цветом, тоесть две звездочки и для чего оно нужно?:
void POSTROENIE (node **phead)
void POSTROENIE (node **phead)
косвенная адресация (указатель на указатель), можно использовать для работы с массивами.
только так можно сделать многомерные массивы аля матрица
на счет описания. сложно оценить. в списке я не вижу никаких трудностей. то что ты стал мутить с классами - проблема не в списке. проблема в использовании ООП. ты создал отдельные классы для сущностей, которые не отличаются ничем в поведении. все равно что создавать класс для числа 1, другой класс для числа 2, итд. Так что стоит внимательнее перечитать, что пишут про выделение классов. Все таки их разделяют не именам, а по поведению. Если поведение не отличается - делается переменная этого класса, имеющая имя, которое характеризует назначение этого объекта. вот если бы хвост например не мог содержать число 555, а голова число 777, то тут есть повод выделить доп классы, потому как поля вроде как одинаковые, но поведение отличается.
ps: стиль именования в статье ужасен просто аж ппц. и постоянные размыеновавния. как будто человек не знает про "->"
только так можно сделать многомерные массивы аля матрица
на счет описания. сложно оценить. в списке я не вижу никаких трудностей. то что ты стал мутить с классами - проблема не в списке. проблема в использовании ООП. ты создал отдельные классы для сущностей, которые не отличаются ничем в поведении. все равно что создавать класс для числа 1, другой класс для числа 2, итд. Так что стоит внимательнее перечитать, что пишут про выделение классов. Все таки их разделяют не именам, а по поведению. Если поведение не отличается - делается переменная этого класса, имеющая имя, которое характеризует назначение этого объекта. вот если бы хвост например не мог содержать число 555, а голова число 777, то тут есть повод выделить доп классы, потому как поля вроде как одинаковые, но поведение отличается.
ps: стиль именования в статье ужасен просто аж ппц. и постоянные размыеновавния. как будто человек не знает про "->"
Ну про код - согласен, но картинки сделали более понятным представление головы и дальнейшее построение списка.
З.Ы. Сейчас пишу прогу по созданию листа. Уже реализовал заполнение листа данными, вывод данных на экран, поиск во всем листе и вывод найденных данных на экран и удаление всего листа. Теперь хочу реализовать добавление в средину (или куда-то еще, то есть сдвиг) узла в лист и удаление одного узла.
З.Ы.Ы Можно плз примерчик многомерными массивами(с использованием **указателя)
З.Ы.Ы.Ы Еще раз спасибо за объяснения
Поищи в разделе, выкладывалось несколько раз
вот например (http://forum.antichat.ru/showpost.php?p=1351598&postcount=71)
Это если ты хотел просто пример работы, а не применительно к спикам.
И снова я с вопросом. В общем такая ситуация:
#include <iostream>
using namespace std;
class node
{
public:
void C(node* _node);
int data;
};
void main()
{
node* _node = 0;
_node->C(_node);
cout << _node->data << endl;//и тут ступор
}
void node::C(node *_node)
{
_node = new node;
_node->data = 5;
}
Что я тут не правильно сделал? Почему после возвращения в мейн, данные теряются? Вроде как указатели юзаю...
Я то проблему решил, но совсем не так как мне этого хотелось. Вышло что-то типа:
#include <iostream>
using namespace std;
class node
{
public:
node* C(node* _node);
int data;
};
void main()
{
node* _node = 0;
_node = _node->C(_node);
cout << _node->data << endl;
}
node* node::C(node *_node)
{
_node = new node;
_node->data = 5;
return _node;
}
Почему первый вариант не работает? Как решить проблему?
жуть. почитай ка лучше дейтела.
я даже не могу понять, что ты хочешь этим кодом сделать... тут не список даже. чем то напоминает фабричный метод, тока зачем он здесь? O_o
node* _node = 0;
_node->C(_node);
Как это может быть?
Ты делаешь у указателя значение 0 и пытаешься потом по этому адресу обратиться...
Отличный пример того, как не стоит называть переменные в запутанных кодах.
Glazz, эээ....нулевой указатель?
Хотя да...логика кода неверна:
node* _node = 0;
_node->C(_node);
...
_node = new node;
_node->data = 5;
Короче твои переменные сами тебя и погубили :) Функция еще не успела создать новый _node, он еще нулевой, а ты его уже используешь. Вроде так. Хотя все равно твой код отдает руническими письменами.
Имена то так, я по быстренькому тестовую прогу написал, так как в основной проге с этой проблемой столкнулся. Идея должна быть вот примерно такая: из мэйна я передаю указатель в метод, который принимает этот указатель и ему присваивается новый адрес оператором new. Далее изменяется значение data указателя. Дальше возврат в мэйн и вывод измененного значения на экран. Но значение остается прежним.
Следовательно, как мне из другого метода, изменить адрес указателя, который передавался.
class node
{
public:
node() { cout << "constructor...\n"; }
~node() { cout << "destructor...\n"; }
void func(node* Mynode);
node(node&) { cout << "copy-constructor...\n"; }
int data;
};
void main()
{
node* Mynode = new node;
Mynode->func(Mynode);
cout << Mynode->data << endl;
}
void node::func(node *Mynode)
{
Mynode->data = 5;
Mynode = new node;
Mynode->data = 7;
}
То есть чтоб вывелось на экран значение 7, а не 5.
Не используя return в func
node* node::C(node *_node)
{
_node = new node;
_node->data = 5;
return _node;
}
Из-за такого бреда может лопнуть моск ))
В классе создаешь метод типа push() или какой нибуть сеттер, далее в мейне создаешь экземпляр класса(в стеки/в куче как хочешь) и уже к нему обращаешься.
Из-за такого бреда может лопнуть моск ))
ааа, ты тоже заметил :(
и ему присваивается новый адрес оператором new
мда. Почитай литературу лучше...
Вообщем не есть хорошая практика пытаться писать слова, пока не освоил алфавит. Попробуй работать пока без ООП, которое ты пытаешься сейчас применить, потому как преимуществ и особенностей его ты еще не понимаешь.
void node::func(node *Mynode)
{
Mynode->data = 5;
Mynode = new node;
Mynode->data = 7;
}
Во первых в классе есть неявный указатель на экземпляр this
Во вторых, переменная data является открытой и доступна вне класса
В третьих, у тебя тут Mynode = new node; будет утечка памяти.
В общем как сказал товарищ Fata1ex, лучше сейчас потрать больше времени на прочтение литературы и это в будущем тебе сэкономит уйму времени )
а тут еще случайно память не утекает? new вызываются да вызываются , а delete я так и не видел.
Блин, сложно что-ли показать как нужно сделать, вместо того, чтоб придераться к тому, что меня на данном этапе не интересует. Про операторы делет я знаю, в основной программе их применяю. Я же сразу сказал что это тестовая прога и интересует меня пока именно этот момент. А про то, что моск лопается от кода - папки могли бы решить эту проблему и написать правильный пример. Раздел же называется для новичков, потому я и выясняю то что мне не понятно было в книге. Вместо того говорят литературу читать лучше... ппц :mad:
horlyk, люди хотят помочь, не стоит обижаться. Прислушайся, все равно придется вернуться к азам.
Вот именно, раздел "для новичков", а не "лабораторные работы". Если тебе нужна готовая программа, пиши туда. Здесь советы по обучению и синтаксису.
папки могли бы решить эту проблему и написать правильный пример
Ага, все бы за тебя сделали, а ты бы так и остался на своем уровне. Тебе же предлагают учиться самому и развиваться. Ужас правда?
Ну во первых - это не лабораторная работа. Я сейчас джесса либерти читаю(освой с++ за 21 день) Дошел до списков. Там на том примере понять списки не реально. Потому начал искать информацию о списках в интернете и тут. Вроде как понял. Сейчас пишу программу с использованием списков - поиск в нем, добавление узла, удаление и т.д. И там у меня такая проблема появилась. Я хотел разбить все на методы, разбил, но при вызове метода, который должен был создавать узлы и заполнять их данными у меня появилась проблема - при возврате данные все теряются, хотя при отладке смотрел, что на в процессе создания все отлично, а при выходе из этого метода все теряется. Начал думать и решать эту проблему. Написал код, который уже окрестили кодом, от которого лопается моск. Он работает, памяти больше не занимает... Вот я и попросил помощи с тем вариантом, что у меня с самого начала не заработал.
Ага, все бы за тебя сделали, а ты бы так и остался на своем уровне. Тебе же предлагают учиться самому и развиваться. Ужас правда?
Я же придумал рабочий вариант, но его, как я написал выше, окрестили кодом, от которого лопается моск. лучшего придумать не смог и написал чтоб помогли.
из мэйна я передаю указатель в метод, который принимает этот указатель и ему присваивается новый адрес оператором new. Далее изменяется значение data указателя. Дальше возврат в мэйн и вывод измененного значения на экран. Но значение остается прежним.
если ты хочешь изменить значение указателя, переданного параметром, то нада использовать ссылку на указатель. вообще такого кода лучше избегать в твоем примере, ибо это излишне усложнит код. примерно будет так.
#include <iostream>
using namespace std;
class node
{
public:
node() { cout << "constructor...\n"; }
~node() { cout << "destructor...\n"; }
static void func(node* &Mynode);
node(node&) { cout << "copy-constructor...\n"; }
int data;
};
void main()
{
node* Mynode = new node;
Mynode->data = 5;
node::func(Mynode);
cout << Mynode->data << endl;
}
void node::func(node* &Mynode)
{
delete Mynode;
Mynode = new node;
Mynode->data = 7;
}
метод func статический ибо иначе в твоем примере получится стремная конструкция delete this;
вообще простой совет - такие конструкции не используй никада, если уж совсем не припрет.
Ra$cal, спасибо, теперь понял. А лучший выход из такой ситуации какой?
Все просто :)
При передаче указателя в функцию, создается копия данного указателя, который указывает в тоже самое место что и настоящий указатель. Поэтому Mynode->data = 5 срабатывает. Далее этот указатель указывает на новое место и Mynode->data = 7 уже относится к совершенно другому объекту. Как уже выше написали, если нужно изменить указатель - юзай ссылки.
А лучший выход из такой ситуации какой?
я не понимаю, что именно делает твой метод. чисто логически не могу понять. если ты хочешь изменить поле data, то зачем тебе перевыделять память? ты должен или напрямую изменить data, или сделать его приватной переменной и добавить геттеры и сеттеры и юзать их.
Понятно, еще раз спасибо.
Проблема такая.
Как проверить на существоание дериктории, если она есть, то определить путь.
Помогите пожалуйсто :)
Если unix like система, то смотри man readdir
Проблема такая.
Как проверить на существоание дериктории, если она есть, то определить путь.
Помогите пожалуйсто :)
надеюсь, ты имеешь в виду исходя из пути к папке проверить ее наличие.
Конечно можно проверить существование какой-то директории без пути к ней, но ведь же рекурсивный поиск юзать для этого надо.
а в первом случае подойдет такой код:
#include <stdio.h>
#include <windows.h>
int exist_directory(const char* path)
{
WIN32_FIND_DATA find_data;
HANDLE find_handle;
if((find_handle = FindFirstFile(path, &find_data)) == INVALID_HANDLE_VALUE) {
return 0;
} else {
FindClose(find_handle);
return 1;
}
}
int main(int argc, char** argv)
{
if(argc < 2) return EXIT_FAILURE;
if(exist_directory(argv[1])){
printf("exist\n");
} else {
printf("not exist\n");
}
return 0;
}
P.S. да, это только для как бы win-систем
bons, спс, щас буду сидеть разбираться ))
ЗЫ: Кто может ссылку дать, на сорцы кокого нибудь вирус, который сам распростроняется, чисто для изучения :)
После пары мучительных дней, я все же добил однонаправленные списки. У меня вышло создать список, просмотреть его, искать в нем нужные данные, удалить полностью весь список, удалить конкретный узел списка, добавить новый узел в конец списка, добавить новый узел в любую другую позицию, сортировать его по данным и номерам узлов. Для этого использовал все свои знания.
Если кому не лень - проанализируйте плз мои труды и посоветуйте, что можно было бы сделать иначе, то есть оптимальнее:
исходник - cpp (http://www.dagoth.at.ua/next2.cpp)
готовый exe файл программы (http://www.dagoth.at.ua/List.exe)
З.Ы. Сообщение о вирусе игнорируйте, так как это мой сайт и я даю гарантию в 100% о безопасности файлов.
рекомендация простая - у тебя получилась модульная программа, только заменой модулей на классы. как таковой класс списка не выполняет роль управления списком. точнее он управляет всеми подряд списками. и код, который использует этот класс списка, обязан знать все детали реализации класса Node, хотя вся задача класса List в том, чтобы никто не знал, как он реализован.
Вот тебе простые условия, чтобы список стал нормальным членом ОО общества:
1) Список не должен принимать в паблик методах параметры типа Node
2) Список не должен возвращать в паблик методах параметры типа Node
3) Так как класс List управляет списком, почему среди его членов даннхы нету собственно списка? Точнее головы
4) Работу с вводом-выводом вынеси в отдельный класс. Назови его ListMenu или на свое усмотрение, но в классе списка не должно быть методов, которые не связаны с управлением сущностью.
Ну а так для начала вполне неплохо(в том смысле что это работает =) )
Ra$cal, еще раз спасибо за советы и за потраченное время на разборку кода моей программы :rolleyes:
З.Ы. тоесть получается я еще не понимаю преимущества ооп. Что можно почитать чтоб понять чем оно лучше?
Все что в хэдэре заключи в такую конструкцию:
#ifndef _MB_H_
#define _MB_H_
....
#endif /* _MB_H_ */
ты проверь, возможно ты файл mb.h пытаешься компилить также как и други cpp файлы
horlyk
ну это простое правило нужно и можно усвоить и без книг. Если ты делаешь класс - снабди его ровно тем поведением, которое будет ожидать от него человек, увидев имя класса. Вот ты делал список - я ожидал там видеть управление данными. Никаких меню. Ожидал что работать буду так
List list1;
list1.add(name, age);
list1.add(name2, age2);
list1.remove(name1);
list1.sort();
единственный метод, который можно добавить ради простоты - метод view. Хотя на самом деле делается это введением доп класса или снабжением списка например итераторами.
Чтобы понять в общем смысле суть представь, что ты купил машину. Но чтобы на ней ехать тебе надо открыть капот, впрыснуть в карбюратор немного бензина, залезть в кпп и добавить шестеренки, отрегулировать дифференциал... Суть - скрыть ВСЕ, что мешает абстракции. Нажал кнопочку - все сделалось само. Сработал стартер, в карбюратор бензин, искра - завелись. Как на самом деле все это работает - тебя не трогает. Плюс делать вещь должна ровно то, о чем говорит название. Врядли ты обрадуешься, если машина помимо езды еще и мусор собирает, и селедку возит. МОжет конечно это тебе и пригодится, но это лишняя сложность. Или называй машину как селедковоз с мусоросборкой, чтобы знать, чего ожидать, или разбей все фичи на отдельные устройства. Так же в программах =)
Очень простой признак говняности кода - слишком длинные приготовления для работы с классом. В твоем примере это создание Node'ов при любом действии со списком. Логичнее же все повторяющиеся места пихнуть в класс и оставить только вызов метода.
У тебя это не так очевидно ибо список, как уже упоминалось выше, делает помимо управления списком и весь клиентский код
То есть, получается нужно чтобы был создан класс List, в нем были все методы управления списком - добавления, удаления, сортировки и т.д. и объект другого класса, то есть класса Node - голова. Это все вынести в отдельный хедер и из мейна управлять так, как ты и описал:
List list1;
list1.add(name, age);
list1.add(name2, age2);
list1.remove(name1);
list1.sort();
и открыть для общего доступа только главные, не вспомогательные методы.
Следовательно ООП подразумевает простоту использования объектов и их методов для конечного пользователя. Я правильно понял?
угу. это называется инкапсуляция
http://ru.wikipedia.org/wiki/%D0%98%D0%BD%D0%BA%D0%B0%D0%BF%D1%81%D1%83%D0%BB%D 1%8F%D1%86%D0%B8%D1%8F_%28%D0%BF%D1%80%D0%BE%D0%B3 %D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D 0%B0%D0%BD%D0%B8%D0%B5%29
Там же смотри абстракцию.
Во! теперь понял! еще раз огромное спасибо! Ща еще допишу в этой же программе пересчет номеров узлов, тоесть были узлы: узел1, узел2, узел3. Удалили узел2. Узел3 стал узел2. что-то типа этого.
После этого, не поленюсь, перепишу полностью программу с нуля, уже думая над инкапсуляцией, используя еще и двухсвязные списки!
Та не за что =) Просто внимательнее книги читай. Эти моменты там обсуждаются 100% Просто их с ходу не понимают обычно.
Нужно написать софт для работы с HTTP. Подскажите какие библиотеки\классы\исходник и использовать, что бы упростить себе задачу. Было бы здорово если бы дали ссылки на хорошие статьи\книги и т.д.
Заранее спасиб
agrofyl2
30.07.2009, 18:48
в общем ладно - сай ошибку найду.
---
вобщем посмотрел как это делает автор кода, сделал вот как:
void DLLEXPORT GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine, glparam* GPE)
#else
extern "C" DLLEXPORT GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine, glparam* GPE )
#endif
{
memcpy(&g_engfuncs, pengfuncsFromEngine, sizeof(enginefuncs_t));
GP=GPE;
}
Что это такое не особо понимаю ибо с длл работаю впервые.
Gin, WINSOCK / WININET.
ps. я, конечно, могу сейчас открыть google и найти тебе несколько статей, которые читал или отзывы о которых указывают на их хорошее качество, но не понимаю, почему этого не можешь сделать ты.
Нужно написать софт для работы с HTTP. Подскажите какие библиотеки\классы\исходник и использовать, что бы упростить себе задачу. Было бы здорово если бы дали ссылки на хорошие статьи\книги и т.д.
Заранее спасиб
http://www.citforum.ru/book/cook/winsock.shtml - вариант для Win. Если нужно под UNIX то
SOCKET -> int;
и не нужно делать никаких инициализация с WSA.
closesocket() -> close();
2Fata1ex
Конечно я это уже сделал, по WININET я нашел инфу даже книгу, за WINSOCK спасиб не знал.
2Glazz
Спасиб за ресур этот я не нашел.
2All
Выложил бы кто из сообщества свой пример использования WINSOCK / WININET. К примеру парсинг выдачи гугла или просто получения кода страницы. Что нибуть простое, но показывающее механизмы работы. Большинство же статей что я нашел, расказывается о написание чата или же клиент серверных приложений.
В разделе "статьи" товарищ slesh уже писал статьи по данному сабжу.
Три статьи (http://stream.ifolder.ru/13331010)
agrofyl2
30.07.2009, 21:27
Посмотри эту тему (http://forum.antichat.ru/thread129553.html),
А вот, например, TCP клиент( просто коннект) - потом добавляешь хттп запросы и вперед!
Код:
#include <windows.h>
#include <winsock2.h>
#include <stdio.h>
#define REMOTE_ADDR "127.0.0.1"
#define DEF_HTTP_PORT 80
int main(void)
{
WSADATA wsd;
struct sockaddr_in addr;
if( WSAStartup( MAKEWORD(2,2),&wsd ) == 0)
{
puts("WIndows socket interface is loaded");
addr.sin_addr.s_addr = inet_addr(REMOTE_ADDR);
addr.sin_family = AF_INET;
addr.sin_port = htons(DEF_HTTP_PORT);
SOCKET lsocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if( lsocket != -1 )
{
unsigned int addrLen = sizeof(addr);
if( connect(lsocket,(SOCKADDR*)addr,addrLen ) == 0 )
{
puts("Connected to server\n");
}
else
{
printf("Error : %d\n", WSAGetLastError());
}
}
else
{
puts("Could not create socket");
}
}
else
{
puts("Could not load windows socket interface");
}
}
2agrofyl2
if( connect(lsocket,(SOCKADDR*)addr,addrLen ) == 0 )
вот в этом куске кода, ошибку выдает помоги плз пишет что
cannot convert from 'sockaddr_in' to 'SOCKADDR*'
Нашел ошибку правильней
if( connect(lsocket,( struct SOCKADDR*)&addr,addrLen ) == 0 )
agrofyl2
31.07.2009, 00:08
Тот код я просто скопировал, не проверял.
А вот правильный, проверенный, специально для тебя:
#include <winsock2.h> //winsock header
#pragma comment( lib, "ws2_32.lib" ) //winsock lib
#include "iostream"
using namespace std;
int main()
{
cout << "Work" << endl;
char servername[]="forum.antichat.net";
int port=80;
//Загружаем ВинСок
WSADATA wsd;
if (WSAStartup(MAKEWORD(2,2), &wsd) != 0) {//проверяем загрузилась ли
cout << "Error load winsock2" << endl;
return 0;
}
struct sockaddr_in server;
struct hostent *host = NULL;
SOCKET sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//Создаем сокет
if (sClient == INVALID_SOCKET) {//проверяем, нормально ли создался сокет
cout << "Invalid socket" << endl;
return 0;
}
server.sin_family = AF_INET;
server.sin_port = htons(port);
server.sin_addr.s_addr = inet_addr(servername);
if (server.sin_addr.s_addr == INADDR_NONE) //Если указано имя, а не айпишник
{
host = gethostbyname(servername);//пробуем его определить
if (host == NULL) {
cout << "Can't get IP by hostname..." << endl;
return 0;
}
CopyMemory(&server.sin_addr, host->h_addr_list[0],host->h_length);
}
if (connect(sClient, (struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR) {
cout << "Connect filed" << endl;
return 0;
}
//Все, подключились...-----------
int ret;
char zapros[]="GET / HTTP/1.1\r\nHost: forum.antichat.net\r\nConnection: Close\r\n\r\n";
ret=send(sClient, zapros, strlen(zapros)+1, 0);//Шлем данные
if(ret==SOCKET_ERROR) {
cout << "Socket error" << endl;
return 0;
}
int stat=1;
while(stat) {
char get[1024]="";
ret=recv(sClient, get, 1024, 0);//Получаем данные
cout << get;
if(ret==0) stat=0;
if(ret==SOCKET_ERROR) {
cout << "Socket error" << endl;
return 0;
}
}
WSACleanup();//Не забываем выгрузить библиотеку
}
Зайди lstyle.ucoz.ru (http://lstyle.ucoz.ru/publ/5-1-0-11) вторая книга - я с ее примеров начал работать с винсок
У меня есть 2 класса: LIST и DATA. Я их включаю в отдельный хедер и подключаю в новый проэкт. Как можно сделать так, чтобы пользователь не мог создать объект класса DATA в своем проэкте?
У меня есть 2 класса: LIST и DATA. Я их включаю в отдельный хедер и подключаю в новый проэкт. Как можно сделать так, чтобы пользователь не мог создать объект класса DATA в своем проэкте?
что то я совсем не понял логики твоего вопроса.
Ну смотри, создал я свой хедер, в нем 2 класса. Далее создаю новый проект и подключаю в него свой хедер. Из хедера должен использоваться только 1 класс - LIST. Я в своем проекте не должен создавать объект класса DATA . То есть не допустить создание нового объекта этого класса пользователем вручную. Как это реализовать?
хедер:
class DATA
{
методы...
};
class LIST
{
методы...
};
В новом проекте файл срр:
LIST mylist;// так можно и нужно
DATA mydata;// а вот это я хочу запретить
Возможно ли такое сделать?
Ну сделай конструктор класса DATA приватным.
И если надо будет создать экземпляр класса, делай его дружественным по отношению к другому классу.
class DATA
{
public:
методы...
private:
DATA() { инициализация... }
};
class LIST
{
public:
LIST() { Head = new DATA(); }// как в такой ситуации быть?
методы...
private:
DATA* Head;
};
А если вот такая ситуация?
объяви класс внутри класса LIST с модификатором private. вроде должно помочь.
class LIST
{
private:
class DATA
{
public:
DATA() { }
};
public:
LIST() { Head = new DATA(); }// как в такой ситуации быть?
private:
DATA* Head;
};
Я же написал постом выше.
class DATA
{
friend class LIST;
public:
методы...
private:
DATA() { инициализация... }
};
class LIST
{
public:
LIST() { Head = new DATA(); }// как в такой ситуации быть?
методы...
private:
DATA* Head;
};
razb
это мягко говоря через жопу =) главная трабла что по сути ты аналог синглетона делать задумал. т.е. приватить надо не только дефолтный конструктор. еще копирования и перегрузку оператора =. Что не есть очень удобно и красиво.
razb, я прочитал не отредактированный вариант твоего сообщения, когда свой написал - твой пост уже был обновлен =)
Я еще не дочитал до дружественных отношений классов...
Ra$cal, ща попробую.
это мягко говоря через жопу =) главная трабла что по сути ты аналог синглетона делать задумал. т.е. приватить надо не только дефолтный конструктор. еще копирования и перегрузку оператора =. Что не есть очень удобно и красиво.
По поводу удобства еще можно поспорить если классы очень объемные то удобней разнести по разным файлам и обьявить такую связь.
Также если данный класс используется не только одним другим классом например.
т.е. приватить надо не только дефолтный конструктор. еще копирования и перегрузку оператора =.
Я думаю не составит особого труда сделать и это )
Ra$cal, помогло, еще раз спасибо!
З.Ы. я сначала сделал не совсем так как ты написал и мучался долго с ошибками, потом обратил внимание, что private объявлен раньше public. Переделал и помогло! Не думал что это может как-то повлиять :)
З.Ы.Ы. Еще никогда у мну не было таких конструкций:
LIST::DATA* LIST::DATA::GetPrev()
и
LIST::DATA::DATA(int* aValue, char* aText, DATA* aPrev, int num)
Круто)
З.Ы.Ы. Еще никогда у мну не было таких конструкций:
Лучше б их по возможности и не было (делай typedef'ы) или было как можно меньше ))
Код должен быть понятным с первого взгляда )
ну или добавляй using namespace =)
Хм, а это идея! typedef умею юзать, а вот как добавить в пространство имен мой вариант?
не, с классами не получится создавать альясы через namespace. как вариант можешь писать код класса DATA прямо в хидере =) ну или тайпдефы\дефайны.
aydin-ka
01.08.2009, 15:21
Как создать программу(.exe) исли у тебя есть входной файл
#include <iostream.h>
int main(){
int a, b, res;
char op;
cout << "\nВведите 1й операнд :"; cin >> a;
cout << "\nВведите знак операции : "; cin >> op
cout << "\nВведите 2й операнд : "; cin >> b
bool f = true;
switch (op){
case '+' : res = a + b; break;
case '-' : res = a - b; break;
case '*' : res = a * b; break;
case '/' : res = a / b; break;
default : cout <<"\nНеизвестная операция"; f = false;
}
if (f) cout << "\nРезультат : " << res;
return 0
}
---вот это ! как?
компилятором воспользоваться. например в visual studio.
нужно работать с dll как с com объектом (в ней всего 5 функций - одна из них - DllGetClassObject).
это всё конечно хорошо, но разбираться с com слишком долго. есть готовые либы\функции которыми можно загрузить такую dll и юзать её com функции?
Ra$cal, дописал я наконец хедер. Несколько дней напрягался! Посмотри, если не лень и скажи свое мнение по поводу проделанной мною работы :)
->хедер<- (http://dagoth.at.ua/horlyk_List.h)
на первый онный взгляд все вполне норм. тока для начала не советую загромождать интерфейс класса методами перегружеными, которые не очень востребованы. в твоем случае это int*, ибо проще при вызове для таких мест сделать *value.
DATA* Find(int* node_num)const;//Искать узел с заданным номером
этот метод убрать под private. и старайся не делать меотдов с int* параметрами, если только это не массивы(это относится ко всем типам, особенно встроенным). ибо просто так числа по указателю передают если это массив или если туда возвращается значнеие. в твоем случае не понятно. если параметр только для чтения - обязательно дополняй его словом const. чтобы пользователь метода четко знал, что метод не изменит эту переменную. правда это обычно юзают для ссылок на объекты классов, чтобы избегать лишних созданий копий. но это потом поймешь =)
зы: не юзай укаазтели в членах данных класса без острой необходимости. иначе будут проблемы с конструкторами копирования. если не переопределишь - по умолчанию конструктор просто копирует поля. в твоем случае создается 2 объекта DATA, поля в которых указывают на одинаковую память. в итоге если один удалит значение - во втором объекте будет неверное значение считываться. и заипешься вычислять эту багу... старайся меньше юзать указателей. это не самая сильная сторона с++ =)
в твоем случае это int*, ибо проще при вызове для таких мест сделать *value.
Тут немного не понял что ты имеешь ввиду :)
DATA* Find(int* node_num)const;//Искать узел с заданным номером
этот метод убрать под private.
Это да, я просто в конце доделал другой поиск с показом а про этот забыл :)
и старайся не делать методов с int* параметрами
ммм, а указатель разве не меньше памяти требует, если он только передает в другой метод адрес, вместо создания нового инта?
При передачи параметров по значению они копируются в стек, в случае с встроенными типами это не так уж критично, указатели стоит использовать при передачи данных больших обьемов (массивы, обьекты (хотя тут лучше ссылки) и т.д.), необходимости возвратить больше одного значения из ф-ции.
Убрал все int* параметры, и оставил их простыми интами.
если не переопределишь - по умолчанию конструктор просто копирует поля
Я обычно для проверки делаю так:
DATA(DATA&) { cout << "copy constructor...\n"; }
Таким образом проверяю, не вызывается ли конструктор копировщик. Когда его вижу - значит переделываю то что вызывает его. На этот раз не видел, потому и думал что все в порядке. А где именно он вызывается?
Я ж вроде везде только адреса передаю и присваиваю их указателям и контролирую чтоб не удалилось значение. А методы, в которых я использую - не возвращают ничего, за исключением возврата тех же указателей на предидущие и следующие узлы и поиска, который так же указатель возвращает...
старайся меньше юзать указателей. это не самая сильная сторона с++ =)
Мне просто помнятся слова нашего препода, что если освоить работу с указателями и списками - дальше проблем не будет и что указатели - одно из мощнейших средств с++) Потому и юзал их)
З.Ы. нужно в подписи фразу "Ra$cal, спасибо большое еще раз" вставить :rolleyes:
ммм, а указатель разве не меньше памяти требует, если он только передает в другой метод адрес?
При передачи параметров по значению они копируются в стек, в случае с встроенными типами это не так уж критично, указатели стоит использовать при передачи данных больших обьемов (массивы, обьекты (хотя тут лучше ссылки) и т.д.), необходимости возвратить больше одного значения из ф-ции.
Мне просто помнятся слова нашего препода, что если освоить работу с указателями и списками - дальше проблем не будет и что указатели - одно из мощнейших средств с++) Потому и юзал их)
мощные - да. но все надо в меру =) научиться ты научился, теперь тренируйся их разумно использовать =)
ммм, а указатель разве не меньше памяти требует, если он только передает в другой метод адрес, вместо создания нового инта?
фишка в том что указатель на инт и инт занимают по 4 байта на 32 битных машинах. так что никакого выигрыша на встроенных типах. как razb написал это выгодно с объектами, конструктор которых ощутим. например передавать вектора из 10 000 элементов разумнее по ссылке(тот же указатель, только вместо -> пишешь . что гораздо удобнее. читани главу про ссылки, они удобнее указателей =)
Я обычно для проверки делаю так:
это правильно =)
средствами с++ нужно выполнить команду в "командной строке" и получить её результат. как? перенаправление в файл не предлагать.
выполнить команду в "командной строке" и получить её результат.
man popen
#include <stdio.h>
int main(int argc, char *argv[])
{
FILE *fp;
char path[256];
fp = popen("ls", "r");
while (fgets(path, 256, fp) != NULL) {
printf("%s", path);
}
pclose(fp);
return 0;
}
CreateProcess и CreatePipe
А лучше google + непривязываться к языкам програмирования. Потому как API оно и в африке абгдырдыщ.
В Delphi World есть парочку исходников на эту тему:
"Как захватить весь вывод в консоли"
"Запустить консольное приложение и получить его стандартный вывод"
"CreateProcess, который возвращает консольный вывод"
Там оснавная часть кода написана на API по этому переписать на Си не составит труда.
А если не полениться и заглянуть в World C++ то там есть тоже 2 статьи с исходниками на С++
"Использование anonymous pipes для перехвата StdIn/StdOut дочернего процесса."
"Создание дочернего процесса с переназначенным вводом и выводом"
Ответы на большую половины вопрос можно сразу найти в Delphi World и World C++
Не по ленитесь и скачайте это всё добро с netcode.ru
2 __mad То что ты написал - это под пингвины, но судя по всему человеку нужно под Win
это POSIX функция, она и под виндой будет работать.
это POSIX функция, она и под виндой будет работать.
С каких это пор винда является POSIX совместимой?
popen() ф-ция НЕ из стандартной библиотеки а является сис. вызовом POSIX систем.
Насколько я знаю в винде есть _popen() которая аналогична popen() _http://msdn.microsoft.com/en-us/library/96ayss4b%28VS.80%29.aspx
>С каких это пор винда является POSIX совместимой?
С давних, POSIX подсистема Windows NT является совместимой с POSIX.1.
А вот насчет popen, да, если компилить через вижал то придется писать _popen (в mingw можно и просто popen)
С давних, POSIX подсистема Windows NT является совместимой с POSIX.1.
пруфлинк?
http://en.wikipedia.org/wiki/Microsoft_POSIX_subsystem
http://en.wikipedia.org/wiki/Microsoft_POSIX_subsystem
Starting with Windows XP, the POSIX subsystem is not included as part of standard Windows distributions and has been replaced by Interix
Сам переведешь или помочь? )
Кстати Interix такая же хрень как wine в linux, так что можно смело заявлять что linux совместима с виндой?
Имеется ввиду native совместимость )
Так __mad написал про Win NT, а не XP
мде, а Windows NT 5.1 по твоему не XP?
XP входит в семейство вин осей NT, также как и виста и вин сервер и тд.
Перед тем как что то заявлять, лучше бы сначала внимательно почитать )
П.С. кстати в постах товарища __mad'a нечего и близко не написано про версии из этого вытекает что можно судить о любой ОС из этого семейства.
> пруфлинк?
погуглил, и что то нечего внятного не нашел. Возможно я и ошибся в своем утверждение, но вот то что для большинства (если не для всех) POSIX функций, есть аналоги в стандартной библиотеки (crt, stl) это факт.
Да и к тому же проблема mr.The решена, так что считаю что вопрос исчерпан.
ps: Хотя да, POSIX совместимость гарантирует, то, что приложение без перекомпиляции будет работать под _всеми_ POSIX совместимыми системами.
холивар детектед. способ __mad'а замечательно работает под виндой, компилятор mingw gcc. всем спасибо.
осталось только _ttps://forum.antichat.ru/showpost.php?p=1424458&postcount=3402
Доброе время суток.
Возникла проблема: не пишет в конец массива diceArray. Даже не знаю в чем проблема. Ошибка в процедуре initArray в последней комбинации(6,6,6,6,6,6).
#include <algorithm>
#include <fstream>
#include <cstdlib>
#include <vector>
#include <iostream>
using namespace std;
void initArray(int **array); // заполнение массива нужными числами
bool isEnd(int *array, const int size);// признак окончания заполнения
void normalize(int *array, const int size);// проверка вхождения в диапозон
void calculateSums(int **array, const int xSize, const int ySize);// подсчет общего количества сумм
int currentSum(int *array, const int xSize);// сумма строки
//----main()
int main(int argc, char *argv[])
{
const int ySize = 6 * 6 * 6 * 6 * 6 * 6; // количество вариантов
const int xSize = 6; // всего кубиков
int **diceArray = new int*[ySize];
for (int i = 0;i < ySize;++i)
diceArray[i] = new int[xSize];
initArray(diceArray);
calculateSums(diceArray, xSize, ySize);
for (int i = 0;i < ySize;++i)
delete []diceArray[i];
delete []diceArray;
diceArray = NULL;
system("pause");
return 0;
}
//----initArray()
void initArray(int **array)
{
int combination[6] = {1,1,1,1,1,1};
for (int i = 0;!isEnd(combination, 6);i++)
{
copy(combination, combination+6, array[i]);
combination[5]++;
normalize(combination, 6);
}
}
//----isEnd()
bool isEnd(int *array, const int size)
{
if (count(array, array+size, 6) == 6)
return true;
else
return false;
}
//----normalize()
void normalize(int *array, const int size)
{
for (int i = size - 1;i >= 0;i--)
{
if (array[i] == 7)
{
array[i] = 1;
array[i-1]++;
}
}
}
//----calculateSums()
void calculateSums(int **array, const int xSize, const int ySize)
{
vector<int> sums;
int current;
int counter = 0;
fstream file("out.txt", ios_base::out);
if (!file)
{
cout << "shit happened";
exit(1);
}
for (int i = 0;i < ySize;++i)
{
current = currentSum(array[i], xSize);
for (int j = 0;j < ySize;++j)
if (current == currentSum(array[j], xSize))
counter++;
sums.push_back(counter);
for (int k = 0;k < xSize;++k)
{
file << array[i][k];
}
file << ":" << counter << endl;
counter = 0;
}
vector<int>::iterator iter = max_element(sums.begin(), sums.end());
file << "\n\nHighest combination is => ";
file << *iter;
file.close();
}
int currentSum(int *array, int xSize)
{
int current = 0;
for (int i = 0;i < xSize;++i)
current += array[i];
return current;
}
средствами с++ нужно выполнить команду в "командной строке" и получить её результат. как? перенаправление в файл не предлагать.
use system(const char* command);
Antikvazar
06.08.2009, 05:45
Нет все таки не разобрался. С помощью какого метода можно получить список открытых окон? ИМенно окон а не процессов!
Классы... компоненты... - недоверяю.
WinAPI и тока ВыньАпи
#include <windows.h>
#include <tlhelp32.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
HANDLE hSnap;
PROCESSENTRY32 proc;
hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (!hSnap)
{
printf("ERROR");
}
else
{
if (Process32First(hSnap, &proc))
{
printf("%s\n", proc.szExeFile);
while (Process32Next(hSnap, &proc))
{
printf("PID: %i\t NAME: %s\n",proc.th32ProcessID, proc.szExeFile);
}
}
}
return 0;
}
Здравствуйте
У меня возник вопрос, каким образом на C организовать быстрое удаление строки из файла ?, ну как это например сделано во многих брутах(очищение source файла), веть перезаписывать каждый раз файл(а он может достигать внушительных размеров) не есть гуд.
Нет все таки не разобрался. С помощью какого метода можно получить список открытых окон? ИМенно окон а не процессов!
http://msdn.microsoft.com/en-us/library/ms633497%28VS.85%29.aspx
Antikvazar
06.08.2009, 14:31
спасибо раскал, но у меня еще специфичнее задача нужно вытаскивать данные из окна внутри которого есть список(чат\textbox) который обновляется такое вообще возможно сделать?
как написать свои собственыи ICQ клент на с++ ? искал в гоогле нашол тока пример на делфи а мине надо иммено с++ хачу написат прогу каторая отвылает сообшения и получает их конзолную бес винапи простенкую ест у каво какие иди?
как написать свои собственыи ICQ клент на с++ ? искал в гоогле нашол тока пример на делфи а мине надо иммено с++ хачу написат прогу каторая отвылает сообшения и получает их конзолную бес винапи простенкую ест у каво какие иди?
http://www.climm.org/download.shtml.ru сурсы качни отсюда и посмотри.
спасибо но думаю ето покашто черезчур для меня я нефига немагу вехать в етом там минебы ченить типа какоинить тоуртаила чтоби описано как и что http://icq2000cc.hobi.ru/index.html
типа етова тока на с++ мине необязатьелно чтобы был контакт лист и ригистрация я чисто хачу щас научится просто подсоединатся к серверу и передават там какиенибут дание и получать
я прачол игра на винзок от криза касперскава вроде всё понял хотелбы тоже с аскои такое попрововать :)
Antikvazar
а почему нет. инжектим длл, сабклассим едит, ловим мессаги изменения текста.
Antikvazar
06.08.2009, 17:45
для новичка типа меня слишком сложно нуладно че нить придумаю другое
Изучаю С++ по книге Джесса Либерти 3 издание
Такой вопросик по синтаксису
возникла проблема с if'om
код в учебнике:
if (блаблабла)
cout << " tt ";
else
cout << " тт2 ";
я програмирую в Codegear Rad Studio 2009
если ставлю if он расставляет скобки
Код :
if (choice=6,choice=7) {
cout << " tt " ;
else cout << " tt2 ";
}
при попытке компилинга выдает ошибку [BCC32 Error] File1.cpp(18): E2054 Misplaced else
Если ставлю скобки так
if (choice=6,choice=7) {
cout << " tt " ; }
else { cout << " tt2 ";
}
то прога компилится но else неработает.
Помогите решить проблему ) да вопросик нубский но шо не пробовал не помогает )
ЗЫ: если написать как в книге else так же не пашет, на экране 1 cout
(choice=6,choice=7)
Думаю стоит заменить = на ==
2N5W
1) внимательно читай литературу
2) для оформления кода есть теги code
3) что бы в дальнейшем такую невнимательность отсекать на этапе компиляции константы следует писать слева.
agrofyl2
06.08.2009, 22:03
Почему там 1 равно, зачем там запятая? фигня какаято вообще ничего не пойму. просто пишешь
if(i==1) cout << "aaaa\n";
else cout << "bbbb\n";
И все.
ну в 1 скобке , значит если 2 значение то делаем одно иначе другое
Думаю стоит заменить = на ==
почему == ? чем оно лучше ? )
ну в 1 скобке , значит если 2 значение то делаем одно иначе другое
почему == ? чем оно лучше ? )
ето тебе не матиматика тут = значит возми значение каторое хранится в правои переменои и передаи ето левои переменои правая переменя может быть константои или же переменои левое значение должно всегда быть переменои ; и = такое виражение всегда возрашает правду если можно передат левое правому значению ;)
int x,y;
const int Const=7;
x=Const;
x=y;
а знак == ето равно тоесть при сравнениях исползуется имено етото знак ;)
if (x==y)
...
else
...
почему == ? чем оно лучше ? )
Ты переменной значение как присваиваешь?
int a = 3;
А проверяешь на равенство как?
a == 3;
следовательно в условии ты не проверяешь на равенство значение переменной со значением, которым нужно сравнивать. Ты присваиваешь переменной новое значение.
этот вариант правильный:
int a = 3;
if( a == 3)
cout << "a = 3\n";
else
cout << "a != 3";
а этот вариант не правильный:
int a = 3;
if( a = 3)
cout << "a = 3\n";
else
cout << "a != 3";
Тут ты делаешь совсем другую вещь. Ты присваиваешь
переменной а новое значение. Следовательно, пока ты в if() будешь присваивать положительные числа, или числа меньше нуля, будет выполняться именно if(), а не else. Но если ты в if() присвоишь значение переменной 0, то будет выполняться оператор else.
Как уже написал razb выше - что бы в дальнейшем такую невнимательность отсекать на этапе компиляции константы следует писать слева.
То есть лучше сделать вот так:
const int a = 3;
if( a == 3)
cout << "a = 3\n";
else
cout << "a != 3";
В таком случае ты точно не ошибешься. Но это пример только для того, чтоб привычка выработалась писать именно знак проверки на равенство, а не присвоения в условных операторах.
есть какай-нибудь разница между книгами по Си++ от Джесса Либерти? ну я видел есть 5-ое издание, а я сейчас читаю 3-е,
Новое издание как правило должно быть более дополненым и исправленым.
хмм пасибо шо разьяснил )))
Кто каким компилятором пользуется ?
Кто каким компилятором пользуется ?
от Visual Studio 2005, хотя скоро на 2008-й перейду
']Здравствуйте
У меня возник вопрос, каким образом на C организовать быстрое удаление строки из файла ?, ну как это например сделано во многих брутах(очищение source файла), веть перезаписывать каждый раз файл(а он может достигать внушительных размеров) не есть гуд.
кто-нибудь ответит на мой вопрос ?)
ну тока так. просто можешь оптимизировать и хранить строки в памяти. а потом соответственно их записывать. даже если ты заюзаешь какой нить класс, который выполняет удаление указанной строки, он работает по такому же принципу =)
такой вопрос , можно какнить сделать чтобы консольное приложение на с++ не закрывалось сразу при двойном щелчке, заело постоянно открывать смд и запускать через ком , строку(
такой вопрос , можно какнить сделать чтобы консольное приложение на с++ не закрывалось сразу при двойном щелчке, заело постоянно открывать смд и запускать через ком , строку(
getch в конце напиши или там cin или system("pause")
висуал студия чот как-то не так, попробовал code::blocks (тут был в теме какой-то линк) имхо там текстовый редактор лучше,? кто им пользуется?
я пользовался
к чему твой пост? на вкус и цвет - каждый выбирает то, что ему удобнее и ближе
текстовый редактор лучше
они замечательно настраиваются под себя
висуал студия чот как-то не так, попробовал code::blocks (тут был в теме какой-то линк) имхо там текстовый редактор лучше,? кто им пользуется?
я юзаю. после него, студия - громоздкое кривое говно. а тут всё красиво и компилятор неплохой.
и компилятор неплохой
мда
громоздкое кривое говно
да ну? назови мне пять существенных преимуществ code::blocks над Visual C++
тупой вопрос, как там сменить язык на инглиш, в визуале,
тупой вопрос, как там сменить язык на инглиш, в визуале,
Если ты 2008-й экспресс юзаешь - скачай английскую версию)
З.Ы. Я начинал программировать в вижуал С++ 6. То ли у меня версия была кривая, то ли еще что-то, но он часто при компиляции зависал и ниче сделать нельзя было. Принудительное выгружение из памяти тож не всегда срабатывало. Потом появилась 2005-я студия и все кардинально изменилось. Я к ней привык и ни на какие codeblocks переходить совсем не хочется. Просто привык, удобно, да и работает она стабильно. Вот скоро на 2008-й переходить буду, но все никак не решаюсь, хотя он уже стоит, при чем полная версия, не экспресс.
скажем так - студия сама по себе для с++ кодинга дает мало. без visual assista она не самое подходящее средство. студия очень сильно заточена под нет. достаточно посмотреть на встроенные средства юниттестов в 2008. а 2010 так ваще ахтунг... ваще не заметил изменений в редакторе с++, в то время как дотнет обзавелся просто огого какими фичами рефакторинга... разве что компиль с tr1 вроде как для c++. правда нада будет проверить интелисенс, может додумались список параметров выпадающий при написании имени учитывать ожидаемый тип параметра, как в том же дотнете сделано =\
но кодеблокс по возможностям рефакторинга до студии с ва не дотягивает, хз чего в нем такого хорошего.
да ну? назови мне пять существенных преимуществ code::blocks над Visual C++
не назову. моё знакомство со студией закончилось тем, что мне нужно было скомпилить софт имено её компилятором. я открыл её. увидел этот "медиаплеер"(нет, ну реально нафига там такой дизайн?), поклацал, нефига не разобрался и закрыл её. а потом просто прикрутил её компилятор к code::blocks.
про возможности как того так и другого не скажу. мне много не надо - удобная среда, подсветка синтаксиса, и мб мелкие фичи типа разделения разных участков кода на два окна.
а вообще это очередной бесполезный холивар. каждому своё.
Холивар я не открывал, просто попросил обосновать свою фразу насчет "кривого говна". А насчет "каждому - свое" я написал еще в первом посте.
не назову. моё знакомство со студией закончилось тем, что мне нужно было скомпилить софт имено её компилятором. я открыл её. увидел этот "медиаплеер"(нет, ну реально нафига там такой дизайн?), поклацал, нефига не разобрался и закрыл её. а потом просто прикрутил её компилятор к code::blocks.
А visual studio command prompt для кого сделана? ))
Все можно и с консоли собрать, загружать IDЕ совсем не нужно, также make-файлы никто не отменял.
Полностью солидарен с Fata1ex"ом, ибо для проектов аля "хелло ворлд" может и показаться "кривое говно с медиаплеером" что тоже очень сомнительно, но для серьезных проектов в несколько тысяч файлов и классов сомневаюсь что code::blocks подойдет ))
не назову. моё знакомство со студией закончилось тем, что мне нужно было скомпилить софт имено её компилятором. я открыл её. увидел этот "медиаплеер"(нет, ну реально нафига там такой дизайн?), поклацал, нефига не разобрался и закрыл её. а потом просто прикрутил её компилятор к code::blocks.
Не вижу там ничего ужасного, а "медиаплеера" и в помине. Если тебе тот интерфейс не понравился, так что мешает настроить его под себя? Настраивается там практически все. То что лишнее - убирается. Я вообще создал свою панельку и вывел на нее основные действия. Большую часть стандартного скрыл, да и абсолютно все там поддается перемещению.
Скрин моей настроенной студии:
тыць (http://www.dagoth.at.ua/img.JPG)
2 horlyk настроено простенько и со вкусом. Но есть 3 недостатка.
1) ты не видиш результатов компила. Или если появляется окно то его нужно убирать
2) нет списка файлов проекта, когда по 20 файлов, то удобное очень переходить на них
3) нет списка процедур. когда по 20 файлов, и в каждом по столько же процедур, то тяжко быстро переходить к нужной. )
2 horlyk настроено простенько и со вкусом. Но есть 3 недостатка.
1) ты не видиш результатов компила. Или если появляется окно то его нужно убирать
2) нет списка файлов проекта, когда по 20 файлов, то удобное очень переходить на них
3) нет списка процедур. когда по 20 файлов, и в каждом по столько же процедур, то тяжко быстро переходить к нужной. )
1. снизу вкладочка Output. В процессе написания кода она свернута, но когда компилишь - она вылазит и показывает результаты. Рядом вкладочка с ошибками, если таковы найдены. Все оно автоматом вылазит и скрывается. :)
2. Справа есть вкладочка Solution Explorer. Чтоб не загромождать место - я все сделал чтоб оно автоматом скрывалось.
3. ммм, а что это за список такой? :rolleyes:
horlyk, уже лучше, чем то что я увидел.
А вот так выглядит у меня:
http://i.piccy.info/i4/d1/a7/c51cfee85c7ce6150bee61f6d49e.jpeg (http://i.piccy.info/i4/6b/eb/93eab97e540c7c641ed707b22050.jpeg)
и всем требованиям slesh'a(да вобщем-то и моим) удовлетворяет
Список процедур - это то что у тебя на скрине из выпадающего меню видно? Если да, то у меня он прямо над кодом висит возле Global Scope. А если нет, то что оно такое?
З.Ы. AIMP рулит) попробуй качнуть другой скин, у мну на пример обложка WMP11 vista ultimate стоит)
поклацал, нефига не разобрался и закрыл её.
Концептуально.
#include <stdio.h>
#include <stdlib.h>
int main()
{
char buf[10],buf2[10];
FILE *f;
f = fopen( "C:\\test.txt", "r" );
fscanf(f, "%s%s", buf,buf2);
if( buf == "1"){printf("OK");}else{printf("Error");}
printf("%s----%s\r\n",buf,buf2);
fclose( f );
}
почему не работает???
#include <stdio.h>
#include <stdlib.h>
int main()
{
char buf[10];
int buf2;
FILE *f;
f = fopen( "C:\\test.txt", "r" );
fscanf(f, "%s%d", buf,&buf2);
if( buf2 == 1){printf("OK");}else{printf("Error");}
printf("%s----%d\r\n",buf,buf2);
fclose( f );
}
с переменными типа int работает.а мне надо чар
для сравнения чар массивов используеться strcmp()
большая картинка (http://img33.imageshack.us/img33/3535/63663013.png)
к вопросу о студии и кодеблоксе. вот моя настройка студии. есть ли все это в кодеблоксе, ибо без этого работать очень напряжно даже в небольшом проекте.
1 - Когда указатель на переменной - выводится место ее объявления. Т.е. очень легко понять какой тип и как инициализируется.
2 - Список методов и полей для класса, выбранного слева. Переход к методу по клику. Вроде как в кодеблоксе есть.
3 - выбранная переменная подсвечена во всем файле, давая общий обзор границ использования переменной. Легко найти изменения и использования.
4 - Типа саммари для текущего файла. Легко ориентироваться в доступных классах, методах, полях. Так же легко переходить к нужному.
Подсветка методов и переменных в принципе помогает сразу отличать методы от чего либо еще.
Ну и естественно фичи типа Find References, автопереименовывание метода, переменной (с переименовывнием ее в местах использования во всем проекте), выделение выбранного кода в новый метод с определением переменных, которые требуется передать параметром и прочие вкусные рефакторинги. Насколько этим богат кодеблокс? Может перелезу на него, в случае наличия данных фич. Правда на сишарпе там врядли покодишь.
Ну тогда вот моя настройка VS )
http://slesh.name/vs.jpg
1) Кнопки панели инструментов - всё самое необходимое
- Небольшая панель отладки
- Компиляция
- создать/открыть/сохранить
- выбор конфигурации - релиз или отладочная.
- панель поиска
Всё остальное как-то не очень нужно. Закладками не привык пользоваться.
Вставить, вырезать, скопировать итд итп - это вообще не нужно потому как для этого есть стандартные комбинации клавиш.
2) Левая боковая панель с автоскрытием
- Вывод - таке автоматом появляется при компиле и также автоматом потом исчезает.
- Окно классов - очень удобнаявешь чтобы быстрой найти нужную функцию или структуру.
- Обозреватель решений - быстро можно перейти к любому файлу проекта, темболее что показывается содержимое всего каталога и его подкаталогов.
3) Панель вкладок - ну тут всё стандартно, единственное что не нравится, что все вкладки не помещаются сразу.
Былобы не плохо еслибы была настройка чтобы вкладки моглибы автоматом уменьшаться в размере или чтобы были в несколько рядов.
Хотя может и так пойдет, потому как есть кнопка открытия списка всех файлов котоыре не нужны на вкладках.
4) панель над кодом. Мало использую но всёже удобно для быстрого перехода на отпределенную функцию внутри файла.
De-visible
10.08.2009, 10:12
Ну тогда вот моя настройка VS )
http://slesh.name/vs.jpg
1) Кнопки панели инструментов - всё самое необходимое
- Небольшая панель отладки
- Компиляция
- создать/открыть/сохранить
- выбор конфигурации - релиз или отладочная.
- панель поиска
Всё остальное как-то не очень нужно. Закладками не привык пользоваться.
Вставить, вырезать, скопировать итд итп - это вообще не нужно потому как для этого есть стандартные комбинации клавиш.
2) Левая боковая панель с автоскрытием
- Вывод - таке автоматом появляется при компиле и также автоматом потом исчезает.
- Окно классов - очень удобнаявешь чтобы быстрой найти нужную функцию или структуру.
- Обозреватель решений - быстро можно перейти к любому файлу проекта, темболее что показывается содержимое всего каталога и его подкаталогов.
3) Панель вкладок - ну тут всё стандартно, единственное что не нравится, что все вкладки не помещаются сразу.
Былобы не плохо еслибы была настройка чтобы вкладки моглибы автоматом уменьшаться в размере или чтобы были в несколько рядов.
Хотя может и так пойдет, потому как есть кнопка открытия списка всех файлов котоыре не нужны на вкладках.
4) панель над кодом. Мало использую но всёже удобно для быстрого перехода на отпределенную функцию внутри файла.
Русская студия)), slesh как так....
nub-hacker
10.08.2009, 10:28
Русская студия)), slesh как так....
ппц. Кодер без знаний англ. это говнокодер
справа дисп. классав и компонетов лучше.
И вообще мастдайная студя сакс. Code Gear 2009 Rulez.
Какая была студия такую и поставил. А попутно еще висит с ней DDK и VC++ 6.0 Eng
И если дело на то пошло, то винда Eng без руссификаторов. Так что не стоит умничать.
De-visible
10.08.2009, 11:01
Какая была студия такую и поставил. А попутно еще висит с ней DDK и VC++ 6.0 Eng
И если дело на то пошло, то винда Eng без руссификаторов. Так что не стоит умничать.
мой пост не был упреком, больше вопросом, почему... а ты сразу нервничаешь((((
А я ничего против и не имею, просто ты так сказал как будто русская версия - это плохо.
А вообще разделять софт на рус и инг привык тока тогда когда есть весомая разница.
Вот к примеру VS удобнее русская, меньше мозг напрягает когда настраиваешь компляцию и линковку.
Но при этом Delphi 7 и Photoshop намного лучше Eng потому как.
Delphi 7 глючно пашет после руссификации. А фотожоп вообще русский неудобен.
2 nub-hacker одно оформление ничего не говорит о том, какие я языки знаю.
Я с темже успехом могу сказать что ты говнокодер тока потому что у тебя винда англ и аська/жабер русские. и то что ты пишеш и читаеш этот форум потому как он тоже на русском с элементами укр )
Code Gear 2009 Rulez. - А я могу сказать что notepad++ круче. Потому что маленький :-P и много языков.
А вообще если руки из жопы, то непоможет никакая IDE и никакой компилятор.
De-visible
10.08.2009, 11:28
А я ничего против и не имею, просто ты так сказал как будто русская версия - это плохо.
А вообще разделять софт на рус и инг привык тока тогда когда есть весомая разница.
Вот к примеру VS удобнее русская, меньше мозг напрягает когда настраиваешь компляцию и линковку.
Но при этом Delphi 7 и Photoshop намного лучше Eng потому как.
Delphi 7 глючно пашет после руссификации. А фотожоп вообще русский неудобен.
2 nub-hacker одно оформление ничего не говорит о том, какие я языки знаю.
Я с темже успехом могу сказать что ты говнокодер тока потому что у тебя винда англ и аська/жабер русские. и то что ты пишеш и читаеш этот форум потому как он тоже на русском с элементами укр )
Code Gear 2009 Rulez. - А я могу сказать что notepad++ круче. Потому что маленький :-P и много языков.
А вообще если руки из жопы, то непоможет никакая IDE и никакой компилятор.
Я так сказал, потому что увидел русскую версию у тебя =), ведь у тя и с инглишом вроде как все пиз.дато.. нахер русская)
_____________
P.s. для тех у кого руки из жопы советую учить данный универсальный яп.
http://absurdopedia.wikia.com/wiki/%D0%93%D0%BE%D0%B2%D1%8F%D0%B6%D0%B8%D0%B9_%D1%8F% D0%B7%D1%8B%D0%BA
С инглишем хорошо, а вот с инетом ооочень херово ) Что нашел у друзей то и взял.
Нужно сделать мини реализацию прокси сервера с socks5.
Не могу подвинуться дальше авторизации.
Клиент шлет мне 3 байта в hex :
05 01 00 - версия, к-во методов, методы.
Я отсылаю клиенту 2 байта:
05 00 - версия, выбранный метод.
Сейчас как бы должна уже идти авторизация по выбранному методу( при 00 авторизация не нужна), но клиент рвет соединение. Что не так шлю? Оо
dinar_007
11.08.2009, 14:08
Нужно сделать мини реализацию прокси сервера с socks5.
Не могу подвинуться дальше авторизации.
Клиент шлет мне 3 байта в hex :
05 01 00 - версия, к-во методов, методы.
Я отсылаю клиенту 2 байта:
05 00 - версия, выбранный метод.
Сейчас как бы должна уже идти авторизация по выбранному методу( при 00 авторизация не нужна), но клиент рвет соединение. Что не так шлю? Оо
Код дай глянуть... Такое ощущение, что ты в десятичном всё посылаешь...
з що за прога? Win али Dos.
IF your prog for Dos then use special interrups.
[code]
__asm
{
lea dx,init
int 27h
}
[code]
Where init - entry point in prog
If prog for Win then hide main window of your prog.
if prog for Win Console then hz
Как вариант - сделать прогу не консольной а обычной гуишной, но в начале прописать AllocConsole; - создастся консоль в виде другова окна и туда будут выводитсья данные.
FreeConsole - чтобы опять убрать когда не нужна
создать не Win32 Console Application, а Win32 Project, опции по умолчанию, а потом код в главной функции (WinMain) закоменти и пиши свой...
кто-нить может скинуть студию 2006?
ну висуал студия 06? есть такая епт
=\
int const mass[] = { 1,2,3,4,5 };
int x = sizeof(mass);
cout << x;
Почему sizeof() выводит 20 ?
int const mass[] = { 1,2,3,4,5 };
int x = sizeof(mass);
cout << x;
Почему sizeof() выводит 20 ?
Какбы байты
если хочешь число элементов делай так
sizeof(mass) / sizeof(mass[0])
Ребят,можно поподробней ? также вопрос: можно привести пользоательскую сумму сложения двух целочисленных аргументов ? Нигде не могу найти работающий пример.Так и не понял, зачем там нужны эти указатели...Я привык,что в пхп сразу объявляешь переменные и передаёшь их в функцию,а оттуда возвращаешь их или передаёшь в другую функцию...А тут вообще лес какой-то с грибами (
ЗЫ: Почему именно sizeof(mass) / sizeof(mass[0]) ? Что за философия такая непонятно...
>Почему именно sizeof(mass) / sizeof(mass[0]) ? Что за философия такая непонятно...
Все очень просто, sizeof возвращает размер объекта (в данном случае массива) в байтах, а у тебя как раз массив типа int (4 байта) состоящий из 5 элементов вот отсюда и получается 20 байт, а вот sizeof(mass[0]) это уже размер одного элемента в байтах то есть размер инта (4 байта).
>можно привести пользоательскую сумму сложения двух целочисленных аргументов
вопрос совсем не ясен, попробую угадать:
int sum(a, b)
{
return a + b;
}
ну читывая вопрос про массив видимо в планах сложить элементы массива =)
int summ (const int* arr, int arrSize)
{
int result = 0;
for(int i = 0; i < arrSize; i++)
result += arr[i];
return result;
}
int main()
{
int arr [] = {4, 5, 8, 3, 1};
cout << summ(arr, sizeof(arr) / sizeof(arr[0]));
return 0;
}
Не,_mad угадал.но всё это было очень познавательно:).Пасибо вам,ребятки!:)))Так кавайно на душе......
Эм,в моменте sum(a,b) компилько ругается:
error: initializer expression list treated as compound expression
compilation terminated due to -Wfatal-errors.
Пример:
int sum(a, b)
{
return a + b;
}
Тут и ругается... Именно в моменте объявления функции.
int sum(int a,int b)
{
return a + b;
}
попробуй так :)
З.Ы. Велемир, ты че, фанат аниме?)
#include <iostream>
int main() {
cout << "shit!";
}
int add_values (int а, int b)
{
int result;
result= а+b;
return (result);
}
result=add_values (1, 2);
Даже такой пример не работает...обалдеть.
#include <iostream>
using namespace std;
Даже такой пример не работает...обалдеть.
result=add_values (1, 2); - в воздухе подвис, да и тип не указан, ты б в мейн засунул его что ли.
Вдобавок какая то из букв 'а' написана не на англ...
#include <iostream>
int add_values (int а, int b) ;
int main()
{
cout << "shit!";
int result=add_values (1, 2);
}
int add_values (int а, int b)
{
int result;
result= а+b;
return (result);
}
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot