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

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


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

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

Выпуск № 718
от 22.04.2007, 21:35

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


Вопрос № 82877: Уважаемые эксперты,помогите разобраться в таком вопросе: Пример написан в Builder6. В метод Fun класса ATest в качестве параметра по ссылке передаем вектор, содержащий объекты того же класса ATest. В методе объявлен итератор k и иници...
Вопрос № 82970: Здравствуйте. В WinAPI я могу получить системную ошибку функцией GetLastError, как в //1 (см. приложение). Вопрос: могу ли я воспользоваться функцией GetLastError, работая со стандартными потоками C++, как в //2 (см. приложение)? Или возвращаемое...
Вопрос № 83008: Господа, всем приятного настроения. Пожалуйста, ответьте на вопрос такой: каким образом можно передать файл с компутера на компутер так, чтобы windows смог принять его без какой-либо помощи? желательно с примером. Я уже немного знаю ...
Вопрос № 83018: Доброго времени суток.Мне надо написать программу для подсчёта суммы и среднего значения елементов нижней треугольной матрици. Розмерность матриц (в общем не квадратных) передавать через аргументи функции main()юПамять под матрицу выделять динамическ...

Вопрос № 82.877
Уважаемые эксперты,помогите разобраться в таком вопросе:
Пример написан в Builder6.
В метод Fun класса ATest в качестве параметра по ссылке передаем
вектор, содержащий объекты того же класса ATest.
В методе объявлен итератор k и инициализирован функцией end(),
которая по-идее должна вернуть указатель на конец вектора.
Методом тыка обнаружилось, что возвращает она указатель на
какой-то мусор, а итератор k корректно работает только в том
случае, если определить его как:
vector<ATest>::iterator k=P.end()-1;
При чем итератор начала вектора работает нормально.
В чем прикол? Заранее спасибо.

Приложение:

Отправлен: 16.04.2007, 23:59
Вопрос задал: Def (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Терсков Сергей
Здравствуйте, Def!
Дело в том, что итератор end() указывает на элемент стоящий за концом контейнера (в данном случае вектора). Именно поэтому он возвращает мусор в этом месте:

vector<ATest>::iterator k=P.end();

И правильно будет

vector<ATest>::iterator k=P.end() - 1;

А вообще лучше воспользоваться всего лишь одним итератором

vector<ATest>::iterator iter;

for(iter = P.begin(); iter < P.end(); ++iter) {
//Ваш цикл
}
Ответ отправил: Терсков Сергей (статус: 7-ой класс)
Ответ отправлен: 17.04.2007, 02:51


Вопрос № 82.970
Здравствуйте.
В WinAPI я могу получить системную ошибку функцией GetLastError, как в //1 (см. приложение). Вопрос: могу ли я воспользоваться функцией GetLastError, работая со стандартными потоками C++, как в //2 (см. приложение)? Или возвращаемое ею значение в этом случае не определено?
Спасибо.

Приложение:

Отправлен: 17.04.2007, 15:35
Вопрос задал: Arcady0602 (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 9)

Отвечает: Mystic
Здравствуйте, Arcady0602!
Нет, не можете. В стандартных потоках есть другие средства для выявления ошибки. Насколько я знаю, функция GetLastError() используется только в WinAPI (хотя могу и ошибаться). Но если вдруг это понадобится, вызывайте в случае неудачи SetLastError(DWORD), а затем используйте GetLastError() (это может понадобиться при работе с классами, хотя и в редких случаях).
Функции, об ошибке которых можно узнать через GetLastError(), перечислены в MSDN. (точнее у каждой функции написано, когда происходит ошибка и как получить ее код).
Ответ отправил: Mystic (статус: 6-ой класс)
Ответ отправлен: 17.04.2007, 16:10
Оценка за ответ: 4
Комментарий оценки:
У меня были догадки, что потоки C++ в компиляторах под Windows обёрнуты поверх функций в/в. WinAPI, тогда GetLastError должна работать. Но это были только догадки. Моё предположение подтверждает ответ эксперта Ilkras.

Отвечает: Ilkras
Здравствуйте, Arcady0602!
Вы можете пользоваться функцией GetLastError когда угодно (если вы работаете в Windows) и она честно будет вам возвращать значение последней ошибки совершенной функциями WinAPI. Специальной функции для того чтобы вытащить последнюю ошибку потоков я не нашел. С другой стороны, можно не сомневаться, что потоки в VisualC реализованы через WinAPI, так что GetLastError будет тоже полезной.
Ответ отправил: Ilkras (статус: 7-ой класс)
Ответ отправлен: 17.04.2007, 21:57
Оценка за ответ: 5
Комментарий оценки:
Именно то, что я надеялся прочитать: потоки C++ в компиляторах под Windows реализованы поверх WinAPI. Спасибо.


Вопрос № 83.008
Господа, всем приятного настроения.
Пожалуйста, ответьте на вопрос такой:
каким образом можно передать файл с компутера на компутер так, чтобы windows смог принять его без какой-либо помощи? желательно с примером.

Я уже немного знаю про функцию TransmitFile. Но ИМХО надо знать больше.

P.S. Прошу не обижаться, если я не смогу выставить оценки, я нечасто выхожу в инет.
Отправлен: 17.04.2007, 19:53
Вопрос задал: Karlson (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 3)

Отвечает: Boompro
Здравствуйте, Karlson!
*****
Ответ удален и перемещен в ветку форума «О деятельности экспертов и работе портала» - «Удаленные ответы для обсуждения»
*****
[Климова М.]
= = =
Шутить надо в подходящее время и в подходящем месте. А ответ удален по причине его бесполезности.


Ответ отправил: Boompro (статус: 3-ий класс)
Ответ отправлен: 17.04.2007, 20:37
Оценка за ответ: 1
Комментарий оценки:
Если вопрос непонятен, то следует уточнить, что именно в нем неясно.

Для дальнейшего уточняю, что имеется функция TransmitFile(...), которая способна отправить некий файл черей некий сокет на некий компутер. Windows в состоянии принять этот файл. Вопрос состоял в том как объяснить отцу-виндоузу, что файл пришел и его пора сохранить.
С уважением...


Вопрос № 83.018
Доброго времени суток.Мне надо написать программу для подсчёта суммы и среднего значения елементов нижней треугольной матрици. Розмерность матриц (в общем не квадратных) передавать через аргументи функции main()юПамять под матрицу выделять динамическию
Отправлен: 17.04.2007, 20:52
Вопрос задал: Nightman (статус: 1-ый класс)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 3)

