|
|
  |
Си |
|
|
|
Mar 16 2013, 08:03
|
Местный
  
Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753

|
Цитата(Буратино @ Mar 15 2013, 10:52)  ну хорошо, а как правильно обращаться к указателю на который указывает указатель?... У Вас все правильно. С остальными ораторами я не согласен. realloc - не нужен, так как Вам не нужны старые данные, и поведение реаллока отличается при недостатке памяти. А передача параметров по ссылке к Си отношения не имеет.
|
|
|
|
|
Mar 18 2013, 13:21
|

Профессионал
    
Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215

|
Спасибо! Есть вот такой код: Код int j; int j = 400; Первая строка это так называемое предварительное объявление (tentative definition). Зачам так делают? Для чего это нужно?
--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
|
|
|
|
|
Mar 19 2013, 14:24
|
Местный
  
Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753

|
Цитата(Буратино @ Mar 18 2013, 17:21)  Спасибо! Есть вот такой код: Код int j; int j = 400; Это очень странный, и в моем понимании - неправильный код. На всякий случай проверил - как и ожидалось, компилятор обругал меня за повторную декларацию. В классическом Си все автоматические переменные должны декларироваться в начале блока. Некоторые диалекты Си и классический С++ позволяют объявлять переменные в любом месте. Но я считаю, что это плохая привычка.
|
|
|
|
|
Mar 19 2013, 18:09
|
Местный
  
Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753

|
Чтобы пример стал более наглядным, я предлагаю переписать его так: Код #include <stdio.h>
int main(void) { int i=1; { int i=2; { int i=3; printf("%d\n", i); } printf("%d\n", i); } printf("%d\n", i); return 0; } 2 ARV - ну это же дается не как рабочий код, а как демонстрация того, как работает язык Си.
|
|
|
|
|
Mar 20 2013, 05:28
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(ARV @ Mar 19 2013, 22:02)  за наличие в пределах одной функции трех определений одинаковой переменной (типа вашего int i) убивать надо Это три разные переменные. Цитата(igorle @ Mar 19 2013, 22:09)  Чтобы пример стал более наглядным, я предлагаю переписать его так: А я предлагаю такой вариант. Код int main(void) { for (int i=0; i<3; i++) { for (int i=0; i<3; i++) { printf("%d\t", i); } puts(""); }
return 0; } И это 100% рабочий код, выводящий в консоль: Код 0 1 2 0 1 2 0 1 2 Я не агитирую никого так писать. Но понимать надо, что так тоже можно и это не криминал. Просто у переменных разная область видимости и переменные вложенного блока имеют приоритет видимости над внешними. А вот с глобальными не статическим переменными-тёзками другая песня и они сливаются воедино... Цитата(andrew_b @ Mar 20 2013, 08:52)  Это позволяет уже С99. Самый что ни на есть классический диалект. +1 за максимально отложенное объявление переменных максимально близко к месту их использования. Где родился - там и пригодился:-)
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Mar 20 2013, 07:30
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(Буратино @ Mar 18 2013, 17:21)  Спасибо! Есть вот такой код: Код int j; int j = 400; Первая строка это так называемое предварительное объявление (tentative definition). В C++ это ошибка. С это позволит, но делать так не надо! Цитата Зачам так делают? Делают не так, а так: Код extern int j; int j = 400; Цитата Для чего это нужно? Строку с extern помещают в header, что бы не только ваш С файл знал о существовании этой переменной, но и другие модули (читай - С файлы) знали, и могли ею воспользоваться. NB. Но называться она должна не 'j', а как то более осмысленно
|
|
|
|
|
Mar 20 2013, 08:13
|
Местный
  
Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753

