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

XikarO
30.06.2009, 19:33
Недавно стал возится с С++ и у меня возник вопрос по поводу конструкторов и деструкторов. Объясните пожалуйста поподробнее кому не лень каково их назначение и роль в программе)

--StraNger--
30.06.2009, 19:49
конструктор запускается для каждого созданого объекта
он упрощает иницилизацию элементов класса

а деконструктор запускается когда объект уничтожается
смотри тут подробнее. тема элементарная
http://www.programmersclub.ru/23/

razb
30.06.2009, 20:05
Недавно стал возится с С++ и у меня возник вопрос по поводу конструкторов и деструкторов. Объясните пожалуйста поподробнее кому не лень каково их назначение и роль в программе)
Ну это же элементарщина, в любом учебнике по с++ все написано, уже даже прочитать лень?

Fata1ex
30.06.2009, 20:06
тема элементарная
Я бы не назвал ее элементарной, есть довольно много тонкостей.

_antony
30.06.2009, 20:10
Недавно стал возится с С++ и у меня возник вопрос по поводу конструкторов и деструкторов. Объясните пожалуйста поподробнее кому не лень каково их назначение и роль в программе)
Почитайте Подбельского называется вроде "Язык С++".

Fata1ex
30.06.2009, 20:14
Не читайте Подбельского - очень скучно и занудно.
Ту же информацию можно почерпнуть из других книг, гораздо более удобных для новичка.

_antony
30.06.2009, 20:20
многие студенты его хвалят , как хорошего преподавателя , так что можно книгу прочитать=)

Fata1ex
30.06.2009, 20:24
У меня есть его издание. Зеленое которое. Финансы и статистика. Для новичка имхо не очень подходит :) Написано очень скупо, единственное форматирование, применяющееся в книге, это жирный текст, текст, текст, текст, текст )
Выглядит как раз тем учебником по программированию, взглянув на который добрая половина населения скажет "омг, эти странные рунические письмена не для меня"

XikarO
30.06.2009, 20:26
а как насчёт С++ за 21 день там вроде всё понятно, но етот вопрос объясняется немного абстрактно((

--StraNger-- Спасибо за ссылку!! Как раз то что нужно ))

Fata1ex
30.06.2009, 20:29
XikarO, по-моему там все вполне четко объяснено. Конструкторы по умолчанию, конструкторы копирования все есть. Может ты просто поленился? )

XikarO
30.06.2009, 20:30
XikarO, по-моему там все вполне четко объяснено. Конструкторы по умолчанию, конструкторы копирования все есть. Может ты просто поленился? )
Да нет скорее немного торможу))

Ra$cal
01.07.2009, 00:57
подбельского не читайте. его атипичное именование переменных встроенных типов объектами - это ппц. нельзя такое новичкам давать. портит моск. читайте дейтела.

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

Ru}{eeZ
03.07.2009, 16:23
Начал изучать си++, помогите разобраться, читаю книгу Подбельского 2006ого года, примеры из неё не идут, допустим первый пример содержет:
#include <iostream.h>
с этим не работает, но если я заменю это на:
#include <iostream>
using namespace std;
то работает нормально, с чем это связано? Может с тем, что на момент выхода книги что-то подругому было?

Прогаю через Microsoft Visual C++ 2008 Express Edition.

Mozy
03.07.2009, 16:35
Вот основные отличия <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 лет.

Что и произошло

Ra$cal
03.07.2009, 16:41
Ru}{eeZ
не читайте подбельского. "как прогарммировать на с++" или "Освой самостоятельно C++ за 21 день" одни из лучших книжек для начинающих.

bug1z
03.07.2009, 20:55
2Ru}{eeZ
#include <iostream.h> - старый стиль включения файлов.
#include <iostream> - включение заголовка библиотеки(работает в новых компиляторвх).

_nic
04.07.2009, 00:59
Плз помогите преобразовать этот кусочек кода к виду который переварит вижуал студио.

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;
}

razb
04.07.2009, 14:53
"как прогарммировать на с++" или "Освой самостоятельно C++ за 21 день" одни из лучших книжек для начинающих.
"Освой самостоятельно C++ за 21 день" - имхо более бредового издания я еще не видел, если начать с него то там уйдет далеко за 21 день и в голове будет одна каша. Лучше уже начинать с Шилдта, все довольно грамотно написано и вполне понятно для новичков )

Fata1ex
04.07.2009, 14:58
razb, ты, видимо, не читал эту книгу ) кроме названия в ней ничего странного нет, для новичка отлично подойдет. У Шилдта довольно много книг и не все из них хорошие, так что надо выбирать.

razb
05.07.2009, 13:32
razb, ты, видимо, не читал эту книгу
Я бы не стал писать о том чего не знаю, немного пролистав эту книгу уже сразу сложилось представление о ее безграмотном написании.

..::Hollywood::..
05.07.2009, 13:50
написание доступно в принципе , но вот насчет каши ты прав.есть немного.

i-0z
05.07.2009, 15:00
Помогите плз разобраться как должен выглядеть код программы Windows Forms (Visual C++2008), что б нарисовать линию на PictureBox от заданных X1,Y1 до X2,Y2.

mr.The
05.07.2009, 22:05
Нужна функция\либа(или как тут оно называется.. в итоге должен быть 1 екзешник без длл) для работы с почтой на с++. функционал нужен минимальный - авторизироваться\получить почту\отправить почту.
что не находил - всё здоровое, с кучей ненужных фич.

[n]-c0der
06.07.2009, 00:32
Нужна функция\либа(или как тут оно называется.. в итоге должен быть 1 екзешник без длл) для работы с почтой на с++. функционал нужен минимальный - авторизироваться\получить почту\отправить почту.
что не находил - всё здоровое, с кучей ненужных фич.

Протокол SMTP =)
М насколько помню, грейт писал smtp сервер помоему, поройся в исходниках, наверняка найдешь то что нужно.

slesh
06.07.2009, 10:11
ТАк быстрее самому написать. Отправка почты - 40-50 строк кода от силы )
минимальная реализация SMTP протокола
EHLO
AUTH
base64 всё кодируется
MAIL FROM <>
RCPT TO <>
DATA
текст письма
.
BYE

вот и весь обмен данными. Достаточно отснифать как опера отсылает письма.
С pop3 чуть сложнее потому что нужно следить за теми письмами которые уже были слиты раньше. Но всё равно там также просто. скачать RFC

mr.The
06.07.2009, 13:38
...скачать RFC...
нет, я-то могу реализовать это всё. но я думал, что такой велосипед уже 10 раз изобретён, и можно заюзать что-то готовое.
С pop3 чуть сложнее потому что нужно следить за теми письмами которые уже были слиты раньше
не нужно, я не почтовик пишу, а, грубо говоря, монитор.

\\ChaOs//
06.07.2009, 13:52
нет, я-то могу реализовать это всё. но я думал, что такой велосипед уже 10 раз изобретён, и можно заюзать что-то готовое.


Думаю что это тебе подойдет тынц (http://prjsoft.ru/rus/mfcmailer.php)

_nic
06.07.2009, 16:54
А как из такой строчки "\\?\Volume{e736f8ea-44bb-11de-8200-806d6172696f}\" можно узнать букву связанную с томом?

_nic
06.07.2009, 17:30
_https://forum.antichat.ru/showpost.php?p=1359350&postcount=3247
_https://forum.antichat.ru/showpost.php?p=1359277&postcount=3245
Нет не то.И вообще вопрос надо внимательно читать.

GetVolumePathNamesForVolumeName

вот и все

_antony
06.07.2009, 18:45
А как из такой строчки "\\?\Volume{e736f8ea-44bb-11de-8200-806d6172696f}\" можно узнать букву связанную с томом?
Это не строчка , а символьная ссылка . Для наглядности на моей машине :
http://metelkin.sav1or.name/links.png

http://metelkin.sav1or.name/links2.png

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

Djezul
06.07.2009, 20:53
Как сделать на си , чтобы программа выполняла несколько действий одновременно , тоесть допустим моя машинка ехала, и обновременно ей на встречю ехали другие машинки ?

Fata1ex
06.07.2009, 21:04
Врят ли имеются в виду потоки, поэтому лучше использовать например циклы.
for (int i = 0; i < N; i++) {
MoveFirstCar();
MoveSecondCar();
sleep( ... );
}

или же копай в сторону многопоточности ( см статью в "Статьях" )

Djezul
06.07.2009, 21:42
Не , надо как раз много поточность , просто не могу найти норм инфу по ней, про машинки я привел ради примера))

