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

Фотография

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


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

#121
yedyge

yedyge
  • Свой человек
  • 879 сообщений
CMyclass(int ID, char* Name){MyclassID = ID; MyclassName = Name};

1.синтаксис: неопределённый ид MyclassID или не поле класса
2.синтаксис: неопределённый ид MyclassName или не поле класса
3.синтаксис: ~Myclass() не может быть деструктором при несовпадении имени
4.(может быть?)рантайм: если компиллятор для char* вдруг решит за присвоение взять копирование содержимого строки (мало ли, хотя по дефолту битовое копирование), то вылетит память.

в других строках багов не заметил.
  • 0

#122
civil_nomad

civil_nomad
  • Завсегдатай
  • 285 сообщений

А, так вы еще и в С++ разбираетесь?  :D  Замечательно! Тогда ответьте на такой простой вопрос:

class CMyclass
{
   int MyClassID;
   char* MyClassName;
   CMyclass();
   CMyclass(int ID, char* Name){MyclassID = ID; MyclassName = Name};
   ~Myclass();
}
Есть ли здесь ошибки? Какие?


давно C++ не использовал, избаловали уже Javы и C#ы :D

копирование адреса строки -> непредсказуемость поведения...

не помню точно, но вроде выделить память для строки тоже бы не помешало...
  • 0

#123
yedyge

yedyge
  • Свой человек
  • 879 сообщений
я тож думал про неинициализированную память. но имхо это намерение кодера - передавать в конструктор адрес существующей строковой костанты.
  • 0

#124
v04bvs

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

class CMyclass
{
   int MyClassID;
   char* MyClassName;
   CMyclass();
   CMyclass(int ID, char* Name){MyclassID = ID; MyclassName = Name};
   ~Myclass();
}
Есть ли здесь ошибки? Какие?


g++ этот код не одобряет.

main.cc:7: destructor `Myclass' must match class name `CMyclass'
main.cc:10: warning: `class CMyclass' only defines a private destructor and has no friends
main.cc:10: semicolon missing after declaration of `CMyclass'
main.cc: In method `CMyclass::CMyclass(int, char *)':
main.cc:6: `MyclassID' undeclared (first use this function)
main.cc:6: (Each undeclared identifier is reported only once
main.cc:6: for each function it appears in.)
main.cc:6: `MyclassName' undeclared (first use this function)
main.cc:6: parse error before `}'
main.cc: At top level:
main.cc:11: extraneous `int' ignored
main.cc:11: semicolon missing after declaration of `class CMyclass'
main.cc: In function `int main()':
main.cc:7: `CMyclass::~CMyclass()' is private
main.cc:12: within this context
main.cc:5: `CMyclass::CMyclass()' is private
main.cc:12: within this context


Сообщение отредактировал v04bvs: 12.10.2005, 22:16:23

  • 0

#125
yedyge

yedyge
  • Свой человек
  • 879 сообщений
дык это нужно сердцем чуять, а не компиллером.
  • 0

#126
Visual1

Visual1
  • В доску свой
  • 1 198 сообщений
yedyge, civil_nomad, v04bvs:

Вы сделали правильные замечания, но нашли пока еще не все ошибки. Даже очевидные ошибки синтаксиса пока еще остаются не все замечены.
Но это еще не все: очевидные легко видимые ошибки, вроде неправильного регистра букв в именах переменных и опечатки в имени деструктора я сделал в основном для того, чтобы замаскировать главную ошибку. Какую?

Сообщение отредактировал Visual1: 13.10.2005, 00:58:45

  • 0

#127
yedyge

yedyge
  • Свой человек
  • 879 сообщений
ладно, можно ещё точки с запятой вставить (я не помню точных правил, заменяя их избыточными, но упрощёнными. то есть я ставлю их вокруг фигурных скобок всегда, кроме как после else).
1.сначала я бы воткнул перед ретурном в теле конструктора.
2.затем после описания класса.
всё, больше ошибок в упор не вижу. логические могут быть, но могут оказаться намеренным замыслом.
  • 0

#128
dzid

dzid
  • Свой человек
  • 939 сообщений
гы. А как этим классом пользовацца? Он же весь насквозь приватный! :D
  • 0

#129
yedyge

yedyge
  • Свой человек
  • 879 сообщений
это не мешает классу нормально существовать. :D
  • 0

#130
dzid

dzid
  • Свой человек
  • 939 сообщений
тогда на его внутренние логические ашыпки можно с чистой совестью забить - их все равно никто не увидит :D
  • 0

#131
yedyge

yedyge
  • Свой человек
  • 879 сообщений
тогда всё, запускаем либу в эксплуатацию :D
  • 0

#132
ilya666

ilya666
  • Частый гость
  • 77 сообщений

#!perl

my @arr = qw/12345 12346 12344 12374/;
my $ran = '12345';

for my $num (@arr)
{
	
	my $i = 0;
	for my $ind ( 0..( length $ran )  - 1 )
	{

  	$i++ if ( ( substr $ran, $ind, 1 )  eq ( substr $num, $ind, 1 ) );
	}
	print $i;
}


#!perl

my @arr = qw/12345 12346 12344 12374/;
my $ran = '12345';
my @spl = split '',$ran;

for my $num (@arr)
{

	my $sum = 0;
	my $i = 0;
	while ( $num =~ m/($spl[$i++])|./g )
	{
  $sum++ if $1;
	}

print $sum;
}


Одного не могу понять: уже было решение этой задачи на языке J в 3 строки. Зачем нужно писать уродское решение на языке которого даже и не знаешь толком?

Вот правильное решение на Perl:
use PDL;
$v = pdl(1,2,3,4,5);
$a = pdl [[1,2,3,4,5],[1,2,3,4,6],[1,2,3,4,4],[1,2,3,7,4]];
print sumover($v == $a);

Вот из-за таких неучей Perl считают медленным и нечитаемым языком.
  • 0

#133
Visual1

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

гы. А как этим классом пользовацца? Он же весь насквозь приватный! :D

Зачет! (или "зачот" - сейчас так пишут по новому синтаксису) :D
Это и есть главная ошибка - ни один объект такого класса в программе создан быть не может.

(Хотя подобный нереальный класс без единого объекта на его основе все-таки может понадобиться. Но это уже немного другая тема - абстрактные классы и чистые виртуальные функции).

yedyge:
Договориться до того, что есть return в конструкторе! Спасибо, повеселили! :D
Но зато Вы очень хорошо заметили ошибочное и опасное объявление char* в секции данных. :)
  • 0

#134
civil_nomad

civil_nomad
  • Завсегдатай
  • 285 сообщений

dzid:

гы. А как этим классом пользовацца? Он же весь насквозь приватный! :fie:

Зачет! (или "зачот" - сейчас так пишут по новому синтаксису) :)
Это и есть главная ошибка - ни один объект такого класса в программе создан быть не может.


Ну это было все-таки:

main.cc:10: warning: `class CMyclass' only defines a private destructor and has no friends


(Хотя подобный нереальный класс без единого объекта на его основе все-таки может понадобиться. Но это уже немного другая тема - абстрактные классы и чистые виртуальные функции).


ага CNothing :)
  • 0

#135
yedyge

yedyge
  • Свой человек
  • 879 сообщений
формальное отсутствие return не обозначает отсутвия ret.
я лично всегда return держу в уме, и я всегда себя проверяю на то, что именно мне придётся возвращать. функции без return терпеть не выношу.
кстати, таки взял компиллятор (borland c++ 5) и заявляю, что это полностью рабочий код:
class A
{
    int A;
public:
    A(int A) { this->A = A; return; };
};

  • 0

#136
dzid

dzid
  • Свой человек
  • 939 сообщений
Не помню, допускается ли стандартом return в конструкторе, но что это удобно - факт! Разумеется, return-ом нельзя ничего return-ить :fie:
  • 0

#137
dzid

dzid
  • Свой человек
  • 939 сообщений

...
(Хотя подобный нереальный класс без единого объекта на его основе все-таки может понадобиться. Но это уже немного другая тема - абстрактные классы и чистые виртуальные функции).
...

И вот за это я не люблю C++ :fie: Но блин, приходится...

Во, примерчик на разминку (вообще, боянистый примерчик :) )

#include <stdio.h>

unt numbits(unsigned word)
{
  int n=0;
  int density[16] = {0,1,2,2,1,2,2,3,1,2,2,3,2,3,4};
  while (word > 0)
    {
      n += density [word & 0xf];
      word >>= 4;
    }
  return n;
}

int main() { printf ("%d\n", numbits (0x18f)); }

этот код... Что в нем не так?

Сообщение отредактировал dzid: 14.10.2005, 13:35:37

  • 0

#138
yedyge

yedyge
  • Свой человек
  • 879 сообщений
как помню "return" в конструкторе не требуется, но и не запрещается. потому констр с ретурном компиллится и бегает нормально.
  • 0

#139
yedyge

yedyge
  • Свой человек
  • 879 сообщений
ну, например, денсити проинициализирован на 15 значений. шестнадцатое - оперативный мусор.
во вторых название функции вряд ли соответствует результату.
я бы так количество битов не считал.
  • 0

#140
Visual1

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

Не помню, допускается ли стандартом return в конструкторе, но что это удобно - факт! Разумеется, return-ом нельзя ничего return-ить :D

И в чем же тут удобство? :fie:

как помню "return" в конструкторе не требуется, но и не запрещается. потому констр с ретурном компиллится и бегает нормально.

Ну вы ребята даете. Один "не помню", другой - "как помню". :-)

Вообще-то, конструктор класса по самому своему определению не возвращает никаких значений, так что оператор return в нем - неудачная шутка кодера в лучшем случае. :)
В стандарте С99 разрешено указание операторов return без возвращаемых значений, но только в функции типа void. Значит, указывая в конструкторе класса return, вы пытаетесь навязать компилятору, будто бы он имеет дело не с конструктором класса, а с функцией языка C, имеющей тип void. Конечно, ничего у вас не получается - компиляторы уже давно умные! :)
  • 0


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

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

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

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