Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


Информационный Канал Subscribe.Ru

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 264
от 08.12.2005, 20:57

Администратор:Калашников О.А.
В рассылке:Подписчиков: 248, Экспертов: 41
В номере:Вопросов: 4, Ответов: 12


Вопрос № 30664: Доброго времени суток уважаемые эксперты! Я новичок в С и прошу вас помочь мне. Среда разработки MS Visual C++ Я создаю диалоговое окно^ DialogBox(hInst,(LPCTSTR) IDD_SOME, hWnd, (DLGPROC) some_proc); в IDD_SOME у меня есть Edit C...
Вопрос № 30689: Здравствуйте ув. эксперы! В приложении код моей программы, MessageBox у меня появляется пустой, подскажите в чем дело?...
Вопрос № 30707: Вопрос такой. Есть задание на лабу: написать класс mystring, перегрузить там операторы и т.д. В приложении - код класса. Вопрос такой. Как корректно, чтобы не придрались вернуть из класса объект? И вообще, к чему можно придраться в этом ...
Вопрос № 30712: Решил помочь одной девушке. Программа пишется на C. Задание такое: описать структуру с именем student, содержащую след. поля: ф.и.о. студента, номер группы и успеваемость. Что-то вроде базы данных. 1)создание нового файла 2)добавление записи...

Вопрос № 30.664
Доброго времени суток уважаемые эксперты!
Я новичок в С и прошу вас помочь мне.
Среда разработки MS Visual C++
Я создаю диалоговое окно^
DialogBox(hInst,(LPCTSTR) IDD_SOME, hWnd, (DLGPROC) some_proc);
в IDD_SOME у меня есть Edit Control с ID "IDC_IP_ADRESS".
Как мне в обработке процедуры Dialog Box узнать значение в этом Edit Control?
Как узнать его handle?
И как вообще с этим компонентом взаимодействовать если его "не я создал а диалоговое окно"?
Отправлен: 02.12.2005, 22:28
Вопрос задал: DRS (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Jadd
Здравствуйте, DRS!
Все правильно. На OnInitialUpdate диалог создает все "свои" окна (контролы тоже окна). Получить контрол можно по его ID. Т.е. пишем так:
CString EditValue;
CWnd *pWnd = GetDlgItem(IDC_IP_ADRESS);
pWnd->GetWindowText(EditValue);

В EditValue будет значение этого контрола. Можно привести указатель на CWnd к CIPAddressCtrl, т.е. ((CIPAddressCtrl*)pWnd)->GetAddress(....);

Если нужен только WinAPI вариант, тогда делайте так:
HWND hIpedit = GetDlgItem(hWnd, //диалога
IDC_IP_ADRESS);

GetWindowText(hIpedit, EditValue.GetBuffer(0), 255);

Примерно так. Пишите, коли возникнут проблемы или вопросы.

---------
Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Специалист)
Отправлен: 02.12.2005, 22:59
Оценка за ответ: 5
Комментарий оценки:
Спасибо

Отвечает: Raptor1
Здравствуйте, DRS!
GetDlgItem(hwnd,IDC_IP_ADRESS) вернет вам его HWND, вот с ним и работайте
Ответ отправил: Raptor1 (статус: Студент)
Отправлен: 02.12.2005, 23:22
Оценка за ответ: 4
Комментарий оценки:
Ответили не на все поставленные вопросы.


Вопрос № 30.689
Здравствуйте ув. эксперы!
В приложении код моей программы, MessageBox у меня появляется пустой, подскажите в чем дело?

Приложение:

Отправлен: 03.12.2005, 10:12
Вопрос задал: DRS (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 4)

Отвечает: Zitz
Здравствуйте, DRS!

Да все вроде пашет...
Вот только если hIpeditу у тебя то что я думаю то перед ним надо
UpdateData() зделать чтобы приложение переслало данные...
Ответ отправил: Zitz (статус: 2-ой класс)
Отправлен: 03.12.2005, 11:35
Оценка за ответ: 3
Комментарий оценки:
Не нашел описания использования такой функции как UpdateData(). Напишите в минифоруме пример.

Отвечает: estiGi
Здравствуйте, DRS!
Так подсказать сложновато, потому что все вроде правильно (ну, не считая того, что передавать буфер таким образом - попахивает извращением). Нужно видеть больше кода :)
Единственное что здесь может быть, если в функции GetWindowText в Text ничего не записывается
Ответ отправил: estiGi (статус: 8-ой класс)
Отправлен: 03.12.2005, 11:41
Оценка за ответ: 5
Комментарий оценки:
Напишите пожалуйста на мини форуме: как вы считает нужным передавать буфер.

Отвечает: Raptor1
Здравствуйте, DRS!
А есть ли что то в окне hIpedit, если есть попробуй воспользоваться GetDlgItemText, и проверь верно ли получен hIpedit, не равен ли он NULL
Ответ отправил: Raptor1 (статус: Студент)
Отправлен: 03.12.2005, 14:55