Fata1ex
06.07.2009, 21:43
Я же написал - посмотри в "Статьях". Или поищи в гугле. Информации много.

_antony
06.07.2009, 23:28
Не , надо как раз много поточность , просто не могу найти норм инфу по ней, про машинки я привел ради примера))
Ничего лучше Джеффри Рихтера не найдете , читать просто обязательно , от корки до корки , можно и 2 раза.

horlyk
06.07.2009, 23:30
Вот снова засел за с++, продолжаю обучение...

В общем вопрос состоит в таком: я учу сейчас ссылки и указатели. Теперь пожалуйста, объясните мне, что возвращается в каждой(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";
}

Fata1ex
06.07.2009, 23:42
Рано ему еще Рихтера читать.
Возвращаются ссылка и указатель на измененный объект. код вижу не полностью так как с телефона. Вопрос почему странный. Потому что ты так их определил...

horlyk
06.07.2009, 23:47
Меня интересует что содержится в ссылке, а что в указателе на момент возврата - адрес что-то другое...

В чем разница, если я напишу так:

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;
}


что означает значок * или & у имени ф-и? и что в итоге возвратится - адрес что-то другое?

Ra$cal
07.07.2009, 01:07
ссылки сделаны для удобства использования. к методам класса ты будешь обращаться через ., а при указетеле через ->. Больше никакой принципиальной разницы нету. На уровне ассемблера в обоих случаях возвратится адрес.

Fata1ex
07.07.2009, 10:56
При передаче аргумента по указателю использовать все время разименовывание обычно неудобно и код выглядит некрасиво, хотя здесь это не очень заметно.

Alpha][
07.07.2009, 18:24
Посоветуйте что почитать про работу с устройствами , подключенными через usb и com . язык с++ .

_antony
07.07.2009, 18:32
Агурова , Уолтера Они .

horlyk
07.07.2009, 21:03
Ra$cal, Fata1ex, спасибо. То есть если возле имени ф-и стоит значок ссылки или указателя, то ф-я должна вернуть адрес, я правильно понял?

Fata1ex
07.07.2009, 21:18
Cat* func1(Cat *cat1)
Cat& func2(Cat *cat1)

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

horlyk
07.07.2009, 21:48
О, теперь понял, большое спасибо!

mr.The
08.07.2009, 13:55
нужно заюзать регулярки. скачал пак с оф-сайта (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 либы и гуглить - не помогло.
собственно сабж: как это сделать? либо, есть ли более лёгкие(возможно, менее функциональные) реализации регулярок?

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

fker
09.07.2009, 15:26
можно ли с помощью cout<< делать форматный вывод, типа printf("%3d",a) ?

Fata1ex
09.07.2009, 15:31
- format flags
- i/o manipulators
- функции класса ios
- собственные функции ввода/вывода и манипуляторы

razb
09.07.2009, 16:37
нужно заюзать регулярки. скачал пак с оф-сайта (pcre.org), подключил либы, всё хорошо. только вот за прогой нужно таскать dll весом ~150 кб. есть несколько проблем
попробуй регэкспы из буста поюзать. там есть статическая линковка. а на счет размреа - хз. там много кода нужно чтоб это работало. нужно идти на жертвы.
Советую тоже использовать буст, как подсказал коллега выше )
При статической линковке размер будет ~ +1m

mr.The
09.07.2009, 17:59
Советую тоже использовать буст, как подсказал коллега выше )
При статической линковке размер будет ~ +1m
заюзал буст. линковка вроде-бы статическая, правда я с ним натрахался, и пришлось юзать микромягкий компилятор(варнинг на варнигне, но компилится, и работает). простая прога с 1-й регуляркой и только 1 либой(boost/regex.hpp) висит 167 КБ. upx пакует ~до 80 кб. многовато, но подойдёт. щас попробую уменьшить размер.

UPD линковка динамическая. меньше уже не будет, а если и будет, то это нужно слишком глубоко лезть..

Lee_fx
10.07.2009, 12:57
Как будет выглядеть функция циклического сдвига влево для битов?, т.е.
char a = 222; //a = 11011110
rotate(a); //a = 10111101

mr.The
10.07.2009, 14:05
Lee_fx,
_ttp://www.cyberforum.ru/visual-cpp/thread1850.html
__tp://www.cyberguru.ru/programming/cpp/cpp-programming-guide-page27.html
не оно?

fker
10.07.2009, 14:37
2Lee_fx

unsigned char rotate(unsigned char c)
{
return (c<<1)|(c>>7);
}

сдвиг на один бит влево
кажись понял, немнго не то надо..(
upd: теперь вродьб правильно
если использовать int то надо сдвигать на 31 вправо
return (c<<1)|(c>>31);

Lee_fx
10.07.2009, 15:15
Оказывается решение в одну строчку =)
а я тут велосипедю блин
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
Просто различная индексация символов, не более того.

fker
10.07.2009, 15:57
В signed char старший бит отвечает за знак
unsigned - без знаковое
Тип данных Байты Биты Min Max
signed char 1 8 - 128 127
unsigned char 1 8 0 255

mr.The
10.07.2009, 16:39
выложите кто-то либы буста для 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. можно компялятор как-то определять? может есть какие-то константы?

Ra$cal
10.07.2009, 22:19
сделай батник

bjam --j2 --build-dir=I:\programming\boost_1_39_0\build_dir toolset=gcc --build-type=complete stage
pause

компиль сразу все либы и юзай нужные =)

mr.The
11.07.2009, 11:50
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

Ra$cal
11.07.2009, 13:41
да забыл упомянуть про корень =) сори

mr.The
11.07.2009, 13:54
ага, теперь там статическая линковка.. 397 кб =\

Ra$cal, стукни мне в аську\жабру

Lee_fx
17.07.2009, 14:39
есть ли разница между вызовами new:
char* ptr = new char[n];
и
char* ptr = static_cast<char*>(:: operator new(n));
//Перегруженных operator new нет.

LAGOX
18.07.2009, 21:55
У меня более теоретический вопрос, есть желание начать учить C++, но не знаю для какой платформы писать(сам сижу на Linux) или без разницы будет?

Fata1ex
18.07.2009, 21:58
LAGOX, на начальном уровне это непринципиально, позже выберешь. Учи пока синтаксис, он везде один и тот же.

5rap
18.07.2009, 23:42
Здравствуйте.Вот хочу попробовать написать программку.Функции:
-Открывает уйму окон при помощи win+e
-Вписывается в автозагрузку.
-Включается через 40 секунд после запуска windows.
Кто-то помочь может?

5rap
19.07.2009, 00:24
Дай совю асю там поговорим ок?

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;

Ra$cal
19.07.2009, 04:02
[c/c++] Новичкам: задаем вопросы
так что делфи тут слегка не в тему

Scripter
19.07.2009, 08:02
тьфу сорь перепутал, моя вина

барыгский
19.07.2009, 12:48
Как взломать программу на c++ чтобы увидеть ее код если на программе стоить пароль.

slesh
19.07.2009, 13:26
IDA + HexRay = кое как исходник на С получиш.
Но если прога шифрована, то мало что тебе даст

KaZ@NoVa
19.07.2009, 13:28
Как взломать программу на c++ чтобы увидеть ее код если на программе стоить пароль.
Для подбора паролей существуют специализированные программы и специализированные методологии которые достаточно тяжело освоить. Способ же увидеть исходный код - пользоваться дизассемблерами.

.ATK
19.07.2009, 13:32
При дизассемблировании получается не исходный код!)) и ваще: "Молчание - золото!"

KaZ@NoVa
19.07.2009, 13:40
При дизассемблировании получается не исходный код!)) и ваще: "Молчание - золото!"
короче, раскомпилируй софтину

slesh
19.07.2009, 23:07
по этому я и написал IDA + плагин HexRay сливай с кряклаба.
Потому как IDA офегительно дизасемблит, а хексрей сторит на основе этого исходник сишный

_nic
20.07.2009, 21:09
Если я захочу массив SAFEARRAY обьявить в куче, то как высчитать нужный обьем памяти?

