Неск. глупых вопросов
От: YourLastSong  
Дата: 02.05.11 16:19
Оценка: :))
Здравствуйте, господа.

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

— Как можно изменить размеры окна консоли в том случае, если приложение было написано на BC 3.1? Знаю, как реализовать это только в Visual Studio. Дело в том, что у меня используется функция вывода на экран файлов, содержащихся в данной директории, в результате чего мне необходимо наличие скроллера в правой части окна консоли. Сделать наличие скроллера в правой части окна я никак не могу.

— От чего зависит возможность использования getch (); вместо _getch (); в Visual Studio?

— Какие есть аналоги textcolor в Visual Studio? Мне необходимо выводить цветной текст примерно таким же образом, как это можно было делать в BC 3.1.

— Почему нельзя использовать нетипизированные константы в Visual Studio?

— Какое значение выводится при попытке вывода значений массива, которые не были заполнены, если данный массив был создан при помощи функции malloc? В случае использования функции calloc все элементы будут изначально равны нулю.

— Какая разница между system ("cls") и system (_T("cls"))? В каких случаях можно использовать функцию system (_T("cls"))?

— Для чего именно необходим файл stdafx.h?

— Из-за чего многие рекомендуют в серьёзных проектах писать каждый раз std::cout вместо using namespace std?

— Зачем необходимо освобождать память, которая использовалась для динамического массива? Разве после завершения функции, в котором был объявлен динамический массив, память самостоятельно не освободится?

— Зачем необходимо закрывать файл?

Заранее благодарю за возможные ответы.
Re: Неск. глупых вопросов
От: morm Россия  
Дата: 02.05.11 16:25
Оценка:
Здравствуйте, YourLastSong, Вы писали:

YLS>Здравствуйте, господа.


YLS>Заранее извиняюсь, что отвлекаю вас от более сложных проблем, связанных с программированием, однако хотелось бы узнать ответы на след. вопросы:


YLS>- Как можно изменить размеры окна консоли в том случае, если приложение было написано на BC 3.1? Знаю, как реализовать это только в Visual Studio. Дело в том, что у меня используется функция вывода на экран файлов, содержащихся в данной директории, в результате чего мне необходимо наличие скроллера в правой части окна консоли. Сделать наличие скроллера в правой части окна я никак не могу.


YLS>- От чего зависит возможность использования getch (); вместо _getch (); в Visual Studio?


YLS>- Какие есть аналоги textcolor в Visual Studio? Мне необходимо выводить цветной текст примерно таким же образом, как это можно было делать в BC 3.1.


YLS>- Почему нельзя использовать нетипизированные константы в Visual Studio?


YLS>- Какое значение выводится при попытке вывода значений массива, которые не были заполнены, если данный массив был создан при помощи функции malloc? В случае использования функции calloc все элементы будут изначально равны нулю.


YLS>- Какая разница между system ("cls") и system (_T("cls"))? В каких случаях можно использовать функцию system (_T("cls"))?


YLS>- Для чего именно необходим файл stdafx.h?


YLS>- Из-за чего многие рекомендуют в серьёзных проектах писать каждый раз std::cout вместо using namespace std?


YLS>- Зачем необходимо освобождать память, которая использовалась для динамического массива? Разве после завершения функции, в котором был объявлен динамический массив, память самостоятельно не освободится?


YLS>- Зачем необходимо закрывать файл?


YLS>Заранее благодарю за возможные ответы.


Троллишь потихоньку?
Re: Неск. глупых вопросов
От: LaptevVV Россия  
Дата: 02.05.11 16:33
Оценка:
Здравствуйте, YourLastSong, Вы писали:

YLS>- Как можно изменить размеры окна консоли в том случае, если приложение было написано на BC 3.1? Знаю, как реализовать это только в Visual Studio. Дело в том, что у меня используется функция вывода на экран файлов, содержащихся в данной директории, в результате чего мне необходимо наличие скроллера в правой части окна консоли. Сделать наличие скроллера в правой части окна я никак не могу.

Понятия не имею..
YLS>- От чего зависит возможность использования getch (); вместо _getch (); в Visual Studio?
Микрософт подчеркивает, что _getch() — не стандартная функция.
Используй system("pause");
YLS>- Какие есть аналоги textcolor в Visual Studio? Мне необходимо выводить цветной текст примерно таким же образом, как это можно было делать в BC 3.1.
Только консольные функции WinAPI
YLS>- Почему нельзя использовать нетипизированные константы в Visual Studio?
Что такое нетипизированные константы?
YLS>- Какое значение выводится при попытке вывода значений массива, которые не были заполнены, если данный массив был создан при помощи функции malloc? В случае использования функции calloc все элементы будут изначально равны нулю.
malloc ника не инициализирует память. Поэтому может быть любая конфигурация битов.
YLS>- Какая разница между system ("cls") и system (_T("cls"))? В каких случаях можно использовать функцию system (_T("cls"))?
_T — это макрос, чтобы прога не зависела от кодировки символов.
YLS>- Для чего именно необходим файл stdafx.h?
Это вставляет Студия. Если хочешь, чтобы не было — создай "пустой" проект. В свойствах проекта проставь флажок Empty.
YLS>- Из-за чего многие рекомендуют в серьёзных проектах писать каждый раз std::cout вместо using namespace std?
Чтобы не включать стандартное пространство имен, более 90% из которых в проге обычно не нужны. Префикс std:: позволяет конкретные имена использовать...
YLS>- Зачем необходимо освобождать память, которая использовалась для динамического массива? Разве после завершения функции, в котором был объявлен динамический массив, память самостоятельно не освободится?
Нет, не освободится.
YLS>- Зачем необходимо закрывать файл?
Чтобы потом опять открыть. Это сильно зависит от вида файла и режима открытия...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Неск. глупых вопросов
От: YourLastSong  
Дата: 02.05.11 17:24
Оценка:
Спасибо за ответы.

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