|
Цитата(toweroff @ Mar 19 2013, 22:40)  Согласен с ARV. Отшибить руки за такое, пусть даже и стандартами оно и дозволено  Господа toweroff и ARVВы путаете понимание языка и применение. Например, вы должны понимать как работает arr[5] должны так писать Вы должны понимать, как работает *(arr +5), но писать так должны только в некоторых, специальных случаях Вы никогда не должны писать такой код: Код int main(void) { int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int i;
for (i = 0; i <10; i++) printf("%d ", i[arr]); printf("\n%d\n", 5[arr]); return 0; } Но неплохо бы понимать, как и почему это работает. Ну а если вы не поволяете людям объяснять как и почему работает 5[arr], мотивируя тем, что так писать нельзя, то я с вами не согласен.
|
|
|
|
|
Mar 20 2013, 08:45
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(igorle @ Mar 20 2013, 12:13)  +100500Из той-же оперы, но вполне юзабельное: Код for (int i=0; i<10; i++) { printf("%c\t", "abcdefghig"[i]); }
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Mar 20 2013, 09:17
|
Местный
  
Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753

|
Цитата(demiurg_spb @ Mar 20 2013, 11:45)  Из той-же оперы, но вполне юзабельное: Да, например, можно вызывать эту функцию внутри медленного цикла. Пользователь будет видеть, что процесс идет: Код static void fan(void) { static char idx; printf("\x1b[1D%c", "|/-\\|/-\\"[++idx & 0x3]); } Должно работать на стандартной консоли (не проверял, может быть ошибка в коде сдвига курсора на одну позицю влево) И это уже не демо, а реальный код.
Сообщение отредактировал igorle - Mar 20 2013, 10:06
|
|
|
|
|
Mar 20 2013, 09:38
|

Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581

|
Цитата(demiurg_spb @ Mar 20 2013, 09:28)  Это три разные переменные. Я не агитирую никого так писать. Но понимать надо, что так тоже можно и это не криминал. разные по сути, но одинаковые внешне. скажите, вам больше делать нечего, кроме как напрягать мозг для разбирательства, кто есть ху в этой программе? лично мне это не нужно, и, уважая читателей моего кода (если таковые найдутся), я никогда не напишу так, чтобы они лишний раз напрягались. для напряжения туалет есть, и там это вполне уместно, но не в остальном. Цитата(igorle @ Mar 20 2013, 12:13)  Господа toweroff и ARV Вы путаете понимание языка и применение. лчно я не путаю. МОЖНО испражняться, не снимая штанов, но НУЖНО ли?! даже не хочется думать о том, чем может быть мотивировано такое поведение, хотя наверняка бывают случаи, когда это неизбежно. но рассказывать об этом под лозунгом "это МОЖНО", тем более в теме для начинающих (т.е. как бы обучая) я бы никогда не стал. это попросту лишнее. Си содержит массу вариантов того, что позволяет сделать код нечитаемым. Мне неизвестны мотивы изобретателей этого языка, которые разрешили запись a[5] и 5[a] как эквиваленты, и признаюсь честно - я не в восторге от такого изобилия возможностей. если найдется здесь человек, который неопровержимо докажет исключительную НЕОБХОДИМОСТЬ наличия такой возможности (за исходный вариант примем классику a[5]) - я сожру последние 10 страниц написанных мной исходников  Си не станет хуже, если вся эта экзотика останется невостребованной, и о ней будет знать крайне узкий круг гуру. Более того, все остальные не-гуру не пострадают от этого абсолютно! P.S. как-то вышло так, что в моем посте примеры и аналогии какие-то "неприличные" - извините, но сделал это умышленно, стараясь увязать код на основе "допустимых вариантов записей" с тем, что такой код напоминает. Цитата(igorle @ Mar 20 2013, 13:17)  Да, например, можно вызывать эту функцию внутри медленного цикла. Пользователь будет видеть, что процесс идет: Код static void fan(void) { static char idx; printf("\x1b[1D%c", "|/-\\|/-\\"[++idx&0x3]); } Должно работать на стандартной консоли (не проверял, может быть ошибка в коде сдвига курсора на одну позицю влево) И это уже не демо, а реальный код. скажите, а пробелы между операторами и операндами вы не ставите умышленно, с целью продемонстрировать, как белиберда внешне может оказаться "реально работающим кодом"? см. выше - попытка возвыситься над толпой за счет использования законно разрешенных "сверх"возможностей Си показывает наличие каких-то комплексов...
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|