horlyk
24.07.2009, 17:33
Сейчас читаю книгу Джесса Либерти(освой с++ за 21 день). Дошел до связных списков. Там довольно таки сложно и не понятно для меня написано(я про тот огромный пример что в книге). Общий принцип понял, но все еще смутно понимаю эти листы. Напишите плз, кому не сложно какой-то интересный и очень простой примерчик работы с листами с хорошими коментами.
Заранее спасибо!

Ra$cal
24.07.2009, 23:45
давай немного по-другому - ты пишешь пример, как ты понял листы. это как бы лучше запоминается и понимается. вся суть сводится к такому.

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;

Удаление сделай сам. Как и проход, и признак конца, и циклический список, двунаправленный.

horlyk
25.07.2009, 15:46
Я понимаю листы так:

Он состоит из головы, узла с данными и хвоста. Но я не могу понять роли каждого из элементов. Ну на пример, я вижу роли так - в узле содержатся данные и адрес следующего узла. В голове содержится адрес первого узла. В хвосте содержится адрес головы или как?

В общем посидел, подумал поэкспериментировал...

#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");
}
}

horlyk
25.07.2009, 19:16
FireFenix, спасибо, но мне пока сложно большие примеры разбирать. В книге тоже не маленький, потому и много сложностей.

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

Спасибо.

Ra$cal
25.07.2009, 20:19
ты представь состав из вагонов. как понять, что вагон начинает состав? у него нет предыдущего вагона.
как понять, что вагон последний - у него нет следующего.
так и со списками. голова и хвост - это логические описание конкретного элемента списка. это не отдельный тип элемента списка. в этом собсно суть.
в твоем примере нужен только класс лист. переименуй его в 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;
};

horlyk
25.07.2009, 21:40
Ra$cal, спасибо, буду разбираться.

horlyk
26.07.2009, 16:21
и кстати, нашел интересную инфу о листах, главное очень понятно и толково рассказано.

линк (http://khpi-iip.mipk.kharkiv.edu/library/datastr/book_sod/kgsu/din_0001.html)

Там в нескольких шагах рассказано все.

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

void POSTROENIE (node **phead)

razb
26.07.2009, 17:08
void POSTROENIE (node **phead)
косвенная адресация (указатель на указатель), можно использовать для работы с массивами.

horlyk
26.07.2009, 18:26
А преимущество в чем?

Ra$cal
26.07.2009, 18:54
только так можно сделать многомерные массивы аля матрица

на счет описания. сложно оценить. в списке я не вижу никаких трудностей. то что ты стал мутить с классами - проблема не в списке. проблема в использовании ООП. ты создал отдельные классы для сущностей, которые не отличаются ничем в поведении. все равно что создавать класс для числа 1, другой класс для числа 2, итд. Так что стоит внимательнее перечитать, что пишут про выделение классов. Все таки их разделяют не именам, а по поведению. Если поведение не отличается - делается переменная этого класса, имеющая имя, которое характеризует назначение этого объекта. вот если бы хвост например не мог содержать число 555, а голова число 777, то тут есть повод выделить доп классы, потому как поля вроде как одинаковые, но поведение отличается.

ps: стиль именования в статье ужасен просто аж ппц. и постоянные размыеновавния. как будто человек не знает про "->"

horlyk
26.07.2009, 20:21
только так можно сделать многомерные массивы аля матрица

на счет описания. сложно оценить. в списке я не вижу никаких трудностей. то что ты стал мутить с классами - проблема не в списке. проблема в использовании ООП. ты создал отдельные классы для сущностей, которые не отличаются ничем в поведении. все равно что создавать класс для числа 1, другой класс для числа 2, итд. Так что стоит внимательнее перечитать, что пишут про выделение классов. Все таки их разделяют не именам, а по поведению. Если поведение не отличается - делается переменная этого класса, имеющая имя, которое характеризует назначение этого объекта. вот если бы хвост например не мог содержать число 555, а голова число 777, то тут есть повод выделить доп классы, потому как поля вроде как одинаковые, но поведение отличается.

ps: стиль именования в статье ужасен просто аж ппц. и постоянные размыеновавния. как будто человек не знает про "->"

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

З.Ы. Сейчас пишу прогу по созданию листа. Уже реализовал заполнение листа данными, вывод данных на экран, поиск во всем листе и вывод найденных данных на экран и удаление всего листа. Теперь хочу реализовать добавление в средину (или куда-то еще, то есть сдвиг) узла в лист и удаление одного узла.

З.Ы.Ы Можно плз примерчик многомерными массивами(с использованием **указателя)

З.Ы.Ы.Ы Еще раз спасибо за объяснения

Fata1ex
26.07.2009, 20:24
Поищи в разделе, выкладывалось несколько раз
вот например (http://forum.antichat.ru/showpost.php?p=1351598&postcount=71)
Это если ты хотел просто пример работы, а не применительно к спикам.

horlyk
26.07.2009, 22:10
Fata1ex, оно, спасибо!

horlyk
27.07.2009, 00:08
И снова я с вопросом. В общем такая ситуация:

#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;
}

Почему первый вариант не работает? Как решить проблему?

Ra$cal
27.07.2009, 02:51
жуть. почитай ка лучше дейтела.
я даже не могу понять, что ты хочешь этим кодом сделать... тут не список даже. чем то напоминает фабричный метод, тока зачем он здесь? O_o

Glazz
27.07.2009, 09:27
node* _node = 0;

_node->C(_node);
Как это может быть?
Ты делаешь у указателя значение 0 и пытаешься потом по этому адресу обратиться...

Fata1ex
27.07.2009, 09:40
Отличный пример того, как не стоит называть переменные в запутанных кодах.

Glazz, эээ....нулевой указатель?

Хотя да...логика кода неверна:


node* _node = 0;

_node->C(_node);

...

_node = new node;
_node->data = 5;


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

horlyk
27.07.2009, 13:15
Имена то так, я по быстренькому тестовую прогу написал, так как в основной проге с этой проблемой столкнулся. Идея должна быть вот примерно такая: из мэйна я передаю указатель в метод, который принимает этот указатель и ему присваивается новый адрес оператором 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

razb
27.07.2009, 13:27
node* node::C(node *_node)
{
_node = new node;
_node->data = 5;
return _node;
}
Из-за такого бреда может лопнуть моск ))
В классе создаешь метод типа push() или какой нибуть сеттер, далее в мейне создаешь экземпляр класса(в стеки/в куче как хочешь) и уже к нему обращаешься.

Fata1ex
27.07.2009, 13:30
Из-за такого бреда может лопнуть моск ))
ааа, ты тоже заметил :(

и ему присваивается новый адрес оператором new
мда. Почитай литературу лучше...

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

razb
27.07.2009, 13:37
void node::func(node *Mynode)
{
Mynode->data = 5;
Mynode = new node;
Mynode->data = 7;
}
Во первых в классе есть неявный указатель на экземпляр this
Во вторых, переменная data является открытой и доступна вне класса
В третьих, у тебя тут Mynode = new node; будет утечка памяти.

В общем как сказал товарищ Fata1ex, лучше сейчас потрать больше времени на прочтение литературы и это в будущем тебе сэкономит уйму времени )

Glazz
27.07.2009, 13:39
а тут еще случайно память не утекает? new вызываются да вызываются , а delete я так и не видел.

horlyk
27.07.2009, 13:47
Блин, сложно что-ли показать как нужно сделать, вместо того, чтоб придераться к тому, что меня на данном этапе не интересует. Про операторы делет я знаю, в основной программе их применяю. Я же сразу сказал что это тестовая прога и интересует меня пока именно этот момент. А про то, что моск лопается от кода - папки могли бы решить эту проблему и написать правильный пример. Раздел же называется для новичков, потому я и выясняю то что мне не понятно было в книге. Вместо того говорят литературу читать лучше... ппц :mad:

Fata1ex
27.07.2009, 13:54
horlyk, люди хотят помочь, не стоит обижаться. Прислушайся, все равно придется вернуться к азам.

Вот именно, раздел "для новичков", а не "лабораторные работы". Если тебе нужна готовая программа, пиши туда. Здесь советы по обучению и синтаксису.

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

