Указатели
От: Sitr Россия  
Дата: 22.11.05 11:15
Оценка:
В чем разница между char *buffer = new char[50]; и просто char *buffer.
Зачем мне заводить указатель через new, могу завести и без new?
Я лишь учусь программировать, не смог найти ответ на этот вопрос.
И еще один вопрос по стилю программирования. Как лучше делать — упрощать код, делая его без замудренных логических конструкций(но при этом у меня получается дублирование кода) или исбавиться от дублирования, но при этом читабельность кода страдает... Ранее избавлялся от дублирования(знал что мой код никому читать не придеться)
Re: Указатели
От: Stepkh  
Дата: 22.11.05 11:22
Оценка: +1 :))) :)
Здравствуйте, Sitr, Вы писали:

S>В чем разница между char *buffer = new char[50]; и просто char *buffer.

S>Зачем мне заводить указатель через new, могу завести и без new?



Навеяло.
Вопрос на собеседовании:
Q: Как выделяется память под массив?
A: Всегда
Q: Ну хорошо, а под указатель?
A: Как повезет.
Re: Указатели
От: Ovl Россия  
Дата: 22.11.05 11:29
Оценка: 67 (5)
Здравствуйте, Sitr, Вы писали:

S>В чем разница между char *buffer = new char[50]; и просто char *buffer.

S>Зачем мне заводить указатель через new, могу завести и без new?
S>Я лишь учусь программировать, не смог найти ответ на этот вопрос.
S> И еще один вопрос по стилю программирования. Как лучше делать — упрощать код, делая его без замудренных логических конструкций(но при этом у меня получается дублирование кода) или исбавиться от дублирования, но при этом читабельность кода страдает... Ранее избавлялся от дублирования(знал что мой код никому читать не придеться)

указатель — просто "ключ" для ящика с памятью.
если ты сам себе этот ящик с помощью new не сделаешь, то будешь только взламывать чужие сундуки и портить жизнь себе и другим, потому что система по-разному может отреагировать на взломы. например уронить программу с access violation.

а new — это запрос к системе типа "дай мне памяти чутка, хочу её поюзать"

после операции
char *buffer = new char[50]

сундук размером в 50 char-ов доступен тебе полностью — делай с ним что хочешь. если он тебе не нужен больше — удали с помощью
delete[] buffer

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

когда ты объявляешь обычную переменную
int a;

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

в общем тема интересная и важная




а насчет читабельности — допустим я читаю твой код.
то по-моему лучше один раз разобраться в функции и потом думать: "ага, вот здесь она вызывается, но я там был и помню что там происходит, а если не помню — схожу посмотрю", чем каждый раз разбирать одинаковый код. а ведь это ещё и источник дополнительных ошибок.
К тому же поддержка и отладка разнесенного кода быстрее — тебе не придется в 10-ти местах править один и тот же код.
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
Re: Указатели
От: VsevolodC Россия  
Дата: 22.11.05 11:29
Оценка:
Здравствуйте, Sitr, Вы писали:

S>В чем разница между char *buffer = new char[50]; и просто char *buffer.


указатель должен на что-то указывать...
вот здесь указатель указывает на выделенную тобой память размером 50 байт
char *buffer = new char[50];
в эту память ты можешь что-то записать...

а здесь неинициализированный указатель, который неизвестно куда указывает
char *buffer;
и чего с ним делать, спрашивается?

S>Зачем мне заводить указатель через new, могу завести и без new?

S>Я лишь учусь программировать, не смог найти ответ на этот вопрос.
S> И еще один вопрос по стилю программирования. Как лучше делать — упрощать код, делая его без замудренных логических конструкций(но при этом у меня получается дублирование кода) или исбавиться от дублирования, но при этом читабельность кода страдает... Ранее избавлялся от дублирования(знал что мой код никому читать не придеться)

то, что повторяется много раз, принято выделять в функцию.
Re: Указатели
От: diro  
Дата: 22.11.05 11:31
Оценка:
Здравствуйте, Sitr, Вы писали:

S>В чем разница между char *buffer = new char[50]; и просто char *buffer.

S>Зачем мне заводить указатель через new, могу завести и без new?
S>Я лишь учусь программировать, не смог найти ответ на этот вопрос.
Постараюсь ответить проще: когда ты пишешь :

char myBuff[128];

память под эту переменную выделяется сразу, т.е. когда программа запустилась у тебя есть myBuff размером 128 байт.

Однако во многих случаях ты просто напросто можешь не знать сколько тебе понадобится памяти — это станет известно только в ходе выполнения программы:

char *myBuff;
int mySize = CallSomeFunc();
myBuff = new char[mySize];

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

S> И еще один вопрос по стилю программирования. Как лучше делать — упрощать код, делая его без замудренных логических конструкций(но при этом у меня получается дублирование кода) или исбавиться от дублирования, но при этом читабельность кода страдает... Ранее избавлялся от дублирования(знал что мой код никому читать не придеться)


Поясни на примере пожалуйста, так очень сложно понять что ты имеешь ввиду.
Re: Указатели
От: SnowMan  
Дата: 22.11.05 11:48
Оценка:
Здравствуйте, Sitr, Вы писали:

S> И еще один вопрос по стилю программирования. Как лучше делать — упрощать код, делая его без замудренных логических конструкций(но при этом у меня получается дублирование кода) или исбавиться от дублирования, но при этом читабельность кода страдает... Ранее избавлялся от дублирования(знал что мой код никому читать не придеться)


Избавляться от дублирования, улучшая при этом читабельность, и только так!..
Re: Указатели
От: Глеб Алексеев  
Дата: 22.11.05 11:53
Оценка: 6 (2) +4 :)
Здравствуйте, Sitr, Вы писали:

S> И еще один вопрос по стилю программирования. Как лучше делать — упрощать код, делая его без замудренных логических конструкций(но при этом у меня получается дублирование кода) или исбавиться от дублирования, но при этом читабельность кода страдает... Ранее избавлялся от дублирования(знал что мой код никому читать не придеться)


Забей на стиль программирования, на проектирование, на читабельность, на все. Научись писать программы, которые работают, ставь себе задачи и решай их. В какой-то момент ты сам почувствуешь, что дальше так жить нельзя, программы невозможно модифицировать и отлаживать, и только тогда можно начинать интересоваться ООП, рефакторингом, generic программированием и прочими высокими материями. Не написав n-го количества программ, не умея написать работающую хоть как-то программу, невозможно понять цели методологий анализа и проектирования, впасть навсегда в т.н. "паралич анализа" и превратиться в теоретика от программирования (вроде меня ). Не ставь пока вопрос "как красивее, как правильнее", эту красоту и правильность нужно научиться видеть.

з.ы. К слову, грамотное избавление от дублирования только повышает читаемость .
... << RSDN@Home 1.2.0 alpha rev. 619>>
Re: Указатели
От: srggal Украина  
Дата: 22.11.05 11:57
Оценка:
Здравствуйте, Sitr, Вы писали:

S> И еще один вопрос по стилю программирования. Как лучше делать — упрощать код, делая его без замудренных логических конструкций(но при этом у меня получается дублирование кода) или исбавиться от дублирования, но при этом читабельность кода страдает... Ранее избавлялся от дублирования(знал что мой код никому читать не придеться)


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

ЗЫ
Лучше привести небольшой, самодостаточный фрагмент кода (foobar), чтобы не отбить охоту отвечать Вам
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[2]: Указатели
От: ekamaloff Великобритания  
Дата: 22.11.05 12:23
Оценка:
Здравствуйте, Глеб Алексеев, Вы писали:

ГА>Здравствуйте, Sitr, Вы писали:


S>> И еще один вопрос по стилю программирования. Как лучше делать — упрощать код, делая его без замудренных логических конструкций(но при этом у меня получается дублирование кода) или исбавиться от дублирования, но при этом читабельность кода страдает... Ранее избавлялся от дублирования(знал что мой код никому читать не придеться)