Извиняюсь, что вопросы настолько глупые для вас.
Re: Неск. глупых вопросов
От: MasterZiv СССР  
Дата: 02.05.11 17:26
Оценка: -1
On 02.05.2011 20:19, YourLastSong wrote:

> — Как можно изменить размеры окна консоли в том случае, если приложение было

> написано на BC 3.1?

Никак. Это приложение вообще считает, что работает в DOS-е. К Win32 API у него
нет доступа. Хотя ... можно попробовать использовать старые добрые прерывания
DOS-а (int 21) для изменения размера экрана. Но любой размер там установить
нельзя, только фиксированные из списка.

Знаю, как реализовать это только в Visual Studio. Дело в
> том, что у меня используется функция вывода на экран файлов, содержащихся в
> данной директории, в результате чего мне необходимо наличие скроллера в правой
> части окна консоли. Сделать наличие скроллера в правой части окна я никак не могу.

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

=> — От чего зависит возможность использования getch (); вместо _getch (); в Visual
> Studio?

getch() и _getch () вообще-то нестандартные функции, их нет в С.
getch -- это функция из CURSES, _getch — из микросовтовской библиотеки эмуляции
чего-то подобного CURSES но под DOS, занываемой в МС conio.

Если у тебя доступны для приложения эти две библиотеки -- можно использовать
соответственно одну из этих функций. Если нет -- нельзя. В переносимом С-шном
приложении этих функций быть не дожно.

>

> — Какие есть аналоги textcolor в Visual Studio? Мне необходимо выводить цветной
> текст примерно таким же образом, как это можно было делать в BC 3.1.

Нет аналогов. Тебе надо переписывать программу с досовой на Win32 API и
использовать функции управления окном консоли.

> — Почему нельзя использовать нетипизированные константы в Visual Studio?

Почему нельзя ? можно.


> — Какое значение выводится при попытке вывода значений массива, которые не были

> заполнены, если данный массив был создан при помощи функции malloc?

Произвольное значение. Любое.

> — Какая разница между system ("cls") и system (_T("cls"))? В каких случаях можно

> использовать функцию system (_T("cls"))?

Первый вызов верный, второй -- нет.
Функция имеет такую сигнатуру:

int system( const char *command );

Соответственно, в виде параметра ей надо передавать char*, а не TCHAR*
system (_T("cls")) ни в каких случаях использовать нельзя,
нужно (если хочешь использовать TCHAR) писать

_tsystem( _T("cls") );

> — Для чего именно необходим файл stdafx.h?

Долго объяснять не хочу, дам краткий ответ : ни для чего.
Выкини stdafx.h, stdafx.cpp из проекта, проставь в проекте на
всех исходниках "Not using precompiled header" и всё будет хорошо.
stdafx.h -- это стандартный (дебильно названый) заголовок для генерации
precompiled header-ов в VC-проектак, precompiled header-ы нужны только для
ускорения трансляции больших проектов.

> — Из-за чего многие рекомендуют в серьёзных проектах писать каждый раз std::cout

> вместо using namespace std?

Если ты пишешь using namespace std, ты вносишь все имена (известные) из
пространства имён std в глобальное пространство имён и сводиш положительный
эффект существования пространств имён на нет.
В маленьких проектах это допустимо. В крупных сложных -- нет, возможны
конфликты имён из разных пространств имён.

> — Зачем необходимо освобождать память, которая использовалась для динамического

> массива?

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

Разве после завершения функции, в котором был объявлен динамический
> массив, память самостоятельно не освободится?

В Win32 освободится. В Linux освободится. В ДОС например не освобождалась (ется).
В других операционках -- тоже не известно.
Стандарты языков С и С++ тебе не дают гарантию того, что выделенная
и неосвобождённая динамическая память твоей программы будет возвращена
системе после завершения твоей программы. Поэтому ты ОБЯЗАН освобождать
всю выделенную память по выходу из программы.


> — Зачем необходимо закрывать файл?


Чтобы данные этого файла физически сохранились на диске. Если ты не закроешь
файл или не вызовиш для этого файла функцию flush(), запись файлов физически
на диск не гарантируется.
И по той же причине, что освобождать память -- файлы -- такой же ресурс, как
и память, кол-во файлов открытых в системе не бесконечно.
Posted via RSDN NNTP Server 2.1 beta
Re[2]: Неск. глупых вопросов
От: MasterZiv СССР  
Дата: 02.05.11 17:33
Оценка:
On 02.05.2011 20:33, LaptevVV wrote:

