/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
C struct i C++
Fra : db


Dato : 14-04-04 11:41

Hey igen

Nå, men det kan være nogle kan svare på dette så:
Ifølge "man 2 stat" tager system kaldet stat følgende
int stat(const char *path, struct stat *sb);

Jeg har:
class File {
   struct stat fileInfo;
};
File::File(const string& filename) {
   stat(filename.c_str(), &fileInfo);
}

Det kompiler fint, men det virker ikke (segment fault hvis filen
findes). Jeg tror det er fordi kompileren tror "struct stat" er en c++
struct og dermed kan stat() ikke bruge den ordentlig eller sådan noget?
Hvordan fixer jeg det?

mvh
db

 
 
Mogens Hansen (14-04-2004)
Kommentar
Fra : Mogens Hansen


Dato : 14-04-04 14:16

db wrote:

[8<8<8<]
> Jeg har:
> class File {
>    struct stat fileInfo;
> };
> File::File(const string& filename) {
>    stat(filename.c_str(), &fileInfo);
> }
>
> Det kompiler fint, men det virker ikke (segment fault hvis filen
> findes).

Kan de se præcist hvor der kommer segment fault ?

> Jeg tror det er fordi kompileren tror "struct stat" er en c++
> struct og dermed kan stat() ikke bruge den ordentlig eller sådan noget?

Der skulle ikke være problemer med at bruge en C struct i C++ - det er
helt almindeligt at gøre.

Der må mangle noget til historien.
Hvor er erklæringen af constructoren til File ?
Er du sikker på at filename er et gyldigt objekt ?

Venlig hilsen

Mogens Hansen


db (14-04-2004)
Kommentar
Fra : db


Dato : 14-04-04 13:02

On Wed, 14 Apr 2004 15:15:43 +0200
Mogens Hansen <mogens_h@dk-online.dk> wrote:

> > Det kompiler fint, men det virker ikke (segment fault hvis filen
> > findes).
>
> Kan de se præcist hvor der kommer segment fault ?

Damn, det kom ikke derfra alligevel:
cerr<<"1"<<endl;
Input::inst()->setInputBase(new File(confFile));
cerr<<"2"<<endl;

Udskriver kun "1" hvis filen findes.

File::File(const std::string& file) : filename(file) {
   if(stat(filename.c_str(), &fileInfo) < 0)
throw OpenError(filename);
}

Det er ikke ovenstående alligevel der er noget i vejen med.
Input::setInputBase kommer også hele vejen igennem, men når den
returnere kommer der segmentation fault.
class Input {
   InputBase *in;
   Input() {
      in = 0;
   }
   public:
   static Input* inst() {
      static lockdown::io::in::Input* myself = new Input;
      return myself;
   }
   void setInputBase(InputBase *i) { //File nedarver fra InputBase
      if(in != 0)
         delete in;
      in = i;
      //Sættes en cerr her bliver den udskrevet
   }
}

Så måske har det noget at gøre med den måde jeg har implementeret
singelton på?

mvh
db

db (14-04-2004)
Kommentar
Fra : db


Dato : 14-04-04 13:44

On Wed, 14 Apr 2004 16:30:57 +0200
Mogens Hansen <mogens_h@dk-online.dk> wrote:

> > Damn, det kom ikke derfra alligevel:
>
> Har du en debugger, så du kan singlesteppe igennem dit program og
> følge med i hvad der sker ?

Ja det kunne være jeg skulle til at bruge gdb noget mere.

> Hvorfor har du ikke en constructor der tager en InputBase& og
> initialiserer klassen korrekt og så dropper funktionen "setInputBase"
> ?

Hvis man nu ønsker at ændre input kilde undervejs?

> [8<8<8<]
> >    static Input* inst() {
> >       static lockdown::io::in::Input* myself = new Input;
>
> Hvem nedlægger "myself" igen ?
> (Det er et klassisk spørgsmål for den klassiske implementering)

Den skal ikke nedlægges før programmet lukkes, så det gøres vel
automatisk?

> Hvordan sikrer du at InputBase (File) objektet _altid_ er allokeret på
> heapen ?
> Hvordan holder du styr på hvem der ejer InputBase objektet ?

Gode spørgsmål. Hvad vil du så anbefale jeg gør? Måske en
File::useFile(string) som opretter et object?

mvh
db

db (14-04-2004)
Kommentar
Fra : db


Dato : 14-04-04 14:02

On Wed, 14 Apr 2004 16:53:09 +0200
Mogens Hansen <mogens_h@dk-online.dk> wrote:

> > Hvis man nu ønsker at ændre input kilde undervejs?
>
> Så laver man bare et nyt objekt.

Jamen i class Input skal et eller andet jo pege på det objekt, som er
InputBase og eftersom en reference kun kan sættes en gang og jeg vil
have man skal kunne skifte inputBase bliver det vil nødt til at være en
pointer? Hvis ikke må du lige vise mig hvad du mener.

> > Gode spørgsmål. Hvad vil du så anbefale jeg gør?
>
> Det er ikke til at vide.
> Hvad er det du vil lave ?

lockdown.trunet.dk...jeg er ved at lave version 1.0 hvor jeg har lavet
helt om på koden. Kan godt sende dig koden hvis det er noget du gider se
på. Jeg er ikke blevet undervist i C++ og er ca midtvejs i datamatiker
uddannelsen, men forsøger at lære mig selv lidt om hvordan et godt
design skal se ud.

> Hvorfor kan det behov ikke opfyldes af file-stream biblioteket i C++ ?

Jeg har brug for at sætte permissions og ændre user og group på filen.

> > Måske en
> > File::useFile(string) som opretter et object?

Ups, det skulle stå Input::useFile(string)

mvh
db

db (15-04-2004)
Kommentar
Fra : db


Dato : 15-04-04 20:05

On Thu, 15 Apr 2004 22:39:01 +0200
Mogens Hansen <mogens_h@dk-online.dk> wrote:

> > Hvis ikke må du lige vise mig hvad du mener.
> Det står ikke klart hvad det er du ønsker at lave

Jeg har fået løst mit program og fundet en design jeg kan leve med

> > Jeg er ikke blevet undervist i C++ og er ca midtvejs i datamatiker
> > uddannelsen,
>
> Jeg vil anbefale at søge oplysninger om hvordan man bedst muligt
> bruger C++. Et godt sted at starte er bogen
> Accelerated C++
> Andrew Koenig, Barbara E. Moo
> ISBN 0-201-70353-X
> den indeholder både en god introduktion til C++ og mod slutningen
> nogle ret elegante eksempler på design.

Jeg har læst ovenstående, men synes nu Bjarnes bog er bedre. Synes dog
ikke de fortæller ret meget om hvordan man strukturer koden. Jeg har
også en god om design patterns som hjælper lidt på det, men den giver
stadig ikke det nødvendige overblik.
Jeg må jo studere noget kode på nettet...måske boost og se hvordan de
har gjort det, men som du selv siger tager det 100 år at sætte sig ind i
andres kode.

Anyway tak for hjælpen

br
db

db (15-04-2004)
Kommentar
Fra : db


Dato : 15-04-04 21:49

On Fri, 16 Apr 2004 00:07:41 +0200
Mogens Hansen <mogens_h@dk-online.dk> wrote:

> > Jeg har læst ovenstående,
>
> Kunne du bruge det ?
> Fik du lavet øvelserne ?

Nej, jeg er for dovn*G*

> > Synes dog
> > ikke de fortæller ret meget om hvordan man strukturer koden. Jeg har
> > også en god om design patterns som hjælper lidt på det, men den
> > giver stadig ikke det nødvendige overblik.
>
> Måske kan du have glæde af nogle af Robert C. Martin's design
> principper
> - se:
> http://www.objectmentor.com/resources/listArticles?key=topic&topic=Design%20Principles
> De har ihvertfald hjulpet mig gennem tiden.

Ok takker, det vil jeg se på.

mvh
db

db (16-04-2004)
Kommentar
Fra : db


Dato : 16-04-04 06:54

On Fri, 16 Apr 2004 05:36:51 +0200
"Mogens Hansen" <mogens_h@dk-online.dk> wrote:

> Det er egentligt ærgeligt.
> Når man læser dem, ser de nemme ud og man kan derfor have tendens til
> at hoppe dem over.
> Det viser sig dog at det er ret gennemtænkte, og at der er mere i dem
> så man lærer en del af at lave dem - jeg vil påstå at det gælder
> uanset hvor meget C++ erfaring man har.

Ok, trist jeg ikke har den længere. Jeg læste den på en uge og skyndte
mig ned og få den byttet til bjarnes bog, som er skrevet mere efter mit
hoved. Men synes jeg har styr på C++, jeg mangler bare viden om
strukturering og generelle principper og "regler" for godt design.

br
db

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408914
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste