Второй шаг в программировании на С (недоумение прямо какое-то...)

Модератор: Модераторы разделов

Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Второй шаг в программировании на С

Сообщение drBatty »

elf74 писал(а):
31.12.2007 15:07
заменяет собой запись (*f).buf_pos То есть представляет собой указатель на поле структуры.
Не надо такое писать, во первых вы новичков только ещё больше запутываете, а во вторых в С++ это совсем не так.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: Второй шаг в программировании на С

Сообщение promov »

drBatty писал(а):
31.12.2007 15:15
в С++ это совсем не так.
Я С изучаю...
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Второй шаг в программировании на С

Сообщение drBatty »

promov писал(а):
31.12.2007 15:26
drBatty писал(а):
31.12.2007 15:15
в С++ это совсем не так.
Я С изучаю...

ну в си так, конечно, только имхо сложнее: сначала разименовать, а потом получить доступ к полю. Проще как я писал -> доступ к полю, но не структуры, а указателя на структуру. ИМХО.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Debris
Сообщения: 282
ОС: Debian GNU/Linux Lenny

Re: Второй шаг в программировании на С

Сообщение Debris »

drBatty, elf74, вы ему лучше на морковках обьясняйте, и не лезьте пока в указатели это сложная тема для неподготовленного мозга, я сам ее долго вкуривал.

Указатель - переменная содержащая _адрес_ другой перменной, в частности нужны для динамического захвата памяти через malloc, указатели хороши тем что всегда занимают 4 байта вне зависимости от того на что они указывают. И вообще большое количество процессов в С и С++ реализовано через указатели, просто это все скрыто от нас.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Второй шаг в программировании на С

Сообщение drBatty »

Debris писал(а):
31.12.2007 17:15
drBatty, elf74, вы ему лучше на морковках обьясняйте,


:clap:
Debris писал(а):
31.12.2007 17:15
И вообще большое количество процессов в С и С++ реализовано через указатели,

Открою вам страшную тайну: :evil2: В Си всё реализовано через указатели ;) Даже имя функции - на самом деле указатель на точку входа... А return; это неявный указатель esp который указывает на точку выхода. А мозг ломается тогда, когда понимаешь, что переменная - указатель, указатель - указатель на указатель, а ссылка это тоже указатель но очень хитрый.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Debris
Сообщения: 282
ОС: Debian GNU/Linux Lenny

Re: Второй шаг в программировании на С

Сообщение Debris »

drBatty писал(а):
31.12.2007 17:42
а ссылка это тоже указатель но очень хитрый.

а ссылка - указатель разыменовывающий сам себя :-D
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: Второй шаг в программировании на С

Сообщение promov »

Debris писал(а):
31.12.2007 17:15
Стоп, друзья. То, что меня заинтересовал в указателях, я обрисовал в другой теме. То, что указатель суть переменная, которая есть адрес другой переменной, я в книге прочёл. Да, чем указатели хороши против имён переменных, мне до сих пор непонятно. Понятно, что хорошо использовать указатели в связных списках, тогда эти списки легко изменять. Вроде все достоинства, пока я наблюдаю. Что касается того, что указатель занимает всего 4 байта, то навскидку если. он впридачу ко всему занимает 4 ьайта. А если бы его не было, эти 4 байта оказались бы свободными. ВЕдь указатель не заменяет собой переменную, мы как её объявили в начале программы, так и осталось за ней это место в пмяти. А тут ещё указатель добавился со своими четырьмя битами...

НО это всё лирика, я всего лишь хочу сказать, что не дошёл пока ещё до понимания преимуществ указателей. C НОВЫМ ГОДОМ!
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
Аватара пользователя
Debris
Сообщения: 282
ОС: Debian GNU/Linux Lenny

Re: Второй шаг в программировании на С

Сообщение Debris »

promov, а если тебе надо из функции вернуть не 1 значение а несколько как ты сделаешь? А очень просто - передаешь указатель, по нему меняешь переменную и вуаля - на выходе из функции ты получил что хотел. Или например если тебе нужно передать в метод обьект класса... ну это уже немного другая опера :)

Кстати да - *** ВСЕХ С НАСТУПАЮЩИМ!!! *** :D
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: Второй шаг в программировании на С

Сообщение promov »

Debris писал(а):
31.12.2007 17:51
promov, а если тебе надо из функции вернуть не 1 значение а несколько как ты сделаешь? А очень просто - передаешь указатель, по нему меняешь переменную и вуаля - на выходе из функции ты получил что хотел. Или например если тебе нужно передать в метод обьект класса... ну это уже немного другая опера :)

Кстати да - *** ВСЕХ С НАСТУПАЮЩИМ!!! *** :D
Я бы создал тип структура. Потом создал бы функцию, которая возвращает переменную (одну) этого типа. А в переменную типа структура впихал бы несколько переменных. Вот и получилось бы, что функция, возвратив одну переменную типа структура, возвратила бы несколько переменных, которые входят в одну.