ГА>Забей на стиль программирования, на проектирование, на читабельность, на все. Научись писать программы, которые работают, ставь себе задачи и решай их. В какой-то момент ты сам почувствуешь, что дальше так жить нельзя, программы невозможно модифицировать и отлаживать, и только тогда можно начинать интересоваться ООП, рефакторингом, generic программированием и прочими высокими материями. Не написав n-го количества программ, не умея написать работающую хоть как-то программу, невозможно понять цели методологий анализа и проектирования, впасть навсегда в т.н. "паралич анализа" и превратиться в теоретика от программирования (вроде меня ). Не ставь пока вопрос "как красивее, как правильнее", эту красоту и правильность нужно научиться видеть.


ГА>з.ы. К слову, грамотное избавление от дублирования только повышает читаемость .


В яблочко! Сам придерживаюсь такой точки зрения.
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[2]: Указатели
От: korzhik Россия  
Дата: 22.11.05 13:51
Оценка: +1
Здравствуйте, Ovl, Вы писали:

Ovl>указатель — просто "ключ" для ящика с памятью.

Ovl>если ты сам себе этот ящик с помощью new не сделаешь, то будешь только взламывать чужие сундуки и портить жизнь себе и другим, потому что система по-разному может отреагировать на взломы. например уронить программу с access violation.

Ovl>сундук размером в 50 char-ов доступен тебе полностью — делай с ним что хочешь. если он тебе не нужен больше — удали с помощью


Классная аналогия с ключом и сундуком
Если сам придумал, то прирождённый учитель
Re[3]: Указатели
От: Ovl Россия  
Дата: 22.11.05 14:01
Оценка:
Здравствуйте, korzhik, Вы писали:

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


Ovl>>указатель — просто "ключ" для ящика с памятью.

Ovl>>если ты сам себе этот ящик с помощью new не сделаешь, то будешь только взламывать чужие сундуки и портить жизнь себе и другим, потому что система по-разному может отреагировать на взломы. например уронить программу с access violation.

Ovl>>сундук размером в 50 char-ов доступен тебе полностью — делай с ним что хочешь. если он тебе не нужен больше — удали с помощью


K>Классная аналогия с ключом и сундуком

K>Если сам придумал, то прирождённый учитель

учат. только учить не дают
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
Re: Указатели
От: Sitr Россия  
Дата: 22.11.05 15:01
Оценка:
Немного конкретизирую про дублирование и читабельность. Вот примеры( просьба не придераться к неточностям/возможным ошибкам/ненужности проверок этих функций — ваял это на ходу на коленке, чтоб хоть как то выразить свою мысль)

