Не надо такое писать, во первых вы новичков только ещё больше запутываете, а во вторых в С++ это совсем не так.
Второй шаг в программировании на С (недоумение прямо какое-то...)
Модератор: Модераторы разделов
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Второй шаг в программировании на С
-
promov
- Сообщения: 384
- Статус: Участник
- ОС: Debian GNU/Linux
Re: Второй шаг в программировании на С
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Мораль легко уразуметь: зачем на бал пришёл медведь?
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Второй шаг в программировании на С
ну в си так, конечно, только имхо сложнее: сначала разименовать, а потом получить доступ к полю. Проще как я писал -> доступ к полю, но не структуры, а указателя на структуру. ИМХО.
-
Debris
- Сообщения: 282
- ОС: Debian GNU/Linux Lenny
Re: Второй шаг в программировании на С
drBatty, elf74, вы ему лучше на морковках обьясняйте, и не лезьте пока в указатели это сложная тема для неподготовленного мозга, я сам ее долго вкуривал.
Указатель - переменная содержащая _адрес_ другой перменной, в частности нужны для динамического захвата памяти через malloc, указатели хороши тем что всегда занимают 4 байта вне зависимости от того на что они указывают. И вообще большое количество процессов в С и С++ реализовано через указатели, просто это все скрыто от нас.
Указатель - переменная содержащая _адрес_ другой перменной, в частности нужны для динамического захвата памяти через malloc, указатели хороши тем что всегда занимают 4 байта вне зависимости от того на что они указывают. И вообще большое количество процессов в С и С++ реализовано через указатели, просто это все скрыто от нас.
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Второй шаг в программировании на С
Открою вам страшную тайну:
-
Debris
- Сообщения: 282
- ОС: Debian GNU/Linux Lenny
-
promov
- Сообщения: 384
- Статус: Участник
- ОС: Debian GNU/Linux
Re: Второй шаг в программировании на С
Стоп, друзья. То, что меня заинтересовал в указателях, я обрисовал в другой теме. То, что указатель суть переменная, которая есть адрес другой переменной, я в книге прочёл. Да, чем указатели хороши против имён переменных, мне до сих пор непонятно. Понятно, что хорошо использовать указатели в связных списках, тогда эти списки легко изменять. Вроде все достоинства, пока я наблюдаю. Что касается того, что указатель занимает всего 4 байта, то навскидку если. он впридачу ко всему занимает 4 ьайта. А если бы его не было, эти 4 байта оказались бы свободными. ВЕдь указатель не заменяет собой переменную, мы как её объявили в начале программы, так и осталось за ней это место в пмяти. А тут ещё указатель добавился со своими четырьмя битами...
НО это всё лирика, я всего лишь хочу сказать, что не дошёл пока ещё до понимания преимуществ указателей. C НОВЫМ ГОДОМ!
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Мораль легко уразуметь: зачем на бал пришёл медведь?
-
Debris
- Сообщения: 282
- ОС: Debian GNU/Linux Lenny
Re: Второй шаг в программировании на С
promov, а если тебе надо из функции вернуть не 1 значение а несколько как ты сделаешь? А очень просто - передаешь указатель, по нему меняешь переменную и вуаля - на выходе из функции ты получил что хотел. Или например если тебе нужно передать в метод обьект класса... ну это уже немного другая опера 
Кстати да - *** ВСЕХ С НАСТУПАЮЩИМ!!! ***
Кстати да - *** ВСЕХ С НАСТУПАЮЩИМ!!! ***
-
promov
- Сообщения: 384
- Статус: Участник
- ОС: Debian GNU/Linux
Re: Второй шаг в программировании на С
Я бы создал тип структура. Потом создал бы функцию, которая возвращает переменную (одну) этого типа. А в переменную типа структура впихал бы несколько переменных. Вот и получилось бы, что функция, возвратив одну переменную типа структура, возвратила бы несколько переменных, которые входят в одну.Debris писал(а): ↑31.12.2007 17:51promov, а если тебе надо из функции вернуть не 1 значение а несколько как ты сделаешь? А очень просто - передаешь указатель, по нему меняешь переменную и вуаля - на выходе из функции ты получил что хотел. Или например если тебе нужно передать в метод обьект класса... ну это уже немного другая опера![]()
Кстати да - *** ВСЕХ С НАСТУПАЮЩИМ!!! ***
Ну, а вообще да, в книге тоже так написано- дескать, если вам надо поменять значения двух переменных в теле функции, а потом возвратить эти значения, то без указателей не обойтись, т. к. функция возвращает только одно значение. Этот момент мне понятен, непонятно другое- зачем менять значения переменных в какой то-там функции, если их можно поменять в функции main (), обойдясь безо всяких указателей?
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Мораль легко уразуметь: зачем на бал пришёл медведь?
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Второй шаг в программировании на С
Предположим у нас есть сложная и запутанная фигня в 10 мегабайт, нам надо обработать её в функции. можно так и написать:
Код: Выделить всё
xz_type xz;
func(xz);тогда создастся копия фигни(тоже в 10М), для обработки в функции.
1) это доооолго
2) отработается копия_фигни, а не сама фигня.
Выход, отдать функции указатель, это просто и быстро. Типа не
- вот фигня(берём фигню и отдаём функции) - работай!
А по иному:
- слышь, ты функция! вон тама(тычем пальцами) лежит фигня, чтоб к утру было готово!
Понятно?
С Новым Годом, ещё раз!
-
Debris
- Сообщения: 282
- ОС: Debian GNU/Linux Lenny
Re: Второй шаг в программировании на С
promov, я что то не понял, вы что собираетесь написать мало-мальски крупную программу без единой функции? А если вам например надо сделать что-то несколько раз в нескольких участках вашей программы слегка изменив начальные данные? А если вы скажем завели структуру и хотите передать ее в функцию, когда вы напишете int func ( Struct my_struc ) вся эта структура будет у вас копироваться в памяти и менять вы будете не оригинал а ее копию, а через указатель все это легко решается.
drBatty, мы с вами который пост уже одно и тоже пишем одновременно
drBatty, мы с вами который пост уже одно и тоже пишем одновременно
-
promov
- Сообщения: 384
- Статус: Участник
- ОС: Debian GNU/Linux
Re: Второй шаг в программировании на С
Понятно, насколько это может быть понятно человеку, впервые с этим встретившимся.
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Мораль легко уразуметь: зачем на бал пришёл медведь?
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Второй шаг в программировании на С
типичная ошибка:
Код: Выделить всё
my_type *stupid()
{
my_type x;
return &x;
}x живёт только внутри функции, а вне мы получим указатель на мёртвую х
Если возвращать не указатель а саму х - всё будет работать но жутко тормозить
-
Debris
- Сообщения: 282
- ОС: Debian GNU/Linux Lenny
Re: Второй шаг в программировании на С
promov, вы спрашивайте что непонятно, в спорах рождается истина
.
-
promov
- Сообщения: 384
- Статус: Участник
- ОС: Debian GNU/Linux
Re: Второй шаг в программировании на С
Спасибо. Будем последовательными. Сперва надо понять то, что я понять могу сам да вот хотя бы даже в теме "Указатели". Там есть ещё места, которые мне под силу. Ну и потом, информации много здесь новой, сперва переварить надо. А я спросить спрошу, и не раз ещё спрошу...
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Мораль легко уразуметь: зачем на бал пришёл медведь?
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Второй шаг в программировании на С
а вы спрашивайте, я тоже много нового узнал, пока вам отвечал
-
Folderx
- Сообщения: 296
- ОС: fedora, mandriva
Re: Второй шаг в программировании на С
promov
Какие авторы ? Кто ?
Ты даже не знаешь про что говоришь ты хочешь сказать ?
Щас все кинулись читать, откуда следует что буфер один, приведи конкретные цитаты.
То есть ты придумал буфер и говоришь про него, так ?
А какой авторы имеют в виду ? (ты конкретно отвечай)
Ничо не нужно добавлять, ты конкретно говори.
Не знаешь а чо тогда говоришь ?
Косишь под тупого тебя ещё поправлять кто-то должен.
Ты сказал что буфер один, оказалось ещё что ты не знаешь что это за буфер, потом ещё говоришь что авторы пишут про тот же буфер который ты придумал, и когда тебя спрашиваешь ты начинаешь ссылаться на какие-то цитаты туманные, на авторов неизвестных и прочую ерунду лишь бы не отвечать за базар за свой.
Я сам иногда юзаю мозговой штурм чтобы получить конкретную информацию на форуме, но не до такой же степени типа "ой а я чо-то там видел слышал вот щас нарассказываю а потом когда меня спросят скажу ищите цитаты где-то в интернете, все ответы на ваши вопросы уже написаны там", это говорит о конкретном отношении к участникам promov.
Я уже устал разговаривать по этому поводу. Авторы, из которых я почерпнул свои знания о буфере, не пишут, буфер чего они имеют ввиду.
Какие авторы ? Кто ?
Но сдаётся мне, он какой-то один.
Ты даже не знаешь про что говоришь ты хочешь сказать ?
В теме о буферизации Моя концепция буферизации есть сообщения номер 20, 26, и 30. Там цитаты из книг. Ну, вот собственно, говоря и всё.
Щас все кинулись читать, откуда следует что буфер один, приведи конкретные цитаты.
БОльше мне никто никакой информации о буфере не предоставил. Зато предоставили задачки типа "очисти буфер". Дабы просто не перепиывать листинги с учебников, а осмысленно решать эти задачки, пришлось самому представлять и моделировать буфер (там сообщение номер один)
То есть ты придумал буфер и говоришь про него, так ?
...Кстати, в той теме точно также меня спрашивали, какой буфер я имею ввиду и я отвечал точно также, что откуда мне знать, какой. Какой авторы имеют ввиду, такой и я
А какой авторы имеют в виду ? (ты конкретно отвечай)
Ничо не нужно добавлять, ты конкретно говори.
Кроме цитат, о которых я говорил выше, ещё и глава "представление данных в памяти компьютера" сыграла свою роль. Там написано, что все цифры в двоичной системе счисления представлены, а каждому символу своя цифра соответсвует.
А что такое нули и единицы я понятия не имею и псал уже об этом.
Не знаешь а чо тогда говоришь ?
Если не так что, то ппоправили бы лучше.
Косишь под тупого тебя ещё поправлять кто-то должен.
Ты сказал что буфер один, оказалось ещё что ты не знаешь что это за буфер, потом ещё говоришь что авторы пишут про тот же буфер который ты придумал, и когда тебя спрашиваешь ты начинаешь ссылаться на какие-то цитаты туманные, на авторов неизвестных и прочую ерунду лишь бы не отвечать за базар за свой.
Я сам иногда юзаю мозговой штурм чтобы получить конкретную информацию на форуме, но не до такой же степени типа "ой а я чо-то там видел слышал вот щас нарассказываю а потом когда меня спросят скажу ищите цитаты где-то в интернете, все ответы на ваши вопросы уже написаны там", это говорит о конкретном отношении к участникам promov.
-
promov
- Сообщения: 384
- Статус: Участник
- ОС: Debian GNU/Linux
Re: Второй шаг в программировании на С
Я назвал тему (в сообщении номер 56), где это всё обсуждалось, там номера сообщений, где цитаты, фамилии авторов и книги и всё это не туманно, а очень конкретно. Вам даже искать ничего не надо в том смысле, что вопрос "есть там это или нет?" не стоИт. Есть. Ну, давайте ещё раз:
Моя концепция буферизации Наведите мышкой стрелку надпись, нажмите на левую клавишу, а потом прокрутите колёсико вниз... Сообщения NN 20, 26 и 30. Всё. Зачем же дублировать то, что уже есть?
Хотите уличить меня в том, что я пренебрежительно отношусь к буферу? (звучит-то как...) Ну так идите в ту тему и прочтите- всё больше узнаете- не о буфере, успокойтесь, о моих познаниях о нём... И вот там и уличайте. Вам нужно, чтобы, чтобы я здесь писал ещё раз написанное? Это принципиально? Ну так вы cо своей принципиальностью были бы в другом месте хороши, уверяю Вас. Счёл бы нужным, конечно, и не раз и не два написал бы одну и ту же вещь, но... Одним словом: Вы, оставьте меня в покое.
Моя концепция буферизации Наведите мышкой стрелку надпись, нажмите на левую клавишу, а потом прокрутите колёсико вниз... Сообщения NN 20, 26 и 30. Всё. Зачем же дублировать то, что уже есть?
Хотите уличить меня в том, что я пренебрежительно отношусь к буферу? (звучит-то как...) Ну так идите в ту тему и прочтите- всё больше узнаете- не о буфере, успокойтесь, о моих познаниях о нём... И вот там и уличайте. Вам нужно, чтобы, чтобы я здесь писал ещё раз написанное? Это принципиально? Ну так вы cо своей принципиальностью были бы в другом месте хороши, уверяю Вас. Счёл бы нужным, конечно, и не раз и не два написал бы одну и ту же вещь, но... Одним словом: Вы, оставьте меня в покое.
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Мораль легко уразуметь: зачем на бал пришёл медведь?
-
promov
- Сообщения: 384
- Статус: Участник
- ОС: Debian GNU/Linux
Re: Второй шаг в программировании на С
А вот за это вот я тебе уши надеру.
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Мораль легко уразуметь: зачем на бал пришёл медведь?
-
promov
- Сообщения: 384
- Статус: Участник
- ОС: Debian GNU/Linux
Re: Второй шаг в программировании на С
И то сказать, показательная какая-то программа... Уж который раз к ней возвращаюсь...#include <stdio.h>
int main () {
int c;
while ((c=getchar ())!= EOF) {
putchar ©;
}
return 0;
}
Друзья! У меня эта программа работает, даже если дл переменной с выделить не 4 байта, а 1, объявить то есть её как сhar
#include <stdio.h>
int main () {
char c;
printf ("%d\n", sizeof (char));
printf ("%d\n", sizeof (int));
printf ("%d\n", sizeof (EOF));
printf ("%d\n", sizeof (-1));
while ((c=getchar ())!= EOF) {
putchar ©;
}
return 0;
}
Смотрите, никакой ошибки. Действительно, под тип сhar отведено 1 байт, под тип int 4, и под -1 тоже 4. И тем не менене, эта -1 спокойно влезает в тип сhar и программа ни накакой своей стадии не выдаёт никаких сообщений об ошибках. Хотя вот, смотрите: "Необходимо объявить переменную с принадлежащей к типу достаточного объёма, чтобы вместить любое значение, возвращаемое из getchar. Тип char для этих целей не годится, поскольку переменная с должна вмещать как любой возможный символ, так и EOF. Вот почему мы используем тип int" (K&R, Программа тоже отуда взята)
Наверное, это то, что Аристотель назвал бы "случайным образом". Да, так.
Код:
int main () {
int c;
while ((c=getchar ())!= EOF) {
putchar ©;
}
return 0;
}
Друзья! У меня эта программа работает, даже если дл переменной с выделить не 4 байта, а 1, объявить то есть её как сhar
Код:
#include <stdio.h>
int main () {
char c;
printf ("%d\n", sizeof (char));
printf ("%d\n", sizeof (int));
printf ("%d\n", sizeof (EOF));
printf ("%d\n", sizeof (-1));
while ((c=getchar ())!= EOF) {
putchar ©;
}
return 0;
}
Смотрите, никакой ошибки. Действительно, под тип сhar отведено 1 байт, под тип int 4, и под -1 тоже 4. И тем не менене, эта -1 спокойно влезает в тип сhar и программа ни накакой своей стадии не выдаёт никаких сообщений об ошибках. Хотя вот, смотрите: "Необходимо объявить переменную с принадлежащей к типу достаточного объёма, чтобы вместить любое значение, возвращаемое из getchar. Тип char для этих целей не годится, поскольку переменная с должна вмещать как любой возможный символ, так и EOF. Вот почему мы используем тип int" (K&R, Программа тоже отуда взята)
Наверное, это то, что Аристотель назвал бы "случайным образом". Да, так.
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Мораль легко уразуметь: зачем на бал пришёл медведь?
-
Folderx
- Сообщения: 296
- ОС: fedora, mandriva
Re: Второй шаг в программировании на С
promov писал(а): ↑07.01.2008 18:23Смотрите, никакой ошибки. Действительно, под тип сhar отведено 1 байт, под тип int 4, и под -1 тоже 4. И тем не менене, эта -1 спокойно влезает в тип сhar и программа ни накакой своей стадии не выдаёт никаких сообщений об ошибках. Хотя вот, смотрите: "Необходимо объявить переменную с принадлежащей к типу достаточного объёма, чтобы вместить любое значение, возвращаемое из getchar. Тип char для этих целей не годится, поскольку переменная с должна вмещать как любой возможный символ, так и EOF. Вот почему мы используем тип int" (K&R, Программа тоже отуда взята)
Наверное, это то, что Аристотель назвал бы "случайным образом". Да, так.
Код: Выделить всё
Определение языка "C" гарантирует, что любой символ из
стандартного набора символов машины никогда не даст отрица-
тельного числа, так что эти символы можно свободно использо-
вать в выражениях как положительные величины. Но произволь-
ные комбинации двоичных знаков, хранящиеся как символьные
переменные на некоторых машинах, могут дать отрицательные
значения, а на других положительные.
Наиболее типичным примером возникновения такой ситуации
является сучай, когда значение 1 используется в качестве
EOF. Рассмотрим программу
CHAR C;
C = GETCHAR();
IF ( C == EOF )
...
На машине, которая не осуществляет знакового расширения,
переменная 'с' всегда положительна, поскольку она описана
как CHAR, а так как EOF отрицательно, то условие никогда не
выполняется. Чтобы избежать такой ситуации, мы всегда пре-
дусмотрительно использовали INT вместо CHAR для любой пере-
менной, получающей значение от GETCHAR.Для некоторых случаев не годится потому что машины разные бывают.
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Второй шаг в программировании на С
работает, но это баг самого С
происходит потеря точности(компилятор предупреждения не выдал?) вот смотрите в морковкахбитах:
это EOF:
Код: Выделить всё
11111111 11111111 11111111 11111111а вот то, во что он превратится после преобразования в char:
Код: Выделить всё
11111111надеюсь разницу заметно?
перед сравнением он(преобразованый EOF) опять преобразуется в int и становится равным EOF
а преобразуйте в unsigned char, получится 255 != EOF
верно, бывают такие, они вообще знаков не понимают(ну нужны они им).
PS EOF там обычно определяют как (~0) что обычно тоже самое что и -1)
-
dogged
- Сообщения: 4
- ОС: Opensuse
Re: Второй шаг в программировании на С
А почему не работает программа, если немножко её видоизменить?
#include <stdio.h>
#define END 0
main(void) {
int c;
c=getchar();
while (c!=END) {
puchar©;
c=getchar();
}
}
То есть ввожу ноль, и она не завершает свою работу.
#include <stdio.h>
#define END 0
main(void) {
int c;
c=getchar();
while (c!=END) {
puchar©;
c=getchar();
}
}
То есть ввожу ноль, и она не завершает свою работу.
Intel E6400/2Gb/640gb WD/Ati Radeon x1950 512 Mb
-
Voice
- Сообщения: 1073
- Статус: столлманист
- ОС: Debian GNU/Linux
Re: Второй шаг в программировании на С
Замените
#define END 0
на
#define END 0x30 /* это и есть код символа '0' */
или
#define END '0'
"И может собственных Платонов и быстрых разумом Невтонов российская земля рождать."
М. В. Ломоносов
М. В. Ломоносов