Ну, а вообще да, в книге тоже так написано- дескать, если вам надо поменять значения двух переменных в теле функции, а потом возвратить эти значения, то без указателей не обойтись, т. к. функция возвращает только одно значение. Этот момент мне понятен, непонятно другое- зачем менять значения переменных в какой то-там функции, если их можно поменять в функции main (), обойдясь безо всяких указателей?
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Второй шаг в программировании на С

Сообщение drBatty »

promov писал(а):
31.12.2007 17:47
эти 4 байта оказались бы свободными. ВЕдь указатель не заменяет собой переменную, мы как её объявили в начале программы, так и осталось за ней это место в пмяти. А тут ещё указатель добавился со своими четырьмя битами...

Предположим у нас есть сложная и запутанная фигня в 10 мегабайт, нам надо обработать её в функции. можно так и написать:

Код: Выделить всё

xz_type xz;
func(xz);

тогда создастся копия фигни(тоже в 10М), для обработки в функции.
1) это доооолго
2) отработается копия_фигни, а не сама фигня.
Выход, отдать функции указатель, это просто и быстро. Типа не
- вот фигня(берём фигню и отдаём функции) - работай!
А по иному:
- слышь, ты функция! вон тама(тычем пальцами) лежит фигня, чтоб к утру было готово!
Понятно?

С Новым Годом, ещё раз!
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Debris
Сообщения: 282
ОС: Debian GNU/Linux Lenny

Re: Второй шаг в программировании на С

Сообщение Debris »

promov, я что то не понял, вы что собираетесь написать мало-мальски крупную программу без единой функции? А если вам например надо сделать что-то несколько раз в нескольких участках вашей программы слегка изменив начальные данные? А если вы скажем завели структуру и хотите передать ее в функцию, когда вы напишете int func ( Struct my_struc ) вся эта структура будет у вас копироваться в памяти и менять вы будете не оригинал а ее копию, а через указатель все это легко решается.

drBatty, мы с вами который пост уже одно и тоже пишем одновременно :D
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: Второй шаг в программировании на С

Сообщение promov »

Понятно, насколько это может быть понятно человеку, впервые с этим встретившимся.
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Второй шаг в программировании на С

Сообщение drBatty »

promov писал(а):
31.12.2007 17:59
Я бы создал тип структура. Потом создал бы функцию, которая возвращает переменную (одну) этого типа. А в переменную типа структура впихал бы несколько переменных. Вот и получилось бы, что функция, возвратив одну переменную типа структура,
типичная ошибка:

Код: Выделить всё

my_type *stupid()
{
 my_type x;
 return &x;
}

x живёт только внутри функции, а вне мы получим указатель на мёртвую х
Если возвращать не указатель а саму х - всё будет работать но жутко тормозить :( Можно сделать х статической, но об этом надо всегда помнить, до тех пор, пока мы юзаем свю функцию, и не дай бох - забудем! Всё, бессонная ночь с дебагером обеспечена. :scare2:


Debris писал(а):
31.12.2007 18:04
drBatty, мы с вами который пост уже одно и тоже пишем одновременно :D


;) :type:
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Debris
Сообщения: 282
ОС: Debian GNU/Linux Lenny

Re: Второй шаг в программировании на С

Сообщение Debris »

promov, вы спрашивайте что непонятно, в спорах рождается истина :).
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: Второй шаг в программировании на С

Сообщение promov »

Debris писал(а):
31.12.2007 18:28
promov, вы спрашивайте что непонятно, в спорах рождается истина :) .
Спасибо. Будем последовательными. Сперва надо понять то, что я понять могу сам да вот хотя бы даже в теме "Указатели". Там есть ещё места, которые мне под силу. Ну и потом, информации много здесь новой, сперва переварить надо. А я спросить спрошу, и не раз ещё спрошу...
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Второй шаг в программировании на С

Сообщение drBatty »

promov писал(а):
31.12.2007 18:38
А я спросить спрошу, и не раз ещё спрошу...
а вы спрашивайте, я тоже много нового узнал, пока вам отвечал :g:
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Folderx
Сообщения: 296
ОС: fedora, mandriva

Re: Второй шаг в программировании на С

Сообщение Folderx »

promov
Я уже устал разговаривать по этому поводу. Авторы, из которых я почерпнул свои знания о буфере, не пишут, буфер чего они имеют ввиду.

Какие авторы ? Кто ?

Но сдаётся мне, он какой-то один.

Ты даже не знаешь про что говоришь ты хочешь сказать ?

В теме о буферизации Моя концепция буферизации есть сообщения номер 20, 26, и 30. Там цитаты из книг. Ну, вот собственно, говоря и всё.

Щас все кинулись читать, откуда следует что буфер один, приведи конкретные цитаты.