Пишу мотод connect к некоему классу ODBC:
// Вот пример вложенной друг в друга логики. Цель наворачивания-экономия написания нескольких retur(),
// SQLFreeEnv () и ErrorOut()
// Но читается сложнее чем следующая(будет после этой) функция — по крайней мере для меня, может не привык еще.
BOOL ODBC::sqlconn(char * chr_ds_name,
char * login,
char * password)
{
if (SQL_SUCCEEDED(SQLAllocEnv(&henv))
{
if (SQL_SUCCEEDED(SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*) SQL_OV_ODBC3, SQL_IS_INTEGER))
{
if (SQL_SUCCEEDED(SQLAllocConnect(henv,&hdbc))
{
if (SQL_SUCCEEDED(SQLConnect(hdbc,
(SQLTCHAR*)chr_ds_name, SQL_NTS,
(SQLTCHAR*)login, SQL_NTS,
(SQLTCHAR*)password, SQL_NTS))
{
return(TRUE);
}
else
{
ErrorOut(CONN);
SQLFreeEnv(henv);
SQLFreeConnect(hdbc);
return(FALSE);
}
}
}
ErrorOut(CONN);
SQLFreeEnv(henv);
}
else
{
MessageBox(NULL, "SQLAllocEnv() failed\0", "ODBC Error\0", MB_OK);
return(FALSE);
}
return(FALSE);
}


Вот другой вариант той же функции:

BOOL ODBC::sqlconn(char * chr_ds_name,
char * login,
char * password)
{
if (!SQL_SUCCEEDED(SQLAllocEnv(&henv))
{
MessageBox(NULL, "SQLAllocEnv() failed\0", "ODBC Error\0", MB_OK);
return(FALSE);
}
if (!SQL_SUCCEEDED(SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*) SQL_OV_ODBC3, SQL_IS_INTEGER))
{
ErrorOut(ENV);
SQLFreeEnv(henv);
return(FALSE);
}
if (!SQL_SUCCEEDED(SQLAllocConnect(henv,&hdbc))
{
ErrorOut(ENV);
SQLFreeEnv(henv);
return(FALSE);
}
if (!SQL_SUCCEEDED(SQLConnect(hdbc,
(SQLTCHAR*)chr_ds_name, SQL_NTS,
(SQLTCHAR*)login, SQL_NTS,
(SQLTCHAR*)password, SQL_NTS))
{
ErrorOut(CONN);
SQLFreeEnv(henv);
SQLFreeConnect(hdbc);
return(FALSE);
}
return(TRUE);
}
Читать второй вариант мне проще — все линейно без всяких уходящих друг в друга if'ов
Но больше return(), SQLFreeEnv() и ErrorOut(). Не придираться, что это фигня, и больше всего на один. Взял очень простой пример. Случались случаи гораздо больше, просто пока ничего более не пришло в голову.


По поводу указателей — тогда как устроенна функция char * strcpy(char *, const char *) ? Она возвращает указатель — значит либо она его завела просто как char * — тогда она получается претендент на ошибку acess vialation, либо с помошью new. Если с помошью new — кто же удаляет потом эту память? Я должен? Если да, то странно, не догадался бы так(и почему вообще возвращает указатель? Получается же дублирование — принимает указатель на входе, и потом еще и возвращает. Не проще было запросить у пользователя размер копируемой строки?). И вообще где можно найти более менее понятный хелп по указателям, а то столько сложностей с ними...
Re[2]: Указатели
От: VsevolodC Россия  
Дата: 22.11.05 15:21
Оценка:
Здравствуйте, Sitr, Вы писали:

S>По поводу указателей — тогда как устроенна функция char * strcpy(char *, const char *) ? Она возвращает указатель — значит либо она его завела просто как char * — тогда она получается претендент на ошибку acess vialation, либо с помошью new. Если с помошью new — кто же удаляет потом эту память? Я должен? Если да, то странно, не догадался бы так(и почему вообще возвращает указатель? Получается же дублирование — принимает указатель на входе, и потом еще и возвращает. Не проще было запросить у пользователя размер копируемой строки?). И вообще где можно найти более менее понятный хелп по указателям, а то столько сложностей с ними...


strcpy копирует строку в указанное тобой другое место, если ты там не выделил память для этого, то будет ошибка.
Размер ей не нужен, т.к. она копирует пока не встретит 0. Это удобно для строк.
Есть еще strncpy, memcpy и многое другое
Прочитать рекомендую K&amp;R (для начала).
Re[2]: Указатели
От: morphi  
Дата: 09.12.05 19:59
Оценка:
Здравствуйте, Глеб Алексеев, Вы писали:

ГА>Здравствуйте, Sitr, Вы писали:


S>> И еще один вопрос по стилю программирования. Как лучше делать — упрощать код, делая его без замудренных логических конструкций(но при этом у меня получается дублирование кода) или исбавиться от дублирования, но при этом читабельность кода страдает... Ранее избавлялся от дублирования(знал что мой код никому читать не придеться)


ГА>Забей на стиль программирования, на проектирование, на читабельность, на все. Научись писать программы, которые работают, ставь себе задачи и решай их. В какой-то момент ты сам почувствуешь, что дальше так жить нельзя, программы невозможно модифицировать и отлаживать, и только тогда можно начинать интересоваться ООП, рефакторингом, generic программированием и прочими высокими материями. Не написав n-го количества программ, не умея написать работающую хоть как-то программу, невозможно понять цели методологий анализа и проектирования, впасть навсегда в т.н. "паралич анализа" и превратиться в теоретика от программирования (вроде меня ). Не ставь пока вопрос "как красивее, как правильнее", эту красоту и правильность нужно научиться видеть.


ГА>з.ы. К слову, грамотное избавление от дублирования только повышает читаемость .


Срочно в ВУЗ. Лупить студентов!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.