Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Да, но результат такого рода будет только один и того типа, которым объявлена функция, и не затронет аргументы в скобках.

(строго говоря, возвращаемое функцией значение по сути тоже является её аргументом, просто записанным чуть иначе для удобного восприятия. Просто в математике под функцией понимается зависимость некоторой величины от одного-нескольких аргументов, вот и в C реализовали такую штуку как тип функции.)
Контактная информация:
Реклама
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение YS »

Язык С++, ATMEL Studio 6, ATmega32
Ох. Ну почему все хронически путают C и C++? :facepalm:

Mika, пока Вы пытаетесь писать на самом обычном ANSI C.

C++ - это, чтобы понятно, классы, шаблоны, наследование и еще куча умных слов. Вы же всего-то пытаетесь побороть передачу аргументов.

Так, до меня все уже написали, но я кратенько резюмирую. Без объяснений, ибо все уже было объяснено.

0. Функция всегда возвращает только одно значение.
1. При простом вызове в функцию передаются копии аргументов, которые уничтожатся после вызова.

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


int foo(int a, int b, int c)
{
  a++;
  b--;
  c+=2;

  return (a + b + c);
}


void main(void)
{
  int x,y,z,g;

  x=1;
  y=2;
  z=3;

  g=foo(x,y,z);

  /*

  Тут имеем:
  
  x==1, y==2, z==3

  g==8.

  */

}

2. Если передавать в функцию указатели на переменные, то действия будут производиться над самими переменными.

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


int bar(int *a, int *b, int *c)
{
  (*a)++;
  (*b)--;
  (*c)+=2;

  return ((*a) + (*b) + (*c)); //Операция разыменования имеет наивысший приоритет, но не стесняйтесь расставлять скобки. Хуже не будет.
}


void main(void)
{
  int x,y,z,g;

  x=1;
  y=2;
  z=3;

  g=bar(&x,&y,&z);

  /*

  Тут имеем:
  
  x==2, y==1, z==5

  g==8.

  */

}

3. Когда передается 100500 переменных, объединенных общей идеей, удобно пользоваться структурами.

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

typedef struct {

  int a;
  int b;
  int c;

} my_struct;

void foo2(my_struct *st)
{
  st->a++;
  st->b--;
  st->c+=2;
}

void main(void)
{
  my_struct stc;

  stc.a=1;
  stc.b=2;
  stc.c=3;

  foo2(&stc);

  /*

  Тут имеем

  stc.a==2, stc.b==1, stc.c==5

  */
}
4. Глобальные переменные - тоже вариант. Особенно в случае с прерываниями и переменными статуса. Но их надо использовать с умом. Куча глобальных переменных, заведенных без необходимости, усложняет жизнь.

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

int a,b,c;

int bar2(void)
{
  a++;
  b--;
  c+=2;

  return (a + b + c)
}

void main(void)
{
  int g;

  a=1;
  b=2;
  c=3;

  g=bar2();

  /*

  Тут имеем

  a==2, b==1, c==5

  g==8.

  */
}
Такие дела.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 343
Зарегистрирован: Пн апр 01, 2013 15:13:40
Откуда: Москва

Сообщение Мikа »

Парни, ещё раз огромное спасибо! Свою задачу я на данный момент я поборол (делал что-то вроде часов шахматистов). Но код выглядит очень некрасиво, это понятно даже мне :) То, что вы написали, я конспектирую :) Но передачу в функцию адресов на переменные я вчера пробовал и работать не стало. Щас у меня нет возможности попрограммировать МК, который стоит на плате с LSD дисплеем, на который было бы удобно выводить результаты. А на след неделе напишу чистую программку, в которой будет только исследуемая (ну в плане моих экспериментов :D) функция и вывод полученных значений на дисплей. Надеюсь, что в следующем посте будут не вопросы, а ответы :)) Спасибо!
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение YS »

попрограммировать МК, который стоит на плате с LSD дисплеем
Вы там c LSD аккуратнее, не увлекайтесь. :)))
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 343
Зарегистрирован: Пн апр 01, 2013 15:13:40
Откуда: Москва

Сообщение Мikа »

Твою мать, вот это надо было так опечататься на форуме технарей :facepalm:
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Сообщение unalex »

частенько такие казусы вижу, аж бррр

думаю если знать как расшифровывается аббревиатура (Liquid Crystal Display), каких ошибок ну никак не получится сделать
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 343
Зарегистрирован: Пн апр 01, 2013 15:13:40
Откуда: Москва

Сообщение Мikа »

Да я знаю, в том-то и дело :D Просто тупанул :D Мне когда YS указал на это, я сначала не понял, в чём подвох, и начал проверять написанное на правильность :D
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Мучитель микросхем
Аватара пользователя
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Сообщение unalex »

YS писал(а):0. Функция всегда возвращает только одно значение.
я бы так не говорил - структура, перечисление, массив...
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Мучитель микросхем
Аватара пользователя
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Сообщение unalex »

YS писал(а):1. При простом вызове в функцию передаются копии аргументов, которые уничтожатся после вызова.
после вызова(во время выполнения функции) они вполне себе живы и существуют внутри этой функции
имелось ввиду после ВОЗВРАТА(выхода) из вызываемой функции
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Мучитель микросхем
Аватара пользователя
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Сообщение unalex »