БОльше мне никто никакой информации о буфере не предоставил. Зато предоставили задачки типа "очисти буфер". Дабы просто не перепиывать листинги с учебников, а осмысленно решать эти задачки, пришлось самому представлять и моделировать буфер (там сообщение номер один)

То есть ты придумал буфер и говоришь про него, так ?

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

А какой авторы имеют в виду ? (ты конкретно отвечай)

Folderx писал(а):
31.12.2007 01:04
Вот это "что сейчас уместно назвать байтом, есть буфер" ты откуда узнал ?
На чём основывается твоё понимание ?
Перед этим всем нужно добавить "набор того".

Ничо не нужно добавлять, ты конкретно говори.

Кроме цитат, о которых я говорил выше, ещё и глава "представление данных в памяти компьютера" сыграла свою роль. Там написано, что все цифры в двоичной системе счисления представлены, а каждому символу своя цифра соответсвует.
А что такое нули и единицы я понятия не имею и псал уже об этом.

Не знаешь а чо тогда говоришь ?

Если не так что, то ппоправили бы лучше.

Косишь под тупого тебя ещё поправлять кто-то должен.

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

Я сам иногда юзаю мозговой штурм чтобы получить конкретную информацию на форуме, но не до такой же степени типа "ой а я чо-то там видел слышал вот щас нарассказываю а потом когда меня спросят скажу ищите цитаты где-то в интернете, все ответы на ваши вопросы уже написаны там", это говорит о конкретном отношении к участникам promov.
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: Второй шаг в программировании на С

Сообщение promov »

Я назвал тему (в сообщении номер 56), где это всё обсуждалось, там номера сообщений, где цитаты, фамилии авторов и книги и всё это не туманно, а очень конкретно. Вам даже искать ничего не надо в том смысле, что вопрос "есть там это или нет?" не стоИт. Есть. Ну, давайте ещё раз:
Моя концепция буферизации Наведите мышкой стрелку надпись, нажмите на левую клавишу, а потом прокрутите колёсико вниз... Сообщения NN 20, 26 и 30. Всё. Зачем же дублировать то, что уже есть?

Хотите уличить меня в том, что я пренебрежительно отношусь к буферу? (звучит-то как...) Ну так идите в ту тему и прочтите- всё больше узнаете- не о буфере, успокойтесь, о моих познаниях о нём... И вот там и уличайте. Вам нужно, чтобы, чтобы я здесь писал ещё раз написанное? Это принципиально? Ну так вы cо своей принципиальностью были бы в другом месте хороши, уверяю Вас. Счёл бы нужным, конечно, и не раз и не два написал бы одну и ту же вещь, но... Одним словом: Вы, оставьте меня в покое.
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: Второй шаг в программировании на С

Сообщение promov »

А вот за это вот я тебе уши надеру.
Folderx писал(а):
02.01.2008 00:52
Косишь под тупого тебя ещё поправлять кто-то должен.
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: Второй шаг в программировании на С

Сообщение promov »

И то сказать, показательная какая-то программа... Уж который раз к ней возвращаюсь...

Код:

#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, Программа тоже отуда взята)
Наверное, это то, что Аристотель назвал бы "случайным образом". Да, так.
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
Аватара пользователя
Folderx
Сообщения: 296
ОС: fedora, mandriva

Re: Второй шаг в программировании на С

Сообщение Folderx »

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: Второй шаг в программировании на С

Сообщение drBatty »

promov писал(а):
07.01.2008 18:23
Друзья! У меня эта программа работает, даже если дл переменной с выделить не 4 байта, а 1, объявить то есть её как сhar

работает, но это баг самого С :(
происходит потеря точности(компилятор предупреждения не выдал?) вот смотрите в морковкахбитах:

это EOF:

Код: Выделить всё

11111111 11111111 11111111 11111111

а вот то, во что он превратится после преобразования в char:

Код: Выделить всё

11111111

надеюсь разницу заметно?
перед сравнением он(преобразованый EOF) опять преобразуется в int и становится равным EOF
а преобразуйте в unsigned char, получится 255 != EOF

Folderx писал(а):
08.01.2008 09:22
Для некоторых случаев не годится потому что машины разные бывают.
верно, бывают такие, они вообще знаков не понимают(ну нужны они им).
PS EOF там обычно определяют как (~0) что обычно тоже самое что и -1)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
dogged
Сообщения: 4
ОС: Opensuse

Re: Второй шаг в программировании на С

Сообщение dogged »

А почему не работает программа, если немножко её видоизменить?
#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: Второй шаг в программировании на С

Сообщение Voice »

dogged писал(а):
11.08.2008 18:09
То есть ввожу ноль, и она не завершает свою работу.

Замените
#define END 0
на
#define END 0x30 /* это и есть код символа '0' */
или
#define END '0'
"И может собственных Платонов и быстрых разумом Невтонов российская земля рождать."
М. В. Ломоносов
Спасибо сказали: