🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.c
Article #268155

Re: Ciemna strona C++

#268155
From: Sektor van Skijlen
Date: Thu, 15 Nov 2007 00:32
78 lines
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-mail
References: <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