horlyk
27.07.2009, 14:03
Ну во первых - это не лабораторная работа. Я сейчас джесса либерти читаю(освой с++ за 21 день) Дошел до списков. Там на том примере понять списки не реально. Потому начал искать информацию о списках в интернете и тут. Вроде как понял. Сейчас пишу программу с использованием списков - поиск в нем, добавление узла, удаление и т.д. И там у меня такая проблема появилась. Я хотел разбить все на методы, разбил, но при вызове метода, который должен был создавать узлы и заполнять их данными у меня появилась проблема - при возврате данные все теряются, хотя при отладке смотрел, что на в процессе создания все отлично, а при выходе из этого метода все теряется. Начал думать и решать эту проблему. Написал код, который уже окрестили кодом, от которого лопается моск. Он работает, памяти больше не занимает... Вот я и попросил помощи с тем вариантом, что у меня с самого начала не заработал.


Ага, все бы за тебя сделали, а ты бы так и остался на своем уровне. Тебе же предлагают учиться самому и развиваться. Ужас правда?

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

Ra$cal
27.07.2009, 15:03
из мэйна я передаю указатель в метод, который принимает этот указатель и ему присваивается новый адрес оператором 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;
вообще простой совет - такие конструкции не используй никада, если уж совсем не припрет.

horlyk
27.07.2009, 15:15
Ra$cal, спасибо, теперь понял. А лучший выход из такой ситуации какой?

alex912
27.07.2009, 15:33
Все просто :)
При передаче указателя в функцию, создается копия данного указателя, который указывает в тоже самое место что и настоящий указатель. Поэтому Mynode->data = 5 срабатывает. Далее этот указатель указывает на новое место и Mynode->data = 7 уже относится к совершенно другому объекту. Как уже выше написали, если нужно изменить указатель - юзай ссылки.

Ra$cal
27.07.2009, 19:05
А лучший выход из такой ситуации какой?
я не понимаю, что именно делает твой метод. чисто логически не могу понять. если ты хочешь изменить поле data, то зачем тебе перевыделять память? ты должен или напрямую изменить data, или сделать его приватной переменной и добавить геттеры и сеттеры и юзать их.

horlyk
27.07.2009, 19:31
Понятно, еще раз спасибо.

SeNaP
28.07.2009, 23:57
Проблема такая.
Как проверить на существоание дериктории, если она есть, то определить путь.
Помогите пожалуйсто :)

razb
29.07.2009, 01:21
Если unix like система, то смотри man readdir

bons
29.07.2009, 13:47
Проблема такая.
Как проверить на существоание дериктории, если она есть, то определить путь.
Помогите пожалуйсто :)
надеюсь, ты имеешь в виду исходя из пути к папке проверить ее наличие.
Конечно можно проверить существование какой-то директории без пути к ней, но ведь же рекурсивный поиск юзать для этого надо.
а в первом случае подойдет такой код:
#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-систем

SeNaP
29.07.2009, 14:05
bons, спс, щас буду сидеть разбираться ))

ЗЫ: Кто может ссылку дать, на сорцы кокого нибудь вирус, который сам распростроняется, чисто для изучения :)

horlyk
29.07.2009, 14:47
После пары мучительных дней, я все же добил однонаправленные списки. У меня вышло создать список, просмотреть его, искать в нем нужные данные, удалить полностью весь список, удалить конкретный узел списка, добавить новый узел в конец списка, добавить новый узел в любую другую позицию, сортировать его по данным и номерам узлов. Для этого использовал все свои знания.

Если кому не лень - проанализируйте плз мои труды и посоветуйте, что можно было бы сделать иначе, то есть оптимальнее:
исходник - cpp (http://www.dagoth.at.ua/next2.cpp)
готовый exe файл программы (http://www.dagoth.at.ua/List.exe)

З.Ы. Сообщение о вирусе игнорируйте, так как это мой сайт и я даю гарантию в 100% о безопасности файлов.

Ra$cal
29.07.2009, 16:08
рекомендация простая - у тебя получилась модульная программа, только заменой модулей на классы. как таковой класс списка не выполняет роль управления списком. точнее он управляет всеми подряд списками. и код, который использует этот класс списка, обязан знать все детали реализации класса Node, хотя вся задача класса List в том, чтобы никто не знал, как он реализован.
Вот тебе простые условия, чтобы список стал нормальным членом ОО общества:
1) Список не должен принимать в паблик методах параметры типа Node
2) Список не должен возвращать в паблик методах параметры типа Node
3) Так как класс List управляет списком, почему среди его членов даннхы нету собственно списка? Точнее головы
4) Работу с вводом-выводом вынеси в отдельный класс. Назови его ListMenu или на свое усмотрение, но в классе списка не должно быть методов, которые не связаны с управлением сущностью.

Ну а так для начала вполне неплохо(в том смысле что это работает =) )

horlyk
29.07.2009, 16:48
Ra$cal, еще раз спасибо за советы и за потраченное время на разборку кода моей программы :rolleyes:

З.Ы. тоесть получается я еще не понимаю преимущества ооп. Что можно почитать чтоб понять чем оно лучше?

razb
29.07.2009, 17:44
Все что в хэдэре заключи в такую конструкцию:
#ifndef _MB_H_
#define _MB_H_

....

#endif /* _MB_H_ */

slesh
29.07.2009, 18:41
ты проверь, возможно ты файл mb.h пытаешься компилить также как и други cpp файлы

Ra$cal
29.07.2009, 21:04
horlyk
ну это простое правило нужно и можно усвоить и без книг. Если ты делаешь класс - снабди его ровно тем поведением, которое будет ожидать от него человек, увидев имя класса. Вот ты делал список - я ожидал там видеть управление данными. Никаких меню. Ожидал что работать буду так

List list1;
list1.add(name, age);
list1.add(name2, age2);
list1.remove(name1);
list1.sort();
единственный метод, который можно добавить ради простоты - метод view. Хотя на самом деле делается это введением доп класса или снабжением списка например итераторами.

Чтобы понять в общем смысле суть представь, что ты купил машину. Но чтобы на ней ехать тебе надо открыть капот, впрыснуть в карбюратор немного бензина, залезть в кпп и добавить шестеренки, отрегулировать дифференциал... Суть - скрыть ВСЕ, что мешает абстракции. Нажал кнопочку - все сделалось само. Сработал стартер, в карбюратор бензин, искра - завелись. Как на самом деле все это работает - тебя не трогает. Плюс делать вещь должна ровно то, о чем говорит название. Врядли ты обрадуешься, если машина помимо езды еще и мусор собирает, и селедку возит. МОжет конечно это тебе и пригодится, но это лишняя сложность. Или называй машину как селедковоз с мусоросборкой, чтобы знать, чего ожидать, или разбей все фичи на отдельные устройства. Так же в программах =)
Очень простой признак говняности кода - слишком длинные приготовления для работы с классом. В твоем примере это создание Node'ов при любом действии со списком. Логичнее же все повторяющиеся места пихнуть в класс и оставить только вызов метода.
У тебя это не так очевидно ибо список, как уже упоминалось выше, делает помимо управления списком и весь клиентский код

horlyk
29.07.2009, 22:26
То есть, получается нужно чтобы был создан класс List, в нем были все методы управления списком - добавления, удаления, сортировки и т.д. и объект другого класса, то есть класса Node - голова. Это все вынести в отдельный хедер и из мейна управлять так, как ты и описал:
List list1;
list1.add(name, age);
list1.add(name2, age2);
list1.remove(name1);
list1.sort();
и открыть для общего доступа только главные, не вспомогательные методы.
Следовательно ООП подразумевает простоту использования объектов и их методов для конечного пользователя. Я правильно понял?

Ra$cal
29.07.2009, 22:29
угу. это называется инкапсуляция

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

Там же смотри абстракцию.

horlyk
29.07.2009, 22:44
Во! теперь понял! еще раз огромное спасибо! Ща еще допишу в этой же программе пересчет номеров узлов, тоесть были узлы: узел1, узел2, узел3. Удалили узел2. Узел3 стал узел2. что-то типа этого.

После этого, не поленюсь, перепишу полностью программу с нуля, уже думая над инкапсуляцией, используя еще и двухсвязные списки!

Ra$cal
29.07.2009, 22:53
Та не за что =) Просто внимательнее книги читай. Эти моменты там обсуждаются 100% Просто их с ходу не понимают обычно.

Gin
30.07.2009, 17:50
Нужно написать софт для работы с 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;
}


Что это такое не особо понимаю ибо с длл работаю впервые.

Fata1ex
30.07.2009, 19:00
Gin, WINSOCK / WININET.

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

