Перейти к содержимому

Фотография

Основы ПрограмированияПотренируемся на ночь?


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 171

#161
dzid

dzid
  • Свой человек
  • 939 сообщений
Отдисциллированный пример с VERTEX_ENTITY:
#include <stdio.h>

typedef struct
{
 int a;
 int b;
 int c;
} P;

int f1 (int idx)
{
 int v;
 int ai [10] = { -10, -9, -8, -7, -6, -5, -4, -3, -2, -1 };
 return ai [idx];
}

int f2 (int idx)
{
 P p;
 p.a = 0;
 if (idx & 2)
  {
   p.b = 0;
   p.c = 0;
  }
 return p.c;
}

void main()
{
 int i1, i2;
 i1 = f1 (9);
 i2 = f2 (9);
 printf ("%d %d", i1, i2);
}

запускаем так: cl test.cpp

Варнингов нет. Хотя гцц тут должен дать варнинг.
Уважаемый Visual, с нетерпением жду ваши комментарии по этому поводу.

С массивами признаю - был неправ :rolleyes: Оно их таки инициализирует...
  • 0

#162
Visual1

Visual1
  • В доску свой
  • 1 198 сообщений

Отдисциллированный пример с VERTEX_ENTITY:
//... (код см. выше) ...

запускаем так: cl test.cpp

Варнингов нет. Хотя гцц тут должен дать варнинг.
Уважаемый Visual, с нетерпением жду ваши комментарии по этому поводу.

ОК, давайте на этот раз сосредоточим внимание на компиляторе Microsoft, поскольку у вас, как я понял, есть недоверие к нему. Запускаем ваш пример так, как вы указали. У меня получилось на выходе:
-1 -1
С первой отрицательной единицей нет проблем: в вашем примере локальный список из 10 значений инициализирован полностью (ai[9]= -1), так что все законно.

А вот откуда берется вторая отрицательная единица, когда вроде бы должен быть 0, вопрос интересный. Здесь так и получается, как сказано в заповеди: не оставляйте неинициализированных элементов в структуре, тем паче в локально объявленной, "ибо воздастся вам полной мерой за грехи ваши" :p Там будет все, что угодно (но см. ниже!)

С массивами признаю - был неправ  :-) Оно их таки инициализирует...

Гм... М-да. Повинную голову и меч не сечет... ;) Но это еще не все! Заявляю, что структуры тоже можно инициализировать неполным списком инициализации! Точно так же, как был инициализирован массив в вашем предыдущем примере (допустимый, хоть и плохой стиль). И так же, как и для массива, если инициализаторов в списке меньше, чем элементов в структуре, остальным элементам автоматически присваивается 0 (или NULL, если элемент - указатель). Но ведь в вашем примере первый элемент структуры p.a уже был явно и безусловно инициализирован, не так ли? Тогда почему же в остальных элементах, в том числе и в последнем элементе p.с все-таки не нули?

Надо ли мне отвечать на этот вопрос или вы легко ответите сами?

Сообщение отредактировал Visual1: 22.10.2005, 00:49:55

  • 0

#163
dzid

dzid
  • Свой человек
  • 939 сообщений
Это у вас взялась единица. У меня получилось какое-то большое положительное число. Ответ прост - под структуру выделяется память в стеке, но она не инициализируется никак. Стало быть, там мусор. В реальной программе в ve.z тоже оказывался часто 0, и все было нормально. Вот только он там оказывался не всегда :p

Касательно инициализации структур - и тут вы правы. Замечу однако же, что это правда только в том случае, если структура инициализируется списком инициализации. Если мы ее начинаем инициализировать поэлементно - значение получат только те элементы, которым были присвоены значения. Более того, для инициализации всего массива структур нулями достаточно проинициализировать первый член первого элемента массива, вот так: {{0}}. Что, если честно, не может не удивлять.

Тут прекрасно подходит слово "неочевидность" ;)

PS: На максимальном уровне предупреждений вышеприведенный код дает варнинг. Но мы при сборке проекта пользуемся от максимального -1 (3-й уровень). Вариант с -Wall рассматривался, но не нашел поддержки в массах :-)

PPS: Просим птичку (Symbian) не обижать :) Она у меня в телефоне трудится.
  • 0

#164
Visual1

Visual1
  • В доску свой
  • 1 198 сообщений

Это у вас взялась единица. У меня получилось какое-то большое положительное число. Стало быть, там мусор. В реальной программе в ve.z тоже оказывался часто 0, и все было нормально. Вот только он там оказывался не всегда

Да я и не утверждал, что там обязательно будет единица. Я сказал, что у меня получилась минус единица, и также сказал, что там может быть все, что угодно. Таки да, там мусор. :) Но достаточно проинициализировать первый элемент, или несколько первых элементов, и причем обязательно списком... "Достаточно одной таблэтки" ©... В общем, у нас тут нет разногласий.

Касательно инициализации структур - и тут вы правы. Замечу однако же, что это правда только в том случае, если структура инициализируется списком инициализации. Если мы ее начинаем инициализировать поэлементно - значение получат только те элементы, которым были присвоены значения. Более того, для инициализации всего массива структур нулями достаточно проинициализировать первый член первого элемента массива, вот так: {{0}}. Что, если честно, не может не удивлять.

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

Просим птичку (Symbian) не обижать ;) Она у меня в телефоне трудится.

Да ради бога! Как говорил Мао Цзе-дун: "Пусть расцветают сто цветов, пусть расцветают сто искусств!" © (он, однако, еще добавлял вполголоса: "А те из них, которые сорняки, мы потом с корнем вырвем.") :-)

Сообщение отредактировал Visual1: 22.10.2005, 21:00:47

  • 0

#165
Visual1

Visual1
  • В доску свой
  • 1 198 сообщений
Думается мне, что списки и структуры уже довольно поднадоели уважаемой публике. Ведь есть еще много других интересных вопросов. Например:

Может ли конструктор класса быть виртуальным? А деструктор? Почему? Где это может понадобиться?
  • 0

#166
ayya

ayya
  • Гость
  • 6 сообщений

Может ли конструктор класса быть виртуальным? А деструктор? Почему? Где это может понадобиться?


Конструктор не может быть виртуальным.
Деструктор может. Довольно часто лучше её делать виртуальным. Например:

class A
{
public:
virtual ~A() {};

};

class B : public A
{
~B() { delete foo; };

private:
void* foo;
};

A* a = new B();
delete a; // Если деструктор А виртуальный, то будет вызван ~B()
// Если деструктор А не виртуальный, то будет вызван ~A() что приведет у утечке памяти
  • 0

#167
Visual1

Visual1
  • В доску свой
  • 1 198 сообщений
2 ayya:

Все правильно. (После выделения памяти и присваивания a указывает на объект производного класса B, и удалять этот объект необходимо его собственным деструктором). :-)

Приятно видеть ваш быстрый, краткий и точный ответ. Респект!

Сообщение отредактировал Visual1: 24.10.2005, 20:17:32

  • 0

#168
ZMan

ZMan
  • Гость
  • 12 сообщений

sum=0
i=5

sum=sum+i
i=i+1

вот начало!!!


Сам же и написал всю суть.

program Summa;

var
  i: integer;
  sum: integer;

begin
  sum := 0;

  for i := 5 to 20 do
   sum := sum + i;

  if sum < 100 then writeln('sum < 100')
  else writeln('sum > 100');

  readln;
end.

  • 0

#169
T-300

T-300
  • Гость
  • 5 сообщений
люди, подскажите как быстро возводить числа в большие степени по модулю.... нужно для реализации RSA ...

ну скажем вычислить 175^317 mod 437
  • 0

#170
Nicolson

Nicolson
  • Свой человек
  • 504 сообщений
Хочу научиться программить!
В чем лучше начать, мож литературу посоветуете. Ведь выбор щас аж глаза разбигаются, да и польза чтоб была от учения.
По старой памяти опираясь на древний бэйсик, пробовал побаловаться в Visual Basic, так ничего серьёзного. А хотелось бы чегонить освоить.....

Заранее благодарен!
  • 0

#171
v04bvs

v04bvs
  • В доску свой
  • 2 062 сообщений

Хочу научиться программить!
В чем лучше начать, мож литературу посоветуете. Ведь выбор щас аж глаза разбигаются, да и польза чтоб была от учения.
По старой памяти опираясь на древний бэйсик, пробовал побаловаться в Visual Basic, так ничего серьёзного. А хотелось бы чегонить освоить.....

Заранее благодарен!

http://www.google.ru...ogle&lr=lang_ru
  • 0

#172
Vilgelm

Vilgelm
  • Случайный прохожий
  • 3 сообщений
забыли самое главное:

Изображение
  • 0


Количество пользователей, читающих эту тему: 2

пользователей: 0, неизвестных прохожих: 2, скрытых пользователей: 0

Размещение рекламы на сайте     Предложения о сотрудничестве     Служба поддержки пользователей

© 2011-2022 vse.kz. При любом использовании материалов Форума ссылка на vse.kz обязательна.