Страница 175 из 386

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

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

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

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

Добавлено: Сб дек 21, 2013 13:59:00
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.

  */
}
Такие дела.

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

Добавлено: Сб дек 21, 2013 15:44:23
Мikа
Парни, ещё раз огромное спасибо! Свою задачу я на данный момент я поборол (делал что-то вроде часов шахматистов). Но код выглядит очень некрасиво, это понятно даже мне :) То, что вы написали, я конспектирую :) Но передачу в функцию адресов на переменные я вчера пробовал и работать не стало. Щас у меня нет возможности попрограммировать МК, который стоит на плате с LSD дисплеем, на который было бы удобно выводить результаты. А на след неделе напишу чистую программку, в которой будет только исследуемая (ну в плане моих экспериментов :D) функция и вывод полученных значений на дисплей. Надеюсь, что в следующем посте будут не вопросы, а ответы :)) Спасибо!

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

Добавлено: Сб дек 21, 2013 19:17:38
YS
попрограммировать МК, который стоит на плате с LSD дисплеем
Вы там c LSD аккуратнее, не увлекайтесь. :)))

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

Добавлено: Сб дек 21, 2013 22:55:42
Мikа
Твою мать, вот это надо было так опечататься на форуме технарей :facepalm:

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

Добавлено: Сб дек 21, 2013 23:06:34
unalex
частенько такие казусы вижу, аж бррр

думаю если знать как расшифровывается аббревиатура (Liquid Crystal Display), каких ошибок ну никак не получится сделать

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

Добавлено: Сб дек 21, 2013 23:08:01
Мikа
Да я знаю, в том-то и дело :D Просто тупанул :D Мне когда YS указал на это, я сначала не понял, в чём подвох, и начал проверять написанное на правильность :D

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

Добавлено: Сб дек 21, 2013 23:38:09
unalex
YS писал(а):0. Функция всегда возвращает только одно значение.
я бы так не говорил - структура, перечисление, массив...

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

Добавлено: Сб дек 21, 2013 23:45:19
unalex
YS писал(а):1. При простом вызове в функцию передаются копии аргументов, которые уничтожатся после вызова.
после вызова(во время выполнения функции) они вполне себе живы и существуют внутри этой функции
имелось ввиду после ВОЗВРАТА(выхода) из вызываемой функции

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

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

все зависит от конкретного случая и типа переменных

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

Добавлено: Вс дек 22, 2013 10:36:26
blackx
unalex, ну вы прямо по всем пунктам придрались. YS все правильно написал. Enum-ы для передачи данных группой не получится использовать. А массив для этого - какое-то извращение :)))

ЗЫ. Не создавайте несколько сообщений подряд. Используйте уникальную возможность отредактировать свое последнее сообщение для добавления контента.

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

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

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

Добавлено: Вс дек 22, 2013 16:21:58
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)
}
При такой структуре в проекте только текст_бокс.

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

Добавлено: Вс дек 22, 2013 16:56:21
unalex
blackx писал(а):А массив для этого - какое-то извращение
это почему же?
типичный случай - массив данных, требующий сортировки

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

Добавлено: Вс дек 22, 2013 17:03:00
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);
имхо в дизайнере форм все делать гораздо проще

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

Добавлено: Вс дек 22, 2013 17:15:27
Chip115
Все есть )) Просто тут код не стал приводить. Координаты и прочее, что касается кнопок формируются в методе CellButtons. По отдельности работают оба метода: текс_бокс и CellButtons. А вот запихнуть их в одно окно ума не хватает :(

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

Добавлено: Вс дек 22, 2013 19:33:20
menzoda
YS писал(а):Э-э-э, все это возвращается/изменяется по указателю.
Почему это по указателю? Можно спокойно вернуть ту же структуру по значению. Передана она в общем случае будет через стек. Поэтому, если под "одним" возвращаемым значением подразумевается одно машинное слово, то это не верно: можно вернуть данные любого размера. Если же под этим подразумевается одно "логическое значение" , то действительно, две отдельные структуры не возвратить, придется их объединять в одну.

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

Добавлено: Вс дек 22, 2013 19:41:31
menzoda
Chip115
Конечно, из твоего обрезка кода ничего непонятно, но у формы есть свойство Controls, которое представляет собой коллекцию дочерних объектов. Добавляешь туда свои элементы управления.

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

Добавлено: Пн дек 23, 2013 02:48:56
YS
Если же под этим подразумевается одно "логическое значение" , то действительно, две отдельные структуры не возвратить, придется их объединять в одну.
Именно, две структуры уже никак. Только передавать в функцию указатели на них. Через return - никак две не возвратить. Опять же, в C. В том же Lua - вполне можно. :)

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

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