реклама на сайте
подробности

 
 
19 страниц V  « < 7 8 9 10 11 > »   
Reply to this topicStart new topic
> Си
igorle
сообщение Mar 16 2013, 08:03
Сообщение #121


Местный
***

Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753



Цитата(Буратино @ Mar 15 2013, 10:52) *
ну хорошо, а как правильно обращаться к указателю на который указывает указатель?...

У Вас все правильно.
С остальными ораторами я не согласен.
realloc - не нужен, так как Вам не нужны старые данные, и поведение реаллока отличается при недостатке памяти.
А передача параметров по ссылке к Си отношения не имеет.
Go to the top of the page
 
+Quote Post
Буратино
сообщение Mar 18 2013, 13:21
Сообщение #122


Профессионал
*****

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



Спасибо!

Есть вот такой код:
Код
int j;
int j = 400;


Первая строка это так называемое предварительное объявление (tentative definition). Зачам так делают? Для чего это нужно?


--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
Go to the top of the page
 
+Quote Post
igorle
сообщение Mar 19 2013, 14:24
Сообщение #123


Местный
***

Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753



Цитата(Буратино @ Mar 18 2013, 17:21) *
Спасибо!
Есть вот такой код:
Код
int j;
int j = 400;

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

В классическом Си все автоматические переменные должны декларироваться в начале блока. Некоторые диалекты Си и классический С++ позволяют объявлять переменные в любом месте. Но я считаю, что это плохая привычка.
Go to the top of the page
 
+Quote Post
Буратино
сообщение Mar 19 2013, 17:43
Сообщение #124


Профессионал
*****

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



На сколько мне известно в Си существует объявление и определение переменной. Инициализирована переменная может быть только в определении. Автоматические переменные это один из классов переменной и я так понимаю определяться и инициализироваться они могут в любой части функции, а существуют они и правда внутри конкретного операторного блока. Так, переменных "i" в одной функции может целая куча..
Код
#include <stdio.h>
#include <stdlib.h>


int main() {
   int i=1;
  
   printf ("%d\n", i);
   if (1) {
      int i=2;
      printf ("%d\n", i);
      if (1) {
         int i=3;
         printf ("%d\n", i);
      }
   }
}


--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
Go to the top of the page
 
+Quote Post
ARV
сообщение Mar 19 2013, 18:02
Сообщение #125


Профессионал
*****

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



за наличие в пределах одной функции трех определений одинаковой переменной (типа вашего int i) убивать надо


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
igorle
сообщение Mar 19 2013, 18:09
Сообщение #126


Местный
***

Группа: Свой
Сообщений: 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 - ну это же дается не как рабочий код, а как демонстрация того, как работает язык Си.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Mar 19 2013, 19:40
Сообщение #127


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Согласен с ARV. Отшибить руки за такое, пусть даже и стандартами оно и дозволено help.gif
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Mar 20 2013, 04:52
Сообщение #128


Профессионал
*****

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(igorle @ Mar 19 2013, 18:24) *
В классическом Си все автоматические переменные должны декларироваться в начале блока. Некоторые диалекты Си и классический С++ позволяют объявлять переменные в любом месте.
Это позволяет уже С99. Самый что ни на есть классический диалект.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Mar 20 2013, 05:28
Сообщение #129


неотягощённый злом
******

Группа: Свой
Сообщений: 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 за максимально отложенное объявление переменных максимально близко к месту их использования. Где родился - там и пригодился:-)


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
XVR
сообщение Mar 20 2013, 07:30
Сообщение #130


Гуру
******

Группа: Свой
Сообщений: 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', а как то более осмысленно
Go to the top of the page
 
+Quote Post
igorle
сообщение Mar 20 2013, 08:13
Сообщение #131


Местный
***

Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753



Цитата(toweroff @ Mar 19 2013, 22:40) *
Согласен с ARV. Отшибить руки за такое, пусть даже и стандартами оно и дозволено help.gif

Господа 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], мотивируя тем, что так писать нельзя, то я с вами не согласен.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Mar 20 2013, 08:45
Сообщение #132


неотягощённый злом
******

Группа: Свой
Сообщений: 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]);
}


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
igorle
сообщение Mar 20 2013, 09:17
Сообщение #133


Местный
***

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
ARV
сообщение Mar 20 2013, 09:38
Сообщение #134


Профессионал
*****

Группа: Свой
Сообщений: 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 страниц написанных мной исходников sm.gif


Си не станет хуже, если вся эта экзотика останется невостребованной, и о ней будет знать крайне узкий круг гуру. Более того, все остальные не-гуру не пострадают от этого абсолютно!

P.S. как-то вышло так, что в моем посте примеры и аналогии какие-то "неприличные" - извините, но сделал это умышленно, стараясь увязать код на основе "допустимых вариантов записей" с тем, что такой код напоминает.



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

Должно работать на стандартной консоли (не проверял, может быть ошибка в коде сдвига курсора на одну позицю влево)
И это уже не демо, а реальный код.
скажите, а пробелы между операторами и операндами вы не ставите умышленно, с целью продемонстрировать, как белиберда внешне может оказаться "реально работающим кодом"? см. выше - попытка возвыситься над толпой за счет использования законно разрешенных "сверх"возможностей Си показывает наличие каких-то комплексов...


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
igorle
сообщение Mar 20 2013, 10:04
Сообщение #135


Местный
***

Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753



2 ARV
- Пробелы можно добавить вокруг & - [++idx & 0x3] Обычно взгляд автоматически парсит такие строки, но в общем - принимаю. Здесь пробелы не повредят. Сейчас поправлю.
- Не надо жрать исходники. a[5] и 5[a] - не самоцель. Это демонстрация того как работает оператор [ ]. Если Вам это не интересно - то это нормальная позиция для ремесленника, но странная для творческого человека. Хотя знаете, мне сын доказывал, что привычка понимать суть - вредная привычка, так как мешает двигаться вперед быстро. Может быть Вы и правы. Работает - ну и хрен с ним.
- Эта ветка не про то, как решить конкретную проблему, а про то, как работает Си. Поэтому демострации могут и должны быть утрированы. Типа - вложенных блоков с автоматической переменной с тем же именем. Так как наглядно демонстрирует область определения переменной.
- Насчет "попытки возвыситься" - извините что доставил Вам неудобство.
Go to the top of the page
 
+Quote Post

19 страниц V  « < 7 8 9 10 11 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 12:38
Рейтинг@Mail.ru


Страница сгенерированна за 0.01502 секунд с 7
ELECTRONIX ©2004-2016