> YLS>- Какая разница между system ("cls") и system (_T("cls"))? В каких случаях

> можно использовать функцию system (_T("cls"))?
> _T — это макрос, чтобы прога не зависела от кодировки символов.

Нунуну... Товарищь преподаватель, зачем так вульгарно-то ...
Что значит "прога не зависела от кодировки символов" ? Она всегда
он них зависит. Это макросы т.н. generic-text routine mapping, которые
позволяют программе работать либо с 1-байтовыми, либо с несколькобайтовыми
(от 1 до N байт на символ), либо с двухбайтовыми (от 2 до N байт на символ)
кодировками символов. От конкретной кодировки символов программа не
перестаёт от этого зависеть, кодировка задаётся с помощью set_locale.
Posted via RSDN NNTP Server 2.1 beta
Re[2]: Неск. глупых вопросов
От: YourLastSong  
Дата: 02.05.11 17:40
Оценка:
Спасибо, что обратили внимание на мои вопросы.

MZ>Хотя ... можно попробовать использовать старые добрые прерывания

MZ>DOS-а (int 21) для изменения размера экрана. Но любой размер там установить
MZ>нельзя, только фиксированные из списка.

Не подскажете, как это можно реализовать?

MZ>Ну и не надо это в консольном приложении.


Почему?

MZ>Почему нельзя ? можно.


const f = 5;

При попытке скомпилировать файл выдаётся ошибка "missing type specifier — int assumed. Note: C++ does not support default-int". Я, видимо, совсем глупый в этом плане.

MZ>Произвольное значение. Любое.


У меня оно одно и то же постоянно. Может, зависит всё же как-то?
Re[2]: Неск. глупых вопросов
От: dilmah США  
Дата: 02.05.11 17:50
Оценка: +1
>> — Какое значение выводится при попытке вывода значений массива, которые не были
>> заполнены, если данный массив был создан при помощи функции malloc?

MZ>Произвольное значение. Любое.


ну, в общем случае, вплоть до undefined behaviour

MZ>Разве после завершения функции, в котором был объявлен динамический

>> массив, память самостоятельно не освободится?

MZ>В Win32 освободится. В Linux освободится. В ДОС например не освобождалась (ется).

MZ>В других операционках -- тоже не известно.

он про функцию, а не процесс спрашивал

>> — Зачем необходимо закрывать файл?


MZ>Чтобы данные этого файла физически сохранились на диске. Если ты не закроешь

MZ>файл или не вызовиш для этого файла функцию flush(), запись файлов физически
MZ>на диск не гарантируется.

ни close ни flush не гарантируют запись.
fflush флашит буфера libc.
Для гарантии записи fsync

файлы нужно закрывать потому что большинство программ/библиотек имеют неограниченное время жизни, т.е. для того чтобы можно было открывать файлы вновь и вновь.
Если известно что это не нужно -- скажем программа отрабатывает раз и выходит, то и закрывать не нужно.
Re[3]: Неск. глупых вопросов
От: fuyant  
Дата: 02.05.11 17:57
Оценка:
Здравствуйте, YourLastSong, Вы писали:

MZ>>Почему нельзя ? можно.


потому что С/С++ — строго типизированный язык

YLS>const f = 5;


он наверное имел в виду, что можно написать что-то типа
const void * а = NULL;

В случае const f = 5; не указан тип, а должен быть.
нельзя написать const f = 5; просто так, не указав, что это, потому что компилятор должен сразу знать, какой тип имеется в виду (а можут быть чуть ли не что угодно — int, float, double, bool etc)
Нельзя объявить тип, а потом заявить — вы знаете, я тут хочу, чтобы это был double, преобразуйте ка мне вот это непонятно что в дабл. Не говоря уже о том, что синтаксиса для этого нет.

YLS>При попытке скомпилировать файл выдаётся ошибка "missing type specifier — int assumed. Note: C++ does not support default-int". Я, видимо, совсем глупый в этом плане.


MZ>>Произвольное значение. Любое.


YLS>У меня оно одно и то же постоянно. Может, зависит всё же как-то?


Там валяется мусор, от чего он может зависеть? Сегодня и завтра он один, а послезавтра будет другой. Опираться на значения мусора — писать заведомо бажную программу с элементами UB.
Re: Неск. глупых вопросов
От: fuyant  
Дата: 02.05.11 18:01
Оценка:
Здравствуйте, YourLastSong, Вы писали:

YLS>- Зачем необходимо освобождать память, которая использовалась для динамического массива? Разве после завершения функции, в котором был объявлен динамический массив, память самостоятельно не освободится?


Если бы это происходило, то основной смысл и польза от динамически созданных данных потерялся бы
Если бы это происходило, то пракстически единственная разница была бы в том, что данные создаются не на стеке, а в куче — а это далеко не единственное назначение динамически созданных данных
Re[3]: Неск. глупых вопросов
От: dilmah США  
Дата: 02.05.11 18:05
Оценка:
MZ>>Почему нельзя ? можно.