Отвечает: Boompro
Здравствуйте, Nightman!
*****
Ответ удален и перемещен в ветку форума «О деятельности экспертов и работе портала» - «Удаленные ответы для обсуждения»
*****
[Климова М.]
= = =
Ответ удален по причине его бесполезности.


Ответ отправил: Boompro (статус: 3-ий класс)
Ответ отправлен: 17.04.2007, 20:56
Оценка за ответ: 5
Комментарий оценки:
Да , пожалуйст,мне очень срочно надо!!!

Отвечает: Mitya86
Здравствуйте, Nightman!

Насколько я понял передача параметров через функцию main() означает, что параметры следует передавать при запуске программы через командную строку?
если да, то это осуществить легко. Например твоя программа называется MyProg.exe. Тогда просто пишешь в командной строке "MyProg.exe 3 5".
В программе, чтобы получить эти значения, функцию main следует объявить так:
void main(int argc, char* argv[])
переменная argc содержит количество переданных параметров, а массив указателей argv содержит указатели на переданные параметры. Т.е. в нашем примере в argv[0] будет храниться 3, а в argv[1] - 5.
Динамическое создание массива можно осуществить с помощью оператора new.
Например если ты хочешь динамически создать целочисленный массив, то тебе надо осуществить 2 шага - создать указатель на целочисленную переменную и с помощью оператора выделить память под массив.
int * masiv;
masiv = new int [5];
Так будет создан массив из 5 элементов.
С матрицами, сиречь двумерными масивами, немного сложнее.
Я могу ошибаться, но насколько я знаю в таких случаях создают массив массивов(чем собственно говоря и явлются матрицы). Например:
int *Masiv[5];
for(int i=0;i<5;i++)
Masiv[i]=new int[8];
Так можно создать матрицу 5х8.
Вот вроде и все, остальное дело техники. Прошу прощения за возможные ошибки. Удачи
Ответ отправил: Mitya86 (статус: 3-ий класс)
Ответ отправлен: 17.04.2007, 23:34
Оценка за ответ: 4
Комментарий оценки:
ответ правильний , но мне нужно написатьпод "С" , а функцыя "new" есть токо в "С++" :(

Отвечает: Терсков Сергей
Здравствуйте, Nightman!
Попробуйте вот такой вариант...

Приложение:

Ответ отправил: Терсков Сергей (статус: 7-ой класс)
Ответ отправлен: 18.04.2007, 03:01
Оценка за ответ: 2
Комментарий оценки:
я не понял, как откомпилировать програму.выдаёт 52
ошибки:)

Отвечает: Ross
Здравствуйте, Nightman!

Решение в приложении. Используется выделение памяти через указатели

Приложение:

---------
Доступно только то, что видимо (c) Б. Керниган

Ответ отправил: Ross (статус: 8-ой класс)
Ответ отправлен: 18.04.2007, 15:33
Оценка за ответ: 4
Комментарий оценки:
Большоэ спасибо , но программа не создаьот матрици больше чем 2*2:(


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

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

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

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

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


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


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Email: support@rusfaq.ru, тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.50 (beta) от 15.04.2007
Яндекс Rambler's Top100

В избранное