Отвечает: DragonTusk
Здравствуйте, DRS!
Все правильно работает только Вы вызываете функцию MessageBox с параметром text , а как я понял надо вызывать с Text в С это разные переменные, судя по тому , что компилятор не выдал ошибку присутствует глобальная переменная с именем text.
Ответ отправил: DragonTusk (статус: 1-ый класс)
Отправлен: 04.12.2005, 02:01


Вопрос № 30.707
Вопрос такой. Есть задание на лабу: написать класс mystring, перегрузить там операторы и т.д.
В приложении - код класса.
Вопрос такой. Как корректно, чтобы не придрались вернуть из класса объект?
И вообще, к чему можно придраться в этом классе? Ну, точнее не придраться, а что можно сделать лучше?

Приложение:

Отправлен: 03.12.2005, 15:30
Вопрос задал: Константин (статус: 1-ый класс)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Бартунов Сергей Олегович
Здравствуйте, Константин!
Логично возвращать ссылку на char в operator[], чтобы можно было писать string s; ... s[3] = 'A';
Print лучше делать не на экран, а в поток.
Я бы добавил отладочные функции, например Dump и IsValid
Еще можно работать через аллокатор, если класс насчитан на динамическую работу. К тому же, в данном виде этот класс работает только с однобайтовыми символами, а было бы неплохо работать через шаблон с любыми char_traits
---------
Небо для Всех
Ответ отправил: Бартунов Сергей Олегович (статус: 5-ый класс)
Отправлен: 03.12.2005, 16:13
Оценка за ответ: 4

Отвечает: estiGi
Здравствуйте, Константин!
1. добавить пустой конструктор или привести первый к значению по-умолчанию
string(const char * str = NULL);
2. переменную char data[255]; заменить на char * data и создавать ее динамически, в контрукторе принимать буфер как (const char * newdata), а не как (const char newdata [255]). Нельзя так ограничивать класс.
3. добавить виртуальный деструктор, соотв. в нем чиститься
virtual ~string ();
4. добавить Find (char *) - т.е. поиск не только символа, но и строки
5. функции типа GetLen сделать inline
6. из функции Value возвращать константную строку, или перегрузить ее двумя спосбобами
7. ИМХО, слишком много ненужных this
8. Print дейстивтельно смотриться слишком узкоспециализированно
9. в функциях сравнения посоветовал бы возвращать то, что возвращает strcmp, все таки люди привыкли что 0 означает равенство, или хорошо закоментировать эту фугкцию, если делаешь наоборот
10. Сделать класс одинаково работающим как с АНСИ, так и с ЮНИКОД - строками.
пс
сам код и алгоритмы не смотрел, нету времени, звини
Ответ отправил: estiGi (статус: 8-ой класс)
Отправлен: 03.12.2005, 16:59
Оценка за ответ: 5
Комментарий оценки:
я хотел возвращать true, т.е. не 0 если они равны и false если они не равны (это про опрератор ==)
с != все точно так же с точностью до наоборот. Т.е. если не равны, то true - результат выполнения strcmp...
Т.е. сравнение - это только true и false

Отвечает: Raptor1
Здравствуйте, Константин!
А зачем тебе лучше, класс явно не для практического использования из-за малой длины строки, чтобы корректно вернуть объект нужно его корректно конструировать, чего в твоем случае не наблюдается. Тебе надо создать конструктор копий (пишу как будто он inline, т.е. в объявлении) и оператор присваивания.
string(const string& src )
{
strcpy(this->data, newdata);
length=strlen(this->data);
}
string& operator =(const string& src)
{
strcpy(this->data, newdata);
length=strlen(this->data);
return *this;
}
________________________________________________
возможно будет работать и без этого если добавить оператор
operator const char*() const
{
return data;
}
тогда будет корректно работать конструктор и оператор присваивания из char*
_____________________________________________________________
по коду:
1.
string::string(const char newdata[255])//constructor
надо заменить на
string::string(const char* newdata)
иначе при вызове придется постоянно использовать приведение
2.
this->data // зачем везде использовать this, у тебя почти нигде нет неоднозначности, по моему это просто захламляет код
3. Вообще код очень сырой и весьма далек от оптимального, например
for (int i = num, j = 0; i < this->length; i++, j++)
{
result[j] = this->data[i];
}
можно заменить одним оператором memcpy
4. В функции
string string::Right(int num)//gettin n chars from the end
ты пытаешься вернуть не то что надо
5. Зачем нужна функция Print, или эта строка предназначена только для DOS или консоли?
6. Во операторах +,+= отсутствует проверка на размер
______________________________________________________
Вообще написать толковую и удобную строку достаточно объемная работа, я этим занимался но понял, что совершенство недостижимо. В текущем состоянии в ней около 120 функций и 100 кб исходник, и много нереализованных усовершенствований. Если она тебе нужна для зачета, то доведи до ума то что уже есть, если для работы то попробуй использовать ее в 5-6 программах и сам поймешь чего в ней не хватает. Как минимум динамического выделения буфера. В качестве базы посмотри на реализацию CString в MFC, там есть чему поучиться.
Ответ отправил: Raptor1 (статус: Студент)
Отправлен: 03.12.2005, 23:21
Оценка за ответ: 5
Комментарий оценки:
Я ее для себя писал, для лабы. Ничего толкового не получилось, поэтому в своих прогах использовать не собираюсь.


Вопрос № 30.712
Решил помочь одной девушке. Программа пишется на C. Задание такое: описать структуру с именем student, содержащую след. поля: ф.и.о. студента, номер группы и успеваемость. Что-то вроде базы данных.
1)создание нового файла
2)добавление записи типа student в файл
3)удаление указанной записи
4)корректировка указанной записи
5)просмотр файла
6)сортировка по алфавиту
7)вывести информацию по группе:
- кол-во студентов сдавших сессию без троек
- кол-во студентов имеющих не более одной тройки
- кол-во студентов сдавших сессию на 5
Данные добавляются в файл только так Фамилия И. О. Потом номер группы. И успеваемость. Это я уже сделал.
Ну вобщем нужно сделать 3,4,5,6 и 7 пункты. Кто может помогите.

Приложение:

Отправлен: 03.12.2005, 17:09
Вопрос задал: psevdo (статус: 1-ый класс)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Raptor1
Здравствуйте, psevdo!
Что то много ты просишь написать, где времени то взять, да и не бесплатное оно. Здесь не руками работают как ты просишь, а головой - помогают решить какую то проблему связанную с пограммированием на С/С++ путем быстрого предоставления нужной информации.
Ответ отправил: Raptor1 (статус: Студент)
Отправлен: 03.12.2005, 23:21

Отвечает: DragonTusk
Здравствуйте, psevdo!
Функции которые тебе пригодятся:
fopen,fclose, fwrite, fread,fseek
Для записи в файл открыть как wb
для просмотра как rb
для коррекции как r+b
для сортировкисверяй первый символ ASCII - заглавные буквы там по алфивиту (0x80-0x9F)

>Решил помочь одной девушке
Ты решил ты и помогай.
Ответ отправил: DragonTusk (статус: 1-ый класс)
Отправлен: 04.12.2005, 01:49

Отвечает: PROD
Здравствуйте, psevdo!
Мало чем помогу, так как вам по сути надо всю прогу переписать, а времени у меня сейчас нет, но укажу некоторые моменты:
1) в пункте №7.2 задания сказано "кол-во студентов имеющих не более одной тройки", то есть оценок у каждого
студента несколько (оно и логично, по оценке за каждый предмет, как в зачетке).
но у вас структура типа
struct student{
char name[15];
int gr;
int uspev;
};
То есть всего один инт для всех оценок
я предлагаю структуру типа
struct student{
char name[15];
int gr;
int uspev[10];
};
так будет проще искать кол-во тех или иных оценок.
2) как я заметил у вас почти все (вернее все) функции должны возвращать Int`ы
int create()
int inf()
int sort()
int view(int sig)
и т.д.
но только несколько из них на самом деле что-то возвращают (return sig; например)
нужно либо в конце каждой функции ставить return 0;
или описывать функции как void create() например.
Кстати у вас я не нашел прототипов функции. то есть перед main(), там где вы прописываете глобальные переменные надо прописать и функции, например:
#include <stdio.h>
#include <stdlib.h>
#define MAX 10
int create();
int view(int);
// и т.д.
struct student{
char name[15];
int gr;
int uspev;
};
struct student stud[MAX];
char file[10];
main()
{...

3) в main() вы используете цикл do while, это конечно ваше право, но лично мне он не нравится (лишняя возможность придраться преподу)
лучше (на мой взгляд) сделать что-то типа такого:
bool ExitKey=false;
while(ExitKey==false){
...
switch (x)
{
...
case '9':
ExitKey==true; break;
}
кстати не забудьте про default, вдруг кто-то введет 10 или -1, преподы любят на этом ловить
4) насколько я понял у вас в файл запись идет не с "произвольным доступом", а последовательно как в текстовый, на сколько я понял из задания нужен именно произвольный доступ (если не знаете как его реализовать лучше спросите отдельным вопросом), тем более упорядочивать по алфавиту и или делать выборку из текстового файла будет проблематичней
Ответ отправил: PROD (статус: 1-ый класс)
Отправлен: 04.12.2005, 12:54


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2005, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Яндекс Rambler's Top100 hotlog_js="1.0"; hotlog_r=""+Math.random()+"&s=314124&im=101&r="+escape(document.referrer)+"&pg="+ escape(window.location.href); document.cookie="hotlog=1; path=/"; hotlog_r+="&c="+(document.cookie?"Y":"N"); hotlog_js="1.1";hotlog_r+="&j="+(navigator.javaEnabled()?"Y":"N") hotlog_js="1.2"; hotlog_r+="&wh="+screen.width+'x'+screen.height+"&px="+ (((navigator.appName.substring(0,3)=="Mic"))? screen.colorDepth:screen.pixelDepth) hotlog_js="1.3" hotlog_r+="&js="+hotlog_js; document.write("HotLog")

Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.cplus
Архив рассылки
Отписаться
Вспомнить пароль

В избранное