Glazz
30.07.2009, 19:04
Нужно написать софт для работы с HTTP. Подскажите какие библиотеки\классы\исходник и использовать, что бы упростить себе задачу. Было бы здорово если бы дали ссылки на хорошие статьи\книги и т.д.
Заранее спасиб
http://www.citforum.ru/book/cook/winsock.shtml - вариант для Win. Если нужно под UNIX то
SOCKET -> int;
и не нужно делать никаких инициализация с WSA.
closesocket() -> close();

Gin
30.07.2009, 19:12
2Fata1ex

Конечно я это уже сделал, по WININET я нашел инфу даже книгу, за WINSOCK спасиб не знал.

2Glazz

Спасиб за ресур этот я не нашел.

2All
Выложил бы кто из сообщества свой пример использования WINSOCK / WININET. К примеру парсинг выдачи гугла или просто получения кода страницы. Что нибуть простое, но показывающее механизмы работы. Большинство же статей что я нашел, расказывается о написание чата или же клиент серверных приложений.

razb
30.07.2009, 19:24
В разделе "статьи" товарищ slesh уже писал статьи по данному сабжу.

Fata1ex
30.07.2009, 19:32
Три статьи (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");
}
}

Gin
30.07.2009, 23:14
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) вторая книга - я с ее примеров начал работать с винсок

horlyk
31.07.2009, 18:40
У меня есть 2 класса: LIST и DATA. Я их включаю в отдельный хедер и подключаю в новый проэкт. Как можно сделать так, чтобы пользователь не мог создать объект класса DATA в своем проэкте?

razb
31.07.2009, 18:50
У меня есть 2 класса: LIST и DATA. Я их включаю в отдельный хедер и подключаю в новый проэкт. Как можно сделать так, чтобы пользователь не мог создать объект класса DATA в своем проэкте?
что то я совсем не понял логики твоего вопроса.

horlyk
31.07.2009, 18:58
Ну смотри, создал я свой хедер, в нем 2 класса. Далее создаю новый проект и подключаю в него свой хедер. Из хедера должен использоваться только 1 класс - LIST. Я в своем проекте не должен создавать объект класса DATA . То есть не допустить создание нового объекта этого класса пользователем вручную. Как это реализовать?

хедер:
class DATA
{
методы...
};

class LIST
{
методы...
};
В новом проекте файл срр:
LIST mylist;// так можно и нужно
DATA mydata;// а вот это я хочу запретить
Возможно ли такое сделать?

razb
31.07.2009, 19:53
Ну сделай конструктор класса DATA приватным.
И если надо будет создать экземпляр класса, делай его дружественным по отношению к другому классу.

horlyk
31.07.2009, 20:11
class DATA
{
public:
методы...
private:
DATA() { инициализация... }
};
class LIST
{
public:
LIST() { Head = new DATA(); }// как в такой ситуации быть?
методы...

private:
DATA* Head;
};

А если вот такая ситуация?

Ra$cal
31.07.2009, 20:12
объяви класс внутри класса LIST с модификатором private. вроде должно помочь.

class LIST
{
private:
class DATA
{
public:
DATA() { }
};

public:
LIST() { Head = new DATA(); }// как в такой ситуации быть?

private:
DATA* Head;
};

razb
31.07.2009, 20:14
Я же написал постом выше.
class DATA
{
friend class LIST;
public:
методы...
private:
DATA() { инициализация... }
};
class LIST
{
public:
LIST() { Head = new DATA(); }// как в такой ситуации быть?
методы...

private:
DATA* Head;
};

Ra$cal
31.07.2009, 20:17
razb
это мягко говоря через жопу =) главная трабла что по сути ты аналог синглетона делать задумал. т.е. приватить надо не только дефолтный конструктор. еще копирования и перегрузку оператора =. Что не есть очень удобно и красиво.

horlyk
31.07.2009, 20:20
razb, я прочитал не отредактированный вариант твоего сообщения, когда свой написал - твой пост уже был обновлен =)
Я еще не дочитал до дружественных отношений классов...

Ra$cal, ща попробую.

razb
31.07.2009, 20:26
это мягко говоря через жопу =) главная трабла что по сути ты аналог синглетона делать задумал. т.е. приватить надо не только дефолтный конструктор. еще копирования и перегрузку оператора =. Что не есть очень удобно и красиво.
По поводу удобства еще можно поспорить если классы очень объемные то удобней разнести по разным файлам и обьявить такую связь.
Также если данный класс используется не только одним другим классом например.
т.е. приватить надо не только дефолтный конструктор. еще копирования и перегрузку оператора =.
Я думаю не составит особого труда сделать и это )

horlyk
31.07.2009, 20:47
Ra$cal, помогло, еще раз спасибо!

З.Ы. я сначала сделал не совсем так как ты написал и мучался долго с ошибками, потом обратил внимание, что private объявлен раньше public. Переделал и помогло! Не думал что это может как-то повлиять :)

З.Ы.Ы. Еще никогда у мну не было таких конструкций:
LIST::DATA* LIST::DATA::GetPrev()
и
LIST::DATA::DATA(int* aValue, char* aText, DATA* aPrev, int num)
Круто)

razb
31.07.2009, 20:53
З.Ы.Ы. Еще никогда у мну не было таких конструкций:
Лучше б их по возможности и не было (делай typedef'ы) или было как можно меньше ))
Код должен быть понятным с первого взгляда )

Ra$cal
31.07.2009, 21:03
ну или добавляй using namespace =)

horlyk
31.07.2009, 21:25
Хм, а это идея! typedef умею юзать, а вот как добавить в пространство имен мой вариант?

Ra$cal
31.07.2009, 22:27
не, с классами не получится создавать альясы через namespace. как вариант можешь писать код класса DATA прямо в хидере =) ну или тайпдефы\дефайны.

horlyk
31.07.2009, 23:09
ясно, еще раз спасибо)

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
}

---вот это ! как?

Ra$cal
01.08.2009, 15:53
компилятором воспользоваться. например в visual studio.

mr.The
01.08.2009, 22:11
нужно работать с dll как с com объектом (в ней всего 5 функций - одна из них - DllGetClassObject).

это всё конечно хорошо, но разбираться с com слишком долго. есть готовые либы\функции которыми можно загрузить такую dll и юзать её com функции?

horlyk
01.08.2009, 23:53
Ra$cal, дописал я наконец хедер. Несколько дней напрягался! Посмотри, если не лень и скажи свое мнение по поводу проделанной мною работы :)
->хедер<- (http://dagoth.at.ua/horlyk_List.h)

Ra$cal
02.08.2009, 03:22
на первый онный взгляд все вполне норм. тока для начала не советую загромождать интерфейс класса методами перегружеными, которые не очень востребованы. в твоем случае это int*, ибо проще при вызове для таких мест сделать *value.

DATA* Find(int* node_num)const;//Искать узел с заданным номером
этот метод убрать под private. и старайся не делать меотдов с int* параметрами, если только это не массивы(это относится ко всем типам, особенно встроенным). ибо просто так числа по указателю передают если это массив или если туда возвращается значнеие. в твоем случае не понятно. если параметр только для чтения - обязательно дополняй его словом const. чтобы пользователь метода четко знал, что метод не изменит эту переменную. правда это обычно юзают для ссылок на объекты классов, чтобы избегать лишних созданий копий. но это потом поймешь =)

зы: не юзай укаазтели в членах данных класса без острой необходимости. иначе будут проблемы с конструкторами копирования. если не переопределишь - по умолчанию конструктор просто копирует поля. в твоем случае создается 2 объекта DATA, поля в которых указывают на одинаковую память. в итоге если один удалит значение - во втором объекте будет неверное значение считываться. и заипешься вычислять эту багу... старайся меньше юзать указателей. это не самая сильная сторона с++ =)

horlyk
02.08.2009, 13:30
в твоем случае это int*, ибо проще при вызове для таких мест сделать *value.
Тут немного не понял что ты имеешь ввиду :)
DATA* Find(int* node_num)const;//Искать узел с заданным номером
этот метод убрать под private.

Это да, я просто в конце доделал другой поиск с показом а про этот забыл :)
и старайся не делать методов с int* параметрами

ммм, а указатель разве не меньше памяти требует, если он только передает в другой метод адрес, вместо создания нового инта?
При передачи параметров по значению они копируются в стек, в случае с встроенными типами это не так уж критично, указатели стоит использовать при передачи данных больших обьемов (массивы, обьекты (хотя тут лучше ссылки) и т.д.), необходимости возвратить больше одного значения из ф-ции.
Убрал все int* параметры, и оставил их простыми интами.
если не переопределишь - по умолчанию конструктор просто копирует поля

Я обычно для проверки делаю так:
DATA(DATA&) { cout << "copy constructor...\n"; }
Таким образом проверяю, не вызывается ли конструктор копировщик. Когда его вижу - значит переделываю то что вызывает его. На этот раз не видел, потому и думал что все в порядке. А где именно он вызывается?
Я ж вроде везде только адреса передаю и присваиваю их указателям и контролирую чтоб не удалилось значение. А методы, в которых я использую - не возвращают ничего, за исключением возврата тех же указателей на предидущие и следующие узлы и поиска, который так же указатель возвращает...

старайся меньше юзать указателей. это не самая сильная сторона с++ =)

Мне просто помнятся слова нашего препода, что если освоить работу с указателями и списками - дальше проблем не будет и что указатели - одно из мощнейших средств с++) Потому и юзал их)

З.Ы. нужно в подписи фразу "Ra$cal, спасибо большое еще раз" вставить :rolleyes:

razb
02.08.2009, 14:21
ммм, а указатель разве не меньше памяти требует, если он только передает в другой метод адрес?
При передачи параметров по значению они копируются в стек, в случае с встроенными типами это не так уж критично, указатели стоит использовать при передачи данных больших обьемов (массивы, обьекты (хотя тут лучше ссылки) и т.д.), необходимости возвратить больше одного значения из ф-ции.

Ra$cal
02.08.2009, 15:09
Мне просто помнятся слова нашего препода, что если освоить работу с указателями и списками - дальше проблем не будет и что указатели - одно из мощнейших средств с++) Потому и юзал их)
мощные - да. но все надо в меру =) научиться ты научился, теперь тренируйся их разумно использовать =)

ммм, а указатель разве не меньше памяти требует, если он только передает в другой метод адрес, вместо создания нового инта?
фишка в том что указатель на инт и инт занимают по 4 байта на 32 битных машинах. так что никакого выигрыша на встроенных типах. как razb написал это выгодно с объектами, конструктор которых ощутим. например передавать вектора из 10 000 элементов разумнее по ссылке(тот же указатель, только вместо -> пишешь . что гораздо удобнее. читани главу про ссылки, они удобнее указателей =)

Я обычно для проверки делаю так:
это правильно =)

mr.The
03.08.2009, 13:31
средствами с++ нужно выполнить команду в "командной строке" и получить её результат. как? перенаправление в файл не предлагать.

__mad
03.08.2009, 15:10
выполнить команду в "командной строке" и получить её результат.

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;
}

slesh
03.08.2009, 15:16
CreateProcess и CreatePipe
А лучше google + непривязываться к языкам програмирования. Потому как API оно и в африке абгдырдыщ.
В Delphi World есть парочку исходников на эту тему:

"Как захватить весь вывод в консоли"
"Запустить консольное приложение и получить его стандартный вывод"
"CreateProcess, который возвращает консольный вывод"

Там оснавная часть кода написана на API по этому переписать на Си не составит труда.

slesh
03.08.2009, 15:22
А если не полениться и заглянуть в World C++ то там есть тоже 2 статьи с исходниками на С++

"Использование anonymous pipes для перехвата StdIn/StdOut дочернего процесса."
"Создание дочернего процесса с переназначенным вводом и выводом"

Ответы на большую половины вопрос можно сразу найти в Delphi World и World C++
Не по ленитесь и скачайте это всё добро с netcode.ru

slesh
03.08.2009, 15:25
2 __mad То что ты написал - это под пингвины, но судя по всему человеку нужно под Win

__mad
03.08.2009, 15:38
это POSIX функция, она и под виндой будет работать.

razb
03.08.2009, 18:23
это POSIX функция, она и под виндой будет работать.
С каких это пор винда является POSIX совместимой?
popen() ф-ция НЕ из стандартной библиотеки а является сис. вызовом POSIX систем.
Насколько я знаю в винде есть _popen() которая аналогична popen() _http://msdn.microsoft.com/en-us/library/96ayss4b%28VS.80%29.aspx

__mad
03.08.2009, 18:56
>С каких это пор винда является POSIX совместимой?

С давних, POSIX подсистема Windows NT является совместимой с POSIX.1.

А вот насчет popen, да, если компилить через вижал то придется писать _popen (в mingw можно и просто popen)

razb
03.08.2009, 18:58
С давних, POSIX подсистема Windows NT является совместимой с POSIX.1.
пруфлинк?

Kaimi
03.08.2009, 19:07
http://en.wikipedia.org/wiki/Microsoft_POSIX_subsystem

razb
03.08.2009, 19:16
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 совместимость )

Kaimi
03.08.2009, 19:23
Так __mad написал про Win NT, а не XP

razb
03.08.2009, 19:33
мде, а Windows NT 5.1 по твоему не XP?
XP входит в семейство вин осей NT, также как и виста и вин сервер и тд.
Перед тем как что то заявлять, лучше бы сначала внимательно почитать )

П.С. кстати в постах товарища __mad'a нечего и близко не написано про версии из этого вытекает что можно судить о любой ОС из этого семейства.

__mad
03.08.2009, 19:37
> пруфлинк?

погуглил, и что то нечего внятного не нашел. Возможно я и ошибся в своем утверждение, но вот то что для большинства (если не для всех) POSIX функций, есть аналоги в стандартной библиотеки (crt, stl) это факт.

Да и к тому же проблема mr.The решена, так что считаю что вопрос исчерпан.

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

mr.The
03.08.2009, 19:39
холивар детектед. способ __mad'а замечательно работает под виндой, компилятор mingw gcc. всем спасибо.

осталось только _ttps://forum.antichat.ru/showpost.php?p=1424458&postcount=3402

4p3
06.08.2009, 02:25
Доброе время суток.
Возникла проблема: не пишет в конец массива 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;
}

4p3
06.08.2009, 02:35
средствами с++ нужно выполнить команду в "командной строке" и получить её результат. как? перенаправление в файл не предлагать.
use system(const char* command);

Antikvazar
06.08.2009, 05:45
Нет все таки не разобрался. С помощью какого метода можно получить список открытых окон? ИМенно окон а не процессов!

slesh
06.08.2009, 10:14
Классы... компоненты... - недоверяю.
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;
}

[XAOC]
06.08.2009, 11:01
Здравствуйте

У меня возник вопрос, каким образом на C организовать быстрое удаление строки из файла ?, ну как это например сделано во многих брутах(очищение source файла), веть перезаписывать каждый раз файл(а он может достигать внушительных размеров) не есть гуд.

Ra$cal
06.08.2009, 13:52
Нет все таки не разобрался. С помощью какого метода можно получить список открытых окон? ИМенно окон а не процессов!
http://msdn.microsoft.com/en-us/library/ms633497%28VS.85%29.aspx

Antikvazar
06.08.2009, 14:31
спасибо раскал, но у меня еще специфичнее задача нужно вытаскивать данные из окна внутри которого есть список(чат\textbox) который обновляется такое вообще возможно сделать?

new-sl
06.08.2009, 14:36
как написать свои собственыи ICQ клент на с++ ? искал в гоогле нашол тока пример на делфи а мине надо иммено с++ хачу написат прогу каторая отвылает сообшения и получает их конзолную бес винапи простенкую ест у каво какие иди?

4p3
06.08.2009, 14:52
как написать свои собственыи ICQ клент на с++ ? искал в гоогле нашол тока пример на делфи а мине надо иммено с++ хачу написат прогу каторая отвылает сообшения и получает их конзолную бес винапи простенкую ест у каво какие иди?
http://www.climm.org/download.shtml.ru сурсы качни отсюда и посмотри.

new-sl
06.08.2009, 15:13
спасибо но думаю ето покашто черезчур для меня я нефига немагу вехать в етом там минебы ченить типа какоинить тоуртаила чтоби описано как и что http://icq2000cc.hobi.ru/index.html
типа етова тока на с++ мине необязатьелно чтобы был контакт лист и ригистрация я чисто хачу щас научится просто подсоединатся к серверу и передават там какиенибут дание и получать
я прачол игра на винзок от криза касперскава вроде всё понял хотелбы тоже с аскои такое попрововать :)