YLS>const f = 5;


#define f 5
Re: Неск. глупых вопросов
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 02.05.11 18:28
Оценка:
Здравствуйте, YourLastSong, Вы писали:

YLS>- Как можно изменить размеры окна консоли в том случае, если приложение было написано на BC 3.1? Знаю, как реализовать это только в Visual Studio. Дело в том, что у меня используется функция вывода на экран файлов, содержащихся в данной директории, в результате чего мне необходимо наличие скроллера в правой части окна консоли. Сделать наличие скроллера в правой части окна я никак не могу.


Лучше всего — вообще отказаться от работы с консольным вводом-выводом. Под Windows полно других средств. А то, потом тебе понадобится в консоль мышой тыкать, ещё, поди, кнопки и прочий текстовый UI изобретать начнёшь. Зачем?

YLS>- От чего зависит возможность использования getch (); вместо _getch (); в Visual Studio?


Цитата из MSDN про getch:

This POSIX function is deprecated beginning in Visual C++ 2005. Use the ISO C++ conformant _getch instead.

Складно, просто, легко запомнить. (c)

YLS>- Какие есть аналоги textcolor в Visual Studio? Мне необходимо выводить цветной текст примерно таким же образом, как это можно было делать в BC 3.1.


Снова, лучше перейти на стандартный GUI.

YLS>- Почему нельзя использовать нетипизированные константы в Visual Studio?


Наверное, из-за того, что C++ не поддерживает default-int, в отличие от C.

YLS>- Какое значение выводится при попытке вывода значений массива, которые не были заполнены, если данный массив был создан при помощи функции malloc? В случае использования функции calloc все элементы будут изначально равны нулю.


Неопределённое. malloc просто отрезает кусок памяти, а что в этой памяти будет лежать — неизвестно.

YLS>- Какая разница между system ("cls") и system (_T("cls"))? В каких случаях можно использовать функцию system (_T("cls"))?


Если твою программу предполагается компилировать как с поддержкой Unicode, так и без неё (см. опцию "Character Set" в свойствах проекта), то имеет смысл написать так:

_tcsystem(_T("cls"))


Но если ты не предполагаешь менять Unicode/MBCS, то имеет смысл воспользоваться одним из вариантов:
system("cls"); // MBCS

или
_wsystem("cls"L); // Unicode


YLS>- Для чего именно необходим файл stdafx.h?


Как правило, в него складывают редко изменяемые заголовочные файлы, которые имеет смысл поместить в precompiled header. Типичный stdafx.h выглядит примерно так:

#pragma once

#define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers
#include <stdio.h>
#include <vector>
#include <map>
// ... длинный-длинный список инклюдов всего, что нужно, можно и что может понадобиться.


А сам precompiled header генерируется при компиляции stdafx.cpp (посмотри внимательно на опции этого файла в разделе Precompiled Headers свойств проекта).

YLS>- Из-за чего многие рекомендуют в серьёзных проектах писать каждый раз std::cout вместо using namespace std?


Чтобы не было явления, известного под названием "засирание глобального пространства имён". То есть чтобы имена из std не конфликтовали с такими же именами из других namespace. Поэтому общая рекомендация тут — воздерживаться от неумеренного использования using namespace. Возможны исключения, но сейчас не тот случай, чтобы их обсуждать.

YLS>- Зачем необходимо освобождать память, которая использовалась для динамического массива? Разве после завершения функции, в котором был объявлен динамический массив, память самостоятельно не освободится?


Нет, при выходе из функции память, распределённая new или malloc не освобождается. Исключение составляет только память, выделенная на стеке функцией alloca.

YLS>- Зачем необходимо закрывать файл?


Чтобы гарантированно сбросить содержимое файла на диск (более или менее гарантированно) и для экономии системных ресурсов, расходуемых на каждый открытый файл.

YLS>Заранее благодарю за возможные ответы.


Дык!
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[2]: Неск. глупых вопросов
От: dilmah США  
Дата: 02.05.11 18:34
Оценка:
YLS>>- Зачем необходимо закрывать файл?

ГВ>Чтобы гарантированно сбросить содержимое файла на диск (более или менее гарантированно)


да не сбрасывает close ничего на диск (ну разве что в виндоуз какое-то спецповедение).
Re[3]: Неск. глупых вопросов
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 02.05.11 18:43
Оценка:
Здравствуйте, YourLastSong, Вы писали:

MZ>>Почему нельзя ? можно.


YLS>const f = 5;


YLS>При попытке скомпилировать файл выдаётся ошибка "missing type specifier — int assumed. Note: C++ does not support default-int". Я, видимо, совсем глупый в этом плане.


Тебе компилятор всё подробно объяснил. default-int допускается только в C, но не в C++. То есть если у тебя в некотором файле с расширением ".c" написано такое:

const f = 5;


...то компилятор подставит int вместо отсутствующего типа. Но это — только для C, если файл будет иметь расширение .cpp, то, соответственно, так делать нельзя.

Также, из-за отсутствия default-int на C++ нельзя писать такие функции:

func(int x){ return x; } /* Нет явного указания возвращаемого типа, по умолчанию считается int */


MZ>>Произвольное значение. Любое.

YLS>У меня оно одно и то же постоянно. Может, зависит всё же как-то?

Это может быть в debug-режиме — память заполняется специальными значениями, чтобы можно было чуть попроще отличить "использованную" память от "неиспользованной". Но вообще на такое свойство работы malloc рассчитывать нельзя — это только вспомогательный механизм для отладок.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[2]: Неск. глупых вопросов
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 02.05.11 18:45
Оценка:
Здравствуйте, YourLastSong, Вы писали:

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


Нет, не поняли. Если ты про какой-нибудь int, то превысить его лимит невозможно по определению.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[2]: Неск. глупых вопросов
От: YourLastSong  
Дата: 02.05.11 18:47
Оценка:
Так ведь неудобно иногда бывает использовать system ("pause"); из-за сообщения о том, что необходимо нажать клавишу.

ГВ>Наверное, из-за того, что C++ не поддерживает default-int, в отличие от C.


Спасибо, уже понял в результате ошибки "missing type specifier — int assumed. Note: C++ does not support default-int".
Re[3]: Неск. глупых вопросов
От: YourLastSong  
Дата: 02.05.11 18:52
Оценка:
ГВ>Нет, не поняли. Если ты про какой-нибудь int, то превысить его лимит невозможно по определению.

Если пользователь введёт число, превышающее лимит данного типа, то программа будет работать не так, как хотелось бы. Как этого можно лучше всего будет избежать?
Re[3]: Неск. глупых вопросов
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 02.05.11 19:01
Оценка:
Здравствуйте, dilmah, Вы писали:

YLS>>>- Зачем необходимо закрывать файл?

ГВ>>Чтобы гарантированно сбросить содержимое файла на диск (более или менее гарантированно)
D>да не сбрасывает close ничего на диск (ну разве что в виндоуз какое-то спецповедение).

То есть? Ты хочешь сказать, что fclose не сбрасывает буферы перед закрытием потока?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[4]: Неск. глупых вопросов
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 02.05.11 19:04
Оценка:
Здравствуйте, YourLastSong, Вы писали:

ГВ>>Нет, не поняли. Если ты про какой-нибудь int, то превысить его лимит невозможно по определению.


YLS>Если пользователь введёт число, превышающее лимит данного типа, то программа будет работать не так, как хотелось бы. Как этого можно лучше всего будет избежать?


Лучше всего — "ручным" анализом текста, который вводит пользователь.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re: Неск. глупых вопросов
От: ДимДимыч Украина http://klug.org.ua
Дата: 02.05.11 19:11
Оценка:
Здравствуйте, YourLastSong, Вы писали:

YLS>- Какое значение выводится при попытке вывода значений массива, которые не были заполнены, если данный массив был создан при помощи функции malloc?


Если это обычный (релизный) malloc, то значения могут быть абсолютно любыми.
При использовании отладочных версий malloc может заполнять распределяемую память каким-нибудь фиксированным значением, например 0xDEADBEEF.

YLS>- Из-за чего многие рекомендуют в серьёзных проектах писать каждый раз std::cout вместо using namespace std?


Чтобы не пересекались идентификаторы из разных пространств имен.

YLS>- Зачем необходимо освобождать память, которая использовалась для динамического массива? Разве после завершения функции, в котором был объявлен динамический массив, память самостоятельно не освободится?


Не освободится. В этом одно из преимуществ динамического распределения памяти: создать массив можно в одной функци и выйти из нее, а удалить массив (освободить память) — в другой.

YLS>- Зачем необходимо закрывать файл?


Чтобы освободить запись в таблице открытых файлов. Приложение может иметь ограниченное количество открытых файлов, если их только открывать и не закрывать, то со временем таблица заполнится и файлы не смогут открываться.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[3]: Неск. глупых вопросов
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 02.05.11 19:12
Оценка:
Здравствуйте, dilmah, Вы писали:

D>ни close ни flush не гарантируют запись.

D>fflush флашит буфера libc.
D>Для гарантии записи fsync

Задача: найти fsync для Visual Studio. Флаг FILE_FLAG_WRITE_THROUGH для CreateFile не предлагать.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[4]: Неск. глупых вопросов
От: dilmah США  
Дата: 02.05.11 19:46
Оценка: +1
ГВ>То есть? Ты хочешь сказать, что fclose не сбрасывает буферы перед закрытием потока?

fclose сбрасывает буферы libc.
Буферы ОС и буферы самого диска -- нет.
Re[3]: Неск. глупых вопросов
От: Erop Россия  
Дата: 02.05.11 21:49
Оценка:
Здравствуйте, dilmah, Вы писали:

D>да не сбрасывает close ничего на диск (ну разве что в виндоуз какое-то спецповедение).


Есть ещё несколько промежуточных слоёв, на каждом из которых возможна буферизация.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: Неск. глупых вопросов
От: Erop Россия  
Дата: 02.05.11 21:54
Оценка:
Здравствуйте, ДимДимыч, Вы писали:

ДД>Если это обычный (релизный) malloc, то значения могут быть абсолютно любыми.

ДД>При использовании отладочных версий malloc может заполнять распределяемую память каким-нибудь фиксированным значением, например 0xDEADBEEF.

В консольных прогах нет мышей. Из-за этого от запуска к запуску мусор может не отличаться...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: Неск. глупых вопросов
От: ДимДимыч Украина http://klug.org.ua
Дата: 03.05.11 00:43
Оценка:
Здравствуйте, Erop, Вы писали:

E>В консольных прогах нет мышей. Из-за этого от запуска к запуску мусор может не отличаться...


Эммм. Не понял, какие мыши имеются ввиду
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[4]: Неск. глупых вопросов
От: Erop Россия  
Дата: 03.05.11 07:41
Оценка:
Здравствуйте, ДимДимыч, Вы писали:

ДД>Эммм. Не понял, какие мыши имеются ввиду


Компьютерные...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: Неск. глупых вопросов
От: Sorc17 Россия  
Дата: 03.05.11 08:53
Оценка:
Здравствуйте, MasterZiv, Вы писали:

>> — Зачем необходимо закрывать файл?


MZ>Чтобы данные этого файла физически сохранились на диске. Если ты не закроешь

MZ>файл или не вызовиш для этого файла функцию flush(), запись файлов физически
MZ>на диск не гарантируется.
MZ>И по той же причине, что освобождать память -- файлы -- такой же ресурс, как
MZ>и память, кол-во файлов открытых в системе не бесконечно.

Добавлю. Не знаю как для Windows, но если в Linux этот файл — блокирующийся fifo, который служит для общения между двумя процессами, то не закрыв его вы можете подвесить процесс с другой стороны. А закрывая файл вы как бы говорите другому процессу "всем спасибо, все свободны".
Для нас [Thompson, Rob Pike, Robert Griesemer] это было просто исследование. Мы собрались вместе и решили, что ненавидим C++ [смех].
Re[5]: Неск. глупых вопросов
От: ДимДимыч Украина http://klug.org.ua
Дата: 03.05.11 09:02
Оценка:
Здравствуйте, Erop, Вы писали:

ДД>>Эммм. Не понял, какие мыши имеются ввиду


E>Компьютерные...


Тогда не ясно, какое отношение они имеют к распределению памяти.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[6]: Неск. глупых вопросов
От: Erop Россия  
Дата: 03.05.11 09:47
Оценка:
Здравствуйте, ДимДимыч, Вы писали:

ДД>Тогда не ясно, какое отношение они имеют к распределению памяти.


А про какие ясно?..

Обычно в GUI-based приложении ловится куча каких-то асинхронных сообщений, в первую очередь мышинных, они все обрабатываются, при этом могут происходить аллокации, и состояние кучи обычно возмущается. А в консольном приложении обычно всё стабильно от пуска к пуску...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[5]: Неск. глупых вопросов
От: Sorc17 Россия  
Дата: 03.05.11 10:36
Оценка: +2
Здравствуйте, dilmah, Вы писали:


ГВ>>То есть? Ты хочешь сказать, что fclose не сбрасывает буферы перед закрытием потока?


D>fclose сбрасывает буферы libc.

D>Буферы ОС и буферы самого диска -- нет.

Сбрасывает не сбрасывает, суть того о чём идёт речь в том, что после fclose по идее должен срабатывать некий механизм завершения работы с файлом. В любой ОС

fopen
fwrite
fclose
fopen
fread

позволит прочитать из файла то, что в него было записано, а

fopen
fwrite
fread

не обязательно, потому что работа с файлом не была завершена.
Для нас [Thompson, Rob Pike, Robert Griesemer] это было просто исследование. Мы собрались вместе и решили, что ненавидим C++ [смех].
Re[7]: Неск. глупых вопросов
От: ДимДимыч Украина http://klug.org.ua
Дата: 03.05.11 12:11
Оценка: :)
Здравствуйте, Erop, Вы писали:

ДД>>Тогда не ясно, какое отношение они имеют к распределению памяти.

E>А про какие ясно?..

Мало ли, может какие ментальные мыши, которые память грызут

E>Обычно в GUI-based приложении ловится куча каких-то асинхронных сообщений, в первую очередь мышинных, они все обрабатываются, при этом могут происходить аллокации, и состояние кучи обычно возмущается. А в консольном приложении обычно всё стабильно от пуска к пуску...


Ну я бы не стал рассчитывать на такие эффекты. Очень уж специфичные должны быть условия, чтобы наличие обработчиков асинхронных событий детерминированно влияло на состояние динамически выделяемой памяти.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[8]: Неск. глупых вопросов
От: Erop Россия  
Дата: 03.05.11 12:44
Оценка: +1
Здравствуйте, ДимДимыч, Вы писали:

ДД>Ну я бы не стал рассчитывать на такие эффекты. Очень уж специфичные должны быть условия, чтобы наличие обработчиков асинхронных событий детерминированно влияло на состояние динамически выделяемой памяти.


Тем не менее факт, при отладке проги с развитым GUI часто от запуска к запуску работа аллокаторов немного меняется. Из-за этого труднее воспроизводить ошибки, кстати...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: Неск. глупых вопросов
От: YourLastSong  
Дата: 03.05.11 17:45
Оценка:
Спасибо за ответы.

Надеюсь, что я вам ещё не надоел, потому что я хотел бы задать вам ещё неск. вопросов.

— Что означает array<System::String ^> ^args? С int argc, char* argv[] и int argc, char **argv вроде как разобрался (насколько я понял, первое значение отвечает за кол-во параметров, которое было передано приложению, второе — это массив символов, из которых состоят данные параметры). Правильно?

— Правильно ли я понял, что даже в том случае, если тип возвращаемого значения у функции main () присутствует, то писать return 0 вовсе необязательно? Компилятор выдаёт сообщение, однако программа запускается и завершается точно так же, как и с return 0. Это грубая ошибка или такое делать можно?

— Почему убрали возможность писать примерно такое:

int value (a, b) int a, b;
{
c = a + b;
return c;
}

Разве это не было бы удобным в функции, где много раз пришлось бы писать int value (double a, double b, double c, double d) вместо int value (a, b, c, d) double a, b, c, d или как?

— Как можно сделать проверку на то, что пользователь вводит в переменную, например, типа int — число или символ?

— Можно ли изменять адрес ячейки памяти для переменных, которые уже были объявлены в программе? Где вообще можно более подробно почитать про адреса ячеек памяти и какие интересные свойства у них есть?

Заранее благодарю за возможные ответы.
Re[2]: Неск. глупых вопросов
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 04.05.11 03:03
Оценка:
Здравствуйте, YourLastSong, Вы писали:

YLS>- Что означает array<System::String ^> ^args?


Это C++/CLI, ^ — ссылка на managed-объект. Очень сильно Microsoft-specific. Читай про .Net.

YLS>С int argc, char* argv[] и int argc, char **argv вроде как разобрался (насколько я понял, первое значение отвечает за кол-во параметров, которое было передано приложению, второе — это массив символов, из которых состоят данные параметры). Правильно?


Да. Эти параметры означают ровно то же самое, что и в программе на C.

YLS>- Правильно ли я понял, что даже в том случае, если тип возвращаемого значения у функции main () присутствует, то писать return 0 вовсе необязательно? Компилятор выдаёт сообщение, однако программа запускается и завершается точно так же, как и с return 0. Это грубая ошибка или такое делать можно?


В принципе, так делать можно, но не нужно. Код, возвращаемый из main может анализироваться запускающим процессом. Посмотри, например, здесь.

YLS>- Почему убрали возможность писать примерно такое:


YLS>int value (a, b) int a, b;

YLS>{
YLS>c = a + b;
YLS>return c;
YLS>}

YLS>Разве это не было бы удобным в функции, где много раз пришлось бы писать int value (double a, double b, double c, double d) вместо int value (a, b, c, d) double a, b, c, d или как?


"Архаичный стиль" объявления параметров не поддерживается в C++. Особых страданий по этому поводу никто, вроде, не испытывает (это я об удобстве).

YLS>- Как можно сделать проверку на то, что пользователь вводит в переменную, например, типа int — число или символ?


А как ты бы сделал это на C? Остальные вопросы будут такими: как организован ввод данных и какова, вообще говоря, задача, которую ты решаешь?

YLS>- Можно ли изменять адрес ячейки памяти для переменных, которые уже были объявлены в программе?


Адрес объекта поменять нельзя. Но можно сделать копию объекта, которая будет размещена по адресу, отличному от адреса исходного объекта.

YLS>Где вообще можно более подробно почитать про адреса ячеек памяти и какие интересные свойства у них есть?


"Ячейки памяти" в C++ — это то же самое, что и "ячейки памяти" C. Соответственно, никаких новых свойств у них не появилось, указатели в C++ имеют тот же самый смысл, что и в C.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[3]: Неск. глупых вопросов
От: YourLastSong  
Дата: 04.05.11 10:13
Оценка:
ГВ>А как ты бы сделал это на C? Остальные вопросы будут такими: как организован ввод данных и какова, вообще говоря, задача, которую ты решаешь?

Например, вот так:

int a;
cin >> a;
cout << a;
_getch ();

В данном случае пользователь может ввести абсолютно любое значение a, в том числе и символ. Как можно реализовать проверку и можно ли вообще?

Кстати, почему я так редко видел использование register перед указанием типа переменной, и почему вообще он не стоит изначально? Было бы ведь гораздо удобнее, я считаю, если бы он стоял у переменных изначально.
Re[4]: Неск. глупых вопросов
От: Chorkov Россия  
Дата: 04.05.11 12:38
Оценка:
Здравствуйте, YourLastSong, Вы писали:

ГВ>>А как ты бы сделал это на C? Остальные вопросы будут такими: как организован ввод данных и какова, вообще говоря, задача, которую ты решаешь?


YLS>Например, вот так:



YLS>int a;
YLS>cin >> a;
if(cin)
  YLS>cout << a;
else
  cerr<<"Error";
YLS>_getch ();


YLS>В данном случае пользователь может ввести абсолютно любое значение a, в том числе и символ. Как можно реализовать проверку и можно ли вообще?


YLS>Кстати, почему я так редко видел использование register перед указанием типа переменной, и почему вообще он не стоит изначально? Было бы ведь гораздо удобнее, я считаю, если бы он стоял у переменных изначально.


Компиляторы гораздо умнее чем ты дуваешь... Он и так, имеет право поместить в регистры почти любую переменую.
Практика показывает, что бездумное использование register только мешает оптимизатору.
Re[5]: Неск. глупых вопросов
От: YourLastSong  
Дата: 04.05.11 13:00
Оценка:
int a;
cin >> a;
if(cin)
cout << a;
else
cerr<<"Error";
_getch ();

В данном случае выдаётся ошибка "error C2678: binary '>>' : no operator found which takes a left-hand operand of type 'std::istream' (or there is no acceptable conversion)".
Re[6]: Неск. глупых вопросов
От: vladtronko  
Дата: 15.05.11 12:34
Оценка:
Здравствуйте, YourLastSong, Вы писали:

YLS>int a;

YLS>cin >> a;
YLS>if(cin)
YLS>cout << a;
YLS>else
YLS>cerr<<"Error";
YLS>_getch ();

YLS>В данном случае выдаётся ошибка "error C2678: binary '>>' : no operator found which takes a left-hand operand of type 'std::istream' (or there is no acceptable conversion)".


Берем шприц (cin), набираем в него крЭм (читаем значение из консоли например), и заполняем крЭмом пирожное (int a)...

А что проверяем то? if(шприц)? Дык это ж инструмент, и непростой, как там что проверять, да и зачем тебе это? if(a) было бы понятнее проверять, т.е. не равно ли случайно значение а нулю? А если надо проверить его "умещаемость" в заранее заданные пределы — то так и пишем if((крЭм > минимум) &&(крэм < максимум)) {пирожное заполнено нормально} else {варианты неправильного заполнения пирожного крЭмом}. Как-то так, чтоли
Re[6]: Неск. глупых вопросов
От: Centaur Россия  
Дата: 16.05.11 04:14
Оценка:
Здравствуйте, YourLastSong, Вы писали:

YLS>cin >> a;


YLS>В данном случае выдаётся ошибка "error C2678: binary '>>' : no operator found which takes a left-hand operand of type 'std::istream' (or there is no acceptable conversion)".


Ошибка как бы намекает, что кто-то забыл какой-то #include. Вероятнее всего — <istream>. И нет, <iostream> включить недостаточно.
Re[7]: Неск. глупых вопросов
От: vladtronko  
Дата: 16.05.11 10:50
Оценка:
Здравствуйте, Centaur, Вы писали:

C>Здравствуйте, YourLastSong, Вы писали:


YLS>>cin >> a;


YLS>>В данном случае выдаётся ошибка "error C2678: binary '>>' : no operator found which takes a left-hand operand of type 'std::istream' (or there is no acceptable conversion)".


C>Ошибка как бы намекает, что кто-то забыл какой-то #include. Вероятнее всего — <istream>. И нет, <iostream> включить недостаточно.


А не попытка приведения (cin) к boolean типу не срабатывает ли?
Re[8]: Неск. глупых вопросов
От: const_volatile  
Дата: 16.05.11 14:23
Оценка: +1
Здравствуйте, vladtronko, Вы писали:

YLS>>>cin >> a;


YLS>>>В данном случае выдаётся ошибка "error C2678: binary '>>' : no operator found which takes a left-hand operand of type 'std::istream' (or there is no acceptable conversion)".

C>>Ошибка как бы намекает, что кто-то забыл какой-то #include. Вероятнее всего — <istream>. И нет, <iostream> включить недостаточно.
V>А не попытка приведения (cin) к boolean типу не срабатывает ли?

во-первых, в сообщении об ошибке однозначно упомянут operator>>, причём тут bool вообще? во-вторых, что криминального в приведении к bool? специально для этого в классе std::basic_ios определён оператор приведения operator void*(), который позволяет использовать потоки в условных операторах без явного вызова методов good() и fail().
Re: Неск. глупых вопросов
От: Sunzer  
Дата: 17.05.11 12:11
Оценка:
Здравствуйте, YourLastSong, Вы писали:

YLS>- Какое значение выводится при попытке вывода значений массива, которые не были заполнены, если данный массив был создан при помощи функции malloc? В случае использования функции calloc все элементы будут изначально равны нулю.


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

YLS>- Для чего именно необходим файл stdafx.h?


http://www.securitylab.ru/forum/forum25/topic12300/

YLS>- Из-за чего многие рекомендуют в серьёзных проектах писать каждый раз std::cout вместо using namespace std?


потому что там используются различные неймспейсы, помимо std

YLS>- Зачем необходимо освобождать память, которая использовалась для динамического массива? Разве после завершения функции, в котором был объявлен динамический массив, память самостоятельно не освободится?


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

YLS>- Зачем необходимо закрывать файл?


Затем же зачем и закрывать входную дверь когда уходишь из дома.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.