YS писал(а):3. Когда передается 100500 переменных, объединенных общей идеей, удобно пользоваться структурами.
еще есть массивы, перечисления...

все зависит от конкретного случая и типа переменных
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1518
Зарегистрирован: Пт дек 28, 2012 21:56:46
Откуда: St. Petersburg

Сообщение blackx »

unalex, ну вы прямо по всем пунктам придрались. YS все правильно написал. Enum-ы для передачи данных группой не получится использовать. А массив для этого - какое-то извращение :)))

ЗЫ. Не создавайте несколько сообщений подряд. Используйте уникальную возможность отредактировать свое последнее сообщение для добавления контента.
Изображение only pure true norwegian blackx Изображение
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение YS »

я бы так не говорил - структура, перечисление, массив...
Э-э-э, все это возвращается/изменяется по указателю. Так что, по факту, значение одно. Вернуть больше одного в конструкции return - технически невозможно (в Си, разумеется; в Lua, например, можно :) ).
они вполне себе живы и существуют внутри этой функции
имелось ввиду после ВОЗВРАТА
Это да, они существуют в стеке и пропадают после завершения вызова функции. Ну и, конечно, строго говоря они не уничтожаются немедленно и целенаправленно, просто стек затирается новыми данными по мере использования... :wink:
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск

Сообщение Chip115 »

Всем привет!
Надеюсь не за пинаете )) Тут пытаюсь учиться прогать на C# и столкнулся с проблемой. В общем создавать формы в дизайнере не для меня и потому пытаюсь научиться создавать форму " в ручную". Так вопрос в том, а как в одной форме разместить массив кнопок и текст_бокс? Класс матрицы кнопок CellButtons сделать наследником главной формы MyForm?
Вот такая у меня структура кода:

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

public static void Main()
{
MyForm Calc = new MyForm();
Application.Run(Calc);
}

class MyForm : Form
{
public MyForm()
{
TextBox txtBox = new TextBox();
txtBox.Parent = this; 
}
}

class CellButtons : MyForm
{
// куча быдлокодинга (размещаем кнопки матрицей 3*3)
}
При такой структуре в проекте только текст_бокс.
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Сообщение unalex »

blackx писал(а):А массив для этого - какое-то извращение
это почему же?
типичный случай - массив данных, требующий сортировки
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

Chip115 писал(а): Тут пытаюсь учиться прогать на C# и столкнулся с проблемой. В общем создавать формы в дизайнере не для меня и потому пытаюсь научиться создавать форму " в ручную"
наверное координаты и пр. для кнопки ввести надо, дизайнер так делает:

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

this.button1 = new System.Windows.Forms.Button();
..........
this.SuspendLayout();

// 
// button1
// 
this.button1.Location = new System.Drawing.Point(304, 191);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(75, 23);
this.button1.TabIndex = 0;
this.button1.Text = "Старт";
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += new System.EventHandler(this.button1_Click);
имхо в дизайнере форм все делать гораздо проще
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск

Сообщение Chip115 »

Все есть )) Просто тут код не стал приводить. Координаты и прочее, что касается кнопок формируются в методе CellButtons. По отдельности работают оба метода: текс_бокс и CellButtons. А вот запихнуть их в одно окно ума не хватает :(
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 535
Зарегистрирован: Вт авг 28, 2012 22:21:33

Сообщение menzoda »

YS писал(а):Э-э-э, все это возвращается/изменяется по указателю.
Почему это по указателю? Можно спокойно вернуть ту же структуру по значению. Передана она в общем случае будет через стек. Поэтому, если под "одним" возвращаемым значением подразумевается одно машинное слово, то это не верно: можно вернуть данные любого размера. Если же под этим подразумевается одно "логическое значение" , то действительно, две отдельные структуры не возвратить, придется их объединять в одну.
Вымогатель припоя
Аватара пользователя
Сообщения: 535
Зарегистрирован: Вт авг 28, 2012 22:21:33

Сообщение menzoda »

Chip115
Конечно, из твоего обрезка кода ничего непонятно, но у формы есть свойство Controls, которое представляет собой коллекцию дочерних объектов. Добавляешь туда свои элементы управления.
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение YS »

Если же под этим подразумевается одно "логическое значение" , то действительно, две отдельные структуры не возвратить, придется их объединять в одну.
Именно, две структуры уже никак. Только передавать в функцию указатели на них. Через return - никак две не возвратить. Опять же, в C. В том же Lua - вполне можно. :)
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Открыл глаза
Сообщения: 75
Зарегистрирован: Чт авг 29, 2013 08:02:24

Сообщение dzrkot »

у меня тупой вопрос =|
скоро истечёт 30 дневная ознакомительная версия IAR (2дня), сегодня её удалил, скачал софф сайта, почистил реестр claenerom(думал спасёт) поставил обратно, видит старую лицензию, новую 30дневную соответветственно незарегистрировать и не поставить...как быть?
Пиратки нельзя, ибо убьют при проверке..
Ответить

Вернуться в «Разные вопросы по МК»