Ra$cal
06.08.2009, 17:30
Antikvazar
а почему нет. инжектим длл, сабклассим едит, ловим мессаги изменения текста.

Antikvazar
06.08.2009, 17:45
для новичка типа меня слишком сложно нуладно че нить придумаю другое

N5W
06.08.2009, 19:20
Изучаю С++ по книге Джесса Либерти 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

Kaimi
06.08.2009, 19:31
(choice=6,choice=7)

Думаю стоит заменить = на ==

razb
06.08.2009, 19:38
2N5W

1) внимательно читай литературу
2) для оформления кода есть теги code
3) что бы в дальнейшем такую невнимательность отсекать на этапе компиляции константы следует писать слева.

agrofyl2
06.08.2009, 22:03
Почему там 1 равно, зачем там запятая? фигня какаято вообще ничего не пойму. просто пишешь

if(i==1) cout << "aaaa\n";
else cout << "bbbb\n";

И все.

N5W
07.08.2009, 21:23
ну в 1 скобке , значит если 2 значение то делаем одно иначе другое
Думаю стоит заменить = на ==
почему == ? чем оно лучше ? )

new-sl
07.08.2009, 21:49
ну в 1 скобке , значит если 2 значение то делаем одно иначе другое

почему == ? чем оно лучше ? )
ето тебе не матиматика тут = значит возми значение каторое хранится в правои переменои и передаи ето левои переменои правая переменя может быть константои или же переменои левое значение должно всегда быть переменои ; и = такое виражение всегда возрашает правду если можно передат левое правому значению ;)
int x,y;
const int Const=7;
x=Const;
x=y;



а знак == ето равно тоесть при сравнениях исползуется имено етото знак ;)

if (x==y)
...
else
...

horlyk
07.08.2009, 22:00
почему == ? чем оно лучше ? )

Ты переменной значение как присваиваешь?
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";

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

ASQX
07.08.2009, 22:48
есть какай-нибудь разница между книгами по Си++ от Джесса Либерти? ну я видел есть 5-ое издание, а я сейчас читаю 3-е,

razb
08.08.2009, 01:31
Новое издание как правило должно быть более дополненым и исправленым.

N5W
08.08.2009, 02:40
хмм пасибо шо разьяснил )))

maptime
08.08.2009, 06:05
Кто каким компилятором пользуется ?

horlyk
08.08.2009, 13:35
Кто каким компилятором пользуется ?
от Visual Studio 2005, хотя скоро на 2008-й перейду

[XAOC]
08.08.2009, 16:27
']Здравствуйте

У меня возник вопрос, каким образом на C организовать быстрое удаление строки из файла ?, ну как это например сделано во многих брутах(очищение source файла), веть перезаписывать каждый раз файл(а он может достигать внушительных размеров) не есть гуд.

кто-нибудь ответит на мой вопрос ?)

Ra$cal
08.08.2009, 18:23
ну тока так. просто можешь оптимизировать и хранить строки в памяти. а потом соответственно их записывать. даже если ты заюзаешь какой нить класс, который выполняет удаление указанной строки, он работает по такому же принципу =)

N5W
08.08.2009, 21:04
такой вопрос , можно какнить сделать чтобы консольное приложение на с++ не закрывалось сразу при двойном щелчке, заело постоянно открывать смд и запускать через ком , строку(

Kaimi
08.08.2009, 21:08
такой вопрос , можно какнить сделать чтобы консольное приложение на с++ не закрывалось сразу при двойном щелчке, заело постоянно открывать смд и запускать через ком , строку(

getch в конце напиши или там cin или system("pause")

ASQX
08.08.2009, 22:52
висуал студия чот как-то не так, попробовал code::blocks (тут был в теме какой-то линк) имхо там текстовый редактор лучше,? кто им пользуется?

Fata1ex
08.08.2009, 22:53
я пользовался

к чему твой пост? на вкус и цвет - каждый выбирает то, что ему удобнее и ближе

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

mr.The
08.08.2009, 22:56
висуал студия чот как-то не так, попробовал code::blocks (тут был в теме какой-то линк) имхо там текстовый редактор лучше,? кто им пользуется?
я юзаю. после него, студия - громоздкое кривое говно. а тут всё красиво и компилятор неплохой.

Fata1ex
08.08.2009, 22:57
и компилятор неплохой
мда

громоздкое кривое говно
да ну? назови мне пять существенных преимуществ code::blocks над Visual C++

ASQX
08.08.2009, 23:01
тупой вопрос, как там сменить язык на инглиш, в визуале,

horlyk
09.08.2009, 00:12
тупой вопрос, как там сменить язык на инглиш, в визуале,

Если ты 2008-й экспресс юзаешь - скачай английскую версию)

З.Ы. Я начинал программировать в вижуал С++ 6. То ли у меня версия была кривая, то ли еще что-то, но он часто при компиляции зависал и ниче сделать нельзя было. Принудительное выгружение из памяти тож не всегда срабатывало. Потом появилась 2005-я студия и все кардинально изменилось. Я к ней привык и ни на какие codeblocks переходить совсем не хочется. Просто привык, удобно, да и работает она стабильно. Вот скоро на 2008-й переходить буду, но все никак не решаюсь, хотя он уже стоит, при чем полная версия, не экспресс.

Ra$cal
09.08.2009, 00:56
скажем так - студия сама по себе для с++ кодинга дает мало. без visual assista она не самое подходящее средство. студия очень сильно заточена под нет. достаточно посмотреть на встроенные средства юниттестов в 2008. а 2010 так ваще ахтунг... ваще не заметил изменений в редакторе с++, в то время как дотнет обзавелся просто огого какими фичами рефакторинга... разве что компиль с tr1 вроде как для c++. правда нада будет проверить интелисенс, может додумались список параметров выпадающий при написании имени учитывать ожидаемый тип параметра, как в том же дотнете сделано =\
но кодеблокс по возможностям рефакторинга до студии с ва не дотягивает, хз чего в нем такого хорошего.

mr.The
09.08.2009, 13:41
да ну? назови мне пять существенных преимуществ code::blocks над Visual C++
не назову. моё знакомство со студией закончилось тем, что мне нужно было скомпилить софт имено её компилятором. я открыл её. увидел этот "медиаплеер"(нет, ну реально нафига там такой дизайн?), поклацал, нефига не разобрался и закрыл её. а потом просто прикрутил её компилятор к code::blocks.

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

а вообще это очередной бесполезный холивар. каждому своё.

Fata1ex
09.08.2009, 13:47
Холивар я не открывал, просто попросил обосновать свою фразу насчет "кривого говна". А насчет "каждому - свое" я написал еще в первом посте.

razb
09.08.2009, 14:28
не назову. моё знакомство со студией закончилось тем, что мне нужно было скомпилить софт имено её компилятором. я открыл её. увидел этот "медиаплеер"(нет, ну реально нафига там такой дизайн?), поклацал, нефига не разобрался и закрыл её. а потом просто прикрутил её компилятор к code::blocks.
А visual studio command prompt для кого сделана? ))
Все можно и с консоли собрать, загружать IDЕ совсем не нужно, также make-файлы никто не отменял.

Полностью солидарен с Fata1ex"ом, ибо для проектов аля "хелло ворлд" может и показаться "кривое говно с медиаплеером" что тоже очень сомнительно, но для серьезных проектов в несколько тысяч файлов и классов сомневаюсь что code::blocks подойдет ))

horlyk
09.08.2009, 15:01
не назову. моё знакомство со студией закончилось тем, что мне нужно было скомпилить софт имено её компилятором. я открыл её. увидел этот "медиаплеер"(нет, ну реально нафига там такой дизайн?), поклацал, нефига не разобрался и закрыл её. а потом просто прикрутил её компилятор к code::blocks.

Не вижу там ничего ужасного, а "медиаплеера" и в помине. Если тебе тот интерфейс не понравился, так что мешает настроить его под себя? Настраивается там практически все. То что лишнее - убирается. Я вообще создал свою панельку и вывел на нее основные действия. Большую часть стандартного скрыл, да и абсолютно все там поддается перемещению.

Скрин моей настроенной студии:
тыць (http://www.dagoth.at.ua/img.JPG)

slesh
09.08.2009, 15:20
2 horlyk настроено простенько и со вкусом. Но есть 3 недостатка.
1) ты не видиш результатов компила. Или если появляется окно то его нужно убирать
2) нет списка файлов проекта, когда по 20 файлов, то удобное очень переходить на них
3) нет списка процедур. когда по 20 файлов, и в каждом по столько же процедур, то тяжко быстро переходить к нужной. )

horlyk
09.08.2009, 15:27
2 horlyk настроено простенько и со вкусом. Но есть 3 недостатка.
1) ты не видиш результатов компила. Или если появляется окно то его нужно убирать
2) нет списка файлов проекта, когда по 20 файлов, то удобное очень переходить на них
3) нет списка процедур. когда по 20 файлов, и в каждом по столько же процедур, то тяжко быстро переходить к нужной. )

1. снизу вкладочка Output. В процессе написания кода она свернута, но когда компилишь - она вылазит и показывает результаты. Рядом вкладочка с ошибками, если таковы найдены. Все оно автоматом вылазит и скрывается. :)
2. Справа есть вкладочка Solution Explorer. Чтоб не загромождать место - я все сделал чтоб оно автоматом скрывалось.
3. ммм, а что это за список такой? :rolleyes:

mr.The
09.08.2009, 16:01
horlyk, уже лучше, чем то что я увидел.

А вот так выглядит у меня:
http://i.piccy.info/i4/d1/a7/c51cfee85c7ce6150bee61f6d49e.jpeg (http://i.piccy.info/i4/6b/eb/93eab97e540c7c641ed707b22050.jpeg)
и всем требованиям slesh'a(да вобщем-то и моим) удовлетворяет

horlyk
09.08.2009, 16:21
Список процедур - это то что у тебя на скрине из выпадающего меню видно? Если да, то у меня он прямо над кодом висит возле Global Scope. А если нет, то что оно такое?

З.Ы. AIMP рулит) попробуй качнуть другой скин, у мну на пример обложка WMP11 vista ultimate стоит)

4p3
09.08.2009, 22:43
поклацал, нефига не разобрался и закрыл её.

Концептуально.

dr.Web
10.08.2009, 00:37
#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 );
}

почему не работает???

dr.Web
10.08.2009, 00:43
#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 работает.а мне надо чар

razb
10.08.2009, 01:09
для сравнения чар массивов используеться strcmp()

Ra$cal
10.08.2009, 07:01
большая картинка (http://img33.imageshack.us/img33/3535/63663013.png)
к вопросу о студии и кодеблоксе. вот моя настройка студии. есть ли все это в кодеблоксе, ибо без этого работать очень напряжно даже в небольшом проекте.

1 - Когда указатель на переменной - выводится место ее объявления. Т.е. очень легко понять какой тип и как инициализируется.
2 - Список методов и полей для класса, выбранного слева. Переход к методу по клику. Вроде как в кодеблоксе есть.
3 - выбранная переменная подсвечена во всем файле, давая общий обзор границ использования переменной. Легко найти изменения и использования.
4 - Типа саммари для текущего файла. Легко ориентироваться в доступных классах, методах, полях. Так же легко переходить к нужному.

Подсветка методов и переменных в принципе помогает сразу отличать методы от чего либо еще.
Ну и естественно фичи типа Find References, автопереименовывание метода, переменной (с переименовывнием ее в местах использования во всем проекте), выделение выбранного кода в новый метод с определением переменных, которые требуется передать параметром и прочие вкусные рефакторинги. Насколько этим богат кодеблокс? Может перелезу на него, в случае наличия данных фич. Правда на сишарпе там врядли покодишь.

slesh
10.08.2009, 08:42
Ну тогда вот моя настройка 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.

slesh
10.08.2009, 10:59
Какая была студия такую и поставил. А попутно еще висит с ней DDK и VC++ 6.0 Eng
И если дело на то пошло, то винда Eng без руссификаторов. Так что не стоит умничать.

De-visible
10.08.2009, 11:01
Какая была студия такую и поставил. А попутно еще висит с ней DDK и VC++ 6.0 Eng
И если дело на то пошло, то винда Eng без руссификаторов. Так что не стоит умничать.
мой пост не был упреком, больше вопросом, почему... а ты сразу нервничаешь((((

slesh
10.08.2009, 11:12
А я ничего против и не имею, просто ты так сказал как будто русская версия - это плохо.

А вообще разделять софт на рус и инг привык тока тогда когда есть весомая разница.
Вот к примеру 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

slesh
10.08.2009, 11:47
С инглишем хорошо, а вот с инетом ооочень херово ) Что нашел у друзей то и взял.

Glazz
11.08.2009, 13:07
Нужно сделать мини реализацию прокси сервера с 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 авторизация не нужна), но клиент рвет соединение. Что не так шлю? Оо
Код дай глянуть... Такое ощущение, что ты в десятичном всё посылаешь...

slesh
11.08.2009, 16:44
з що за прога? 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

slesh
11.08.2009, 18:13
Как вариант - сделать прогу не консольной а обычной гуишной, но в начале прописать AllocConsole; - создастся консоль в виде другова окна и туда будут выводитсья данные.
FreeConsole - чтобы опять убрать когда не нужна

.ATK
12.08.2009, 01:18
создать не Win32 Console Application, а Win32 Project, опции по умолчанию, а потом код в главной функции (WinMain) закоменти и пиши свой...

ASQX
12.08.2009, 19:03
кто-нить может скинуть студию 2006?

Ra$cal
12.08.2009, 19:19
нету такой

ASQX
12.08.2009, 19:25
ну висуал студия 06? есть такая епт
=\

Велемир
12.08.2009, 19:31
int const mass[] = { 1,2,3,4,5 };

int x = sizeof(mass);
cout << x;

Почему sizeof() выводит 20 ?

.Slip
12.08.2009, 19:40
int const mass[] = { 1,2,3,4,5 };

int x = sizeof(mass);
cout << x;

Почему sizeof() выводит 20 ?
Какбы байты

Ra$cal
12.08.2009, 19:49
если хочешь число элементов делай так

sizeof(mass) / sizeof(mass[0])

Велемир
12.08.2009, 20:27
Ребят,можно поподробней ? также вопрос: можно привести пользоательскую сумму сложения двух целочисленных аргументов ? Нигде не могу найти работающий пример.Так и не понял, зачем там нужны эти указатели...Я привык,что в пхп сразу объявляешь переменные и передаёшь их в функцию,а оттуда возвращаешь их или передаёшь в другую функцию...А тут вообще лес какой-то с грибами (

ЗЫ: Почему именно sizeof(mass) / sizeof(mass[0]) ? Что за философия такая непонятно...

__mad
12.08.2009, 20:38
>Почему именно sizeof(mass) / sizeof(mass[0]) ? Что за философия такая непонятно...

Все очень просто, sizeof возвращает размер объекта (в данном случае массива) в байтах, а у тебя как раз массив типа int (4 байта) состоящий из 5 элементов вот отсюда и получается 20 байт, а вот sizeof(mass[0]) это уже размер одного элемента в байтах то есть размер инта (4 байта).

>можно привести пользоательскую сумму сложения двух целочисленных аргументов

вопрос совсем не ясен, попробую угадать:

int sum(a, b)
{
return a + b;
}

Ra$cal
12.08.2009, 20:57
ну читывая вопрос про массив видимо в планах сложить элементы массива =)

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;
}

Велемир
12.08.2009, 21:17
Не,_mad угадал.но всё это было очень познавательно:).Пасибо вам,ребятки!:)))Так кавайно на душе......

Велемир
12.08.2009, 21:21
Эм,в моменте sum(a,b) компилько ругается:

error: initializer expression list treated as compound expression
compilation terminated due to -Wfatal-errors.

Велемир
12.08.2009, 21:34
Пример:

int sum(a, b)
{
return a + b;
}

Тут и ругается... Именно в моменте объявления функции.

horlyk
12.08.2009, 21:40
int sum(int a,int b)
{
return a + b;
}

попробуй так :)

З.Ы. Велемир, ты че, фанат аниме?)

Велемир
12.08.2009, 21:54
#include <iostream>

int main() {

cout << "shit!";


}

int add_values (int а, int b)

{
int result;
result= а+b;
return (result);
}

result=add_values (1, 2);



Даже такой пример не работает...обалдеть.

ASQX
12.08.2009, 21:55
#include <iostream>
using namespace std;

Kaimi
12.08.2009, 22:00
Даже такой пример не работает...обалдеть.

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

fker
12.08.2009, 22:06
#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);
}