Article View: pl.comp.lang.c
Article #268155Re: Ciemna strona C++
From: Sektor van Skijlen
Date: Thu, 15 Nov 2007 00:32
Date: Thu, 15 Nov 2007 00:32
78 lines
4204 bytes
4204 bytes
Dnia Wed, 7 Nov 2007 01:26:33 +0100, Tomasz bla Fortuna skrobie:
> [-- text/plain, encoding quoted-printable, charset: ISO-8859-2, 57 lines --]
> Dnia Tue, 06 Nov 2007 23:34:04 +0100
> Seweryn Habdank-Wojewódzki <shw_mail@wp.pl> napisał(a):
> > > Mi sie spodobal kod ze strony 48, nigdy bym sie nie spodziewal
> > > bledu w takim miejscu.
> >
> > Zacząłbym od tego, że ten kod się nie kompiluje.
> > Po upgrade, aby mógł się kompilować wszystko działa dobrze.
> Nie wiem czy dobrze interpretuję "wszystko działa dobrze". ;-)
> Pozwoliłem sobie na potestowanie, bo w sumie mi też przykład się podoba.
> #v+
> #include <stdio.h>
> struct bar {int member;};
> struct foo : public bar {int member2;};
> void frobnicate(struct bar* x)
> {
> printf("INSIDE: %d %d %d\n", x[0].member, x[1].member,
> x[2].member);
> x[0].member -= x[1].member;
> }
> int main()
> {
> struct foo x[10];
> x[0].member = 10; x[1].member = 5; x[2].member = 1234;
> x[0].member2 = 31337;
> printf("BEFORE: %d %d\n", x[0].member, x[1].member);
> frobnicate(x);
> printf("AFTER: %d %d\n", x[0].member, x[1].member);
> return 0;
> }
> #v-
> No i wewnątrz funkcji zamiast do member drugiego elementu tablicy
> funkcja dostaje się do member2 pierwszego elementu tablicy. Może
> niespecjalnie mnie to dziwi (i dlatego też myślę, że "działa dobrze"
> może oznaczać, że psuje się jak powinno), ale szkoda, że nawet warninga
> nie ma...
Moment - na co przepraszam chcesz mieć warning?
Zdecyduj ty się może, czy przekazujesz pojedynczy obiekt, czy przekazujesz
wskazanie na pojedynczy element tablicy (i, co ważniejsze, wiesz na pewno,
że za nim znajdują się w tej tablicy jeszcze co najmniej dwa elementy).
Oczywiście, nikt nie będzie zaprzeczał, że zunifikowanie iteratora do tablicy
z wskaźnikiem na pojedynczy obiekt, jest poważną wadą - istnieje jednak od
początków języka C i jak zatwierdzano standard, nikt nie widział w tym żadnego
problemu. A C++ nie był w stanie niczego z tym zrobić. W C++ i tak jest duży
postęp przez to, że nie można domyślnie konwertować niespokrewnionych
wskaźników.
> Czy metodologię testowania mam zepsutą? ;/
W przypadku języka C, faktycznie, nie jesteś w stanie ustrzec się takiego
błędu. Ciesz się, jeśli kompilator rzuci warning, że konwertujesz różne
typy wskaźnikowe (bo nie musi rzucać - w ANSI C nie jest to błąd).
W przypadku C++ można się tego ustrzec o tyle, o ile się będzie pamiętać, żeby
nie stosować operatora [] na typie X* - jeśli się miało na myśli tablicę,
należy jawnie napisać, że chodzi o iterator. W takim przypadku przynajmniej
nie będzie można takiego programu skompilować.
--
// _ ___ Michal "Sektor" Malecki <sektor(whirl)kis.p.lodz.pl>
\\ L_ |/ `| /^\ ,() <ethouris(O)gmail.com>
// \_ |\ \/ \_/ /\ C++ bez cholesterolu: http://www.intercon.pl/~sektor/cbx
"Java is answer for a question that has never been stated"
Technical Details
Message-ID:
<fhg43j$b4s$1@kujawiak.man.lodz.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!newsfeed.silweb.pl!news.man.lodz.pl!not-for-mailReferences:
<fghgeo$spf$1@nemesis.news.tpi.pl> <20071106002442.aebf0037.sulsa@dontmail.me> <fgqpbs$9cu$1@news.vectranet.pl> <20071107012633.3efe623d@Vorago>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!newsfeed.silweb.pl!news.man.lodz.pl!not-for-mail
From: Sektor van Skijlen <ethouris@guess.if.gmail.com.is.valid.or.invalid>
Newsgroups: pl.comp.lang.c
Subject: Re: Ciemna strona C++
Date: Thu, 15 Nov 2007 00:32:51 +0000 (UTC)
Organization: LODMAN - Metropolitan Area Network in LODZ, Poland
Lines: 78
Sender: Michal Malecki <sektor@student.kis.p.lodz.pl>
Message-ID: <fhg43j$b4s$1@kujawiak.man.lodz.pl>
References: <fghgeo$spf$1@nemesis.news.tpi.pl> <20071106002442.aebf0037.sulsa@dontmail.me> <fgqpbs$9cu$1@news.vectranet.pl> <20071107012633.3efe623d@Vorago>
NNTP-Posting-Host: student.kis.p.lodz.pl
Mime-Version: 1.0
X-Trace: kujawiak.man.lodz.pl 1195086771 11420 212.191.89.21 (15 Nov 2007 00:32:51 GMT)
X-Complaints-To: abuse@man.lodz.pl
NNTP-Posting-Date: Thu, 15 Nov 2007 00:32:51 +0000 (UTC)
User-Agent: tin/1.8.3-20070201 ("Scotasay") (UNIX) (FreeBSD/6.2-RELEASE-p3 (sparc64))
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit