/ 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
Mærkelig opførsel af C++
Fra : Mads Jensen


Dato : 18-10-03 21:10

Hej

Er der nogen, der kan svare mig på, hvorfor den ikke skriver "usage:
.....", når programmet bliver kørt i konsollen således:
program
altså uden brug af argumenter. Jeg bruger GCC, og compiler ved at skrive:
gcc fil.cpp

Dette er koden fra programmet.
#include <iostream.h>
#include <fstream.h>
#include <string.h>

using namespace std;

int main(int argc, char *argv[]){
cout << sizeof(argv);

if(sizeof(argv) > 2){
   ofstream file((const char *)argv[2]);
   string text;
   
   if (file.bad()){
      cerr << "An error occured!";
      exit(1);
   }
   else{
      cout << "Enter some text to add to the selected file: ";
      cin >> text;
      
      file << text;
   }
}
else{
   cout << "usage: open <file>" << endl;
   exit(1);
}
   

return 0;
}

Tak for hjælpen på forhånd!

mvh.
Mads

 
 
Ivan Johansen (18-10-2003)
Kommentar
Fra : Ivan Johansen


Dato : 18-10-03 21:24

Mads Jensen wrote:
> Dette er koden fra programmet.
> #include <iostream.h>
> #include <fstream.h>

Der er hverken noget der hedder <iostream.h> eller <fstream.h>. Du mener
sikkert <iostream> og <fstream>.

> #include <string.h>
Hvis du mener den header som indeholder std::string, så hedder den
<string>. <string.h>, eller mere korrekt <cstring> indeholder de gamle C
funktioner.

> cout << sizeof(argv);
>
> if(sizeof(argv) > 2){

Da argv er en pointer får du størrelsen af en pointer, hvilket sikkert
er 4. Jeg gætter på at det er antallet af argumenter du er ude efter,
hvilket findes i argc:
if(argc > 2){

>    ofstream file((const char *)argv[2]);

Jeg kan ikke se nogen grund til at lave et cast her. argv[2] er i
forvejen af typen char*:
ofstream file(argv[2]);

Ivan Johansen


Mads Jensen (18-10-2003)
Kommentar
Fra : Mads Jensen


Dato : 18-10-03 21:36

On Sat, 18 Oct 2003 22:23:33 +0200, Ivan Johansen wrote:

> Der er hverken noget der hedder <iostream.h> eller <fstream.h>. Du mener
> sikkert <iostream> og <fstream>.
Ved det, min editor blev bare ved med at plage om at kalde dem det gamle,
og så lod jeg det bare være! Bruger KDevelop, men emacs er vist bedre ?

> Da argv er en pointer får du størrelsen af en pointer, hvilket sikkert
> er 4. Jeg gætter på at det er antallet af argumenter du er ude efter,
> hvilket findes i argc:
> if(argc > 2){

Tak for det. Det var vist det, der gjorde noget af det!

> Hvis du mener den header som indeholder std::string, så hedder den
> <string>. <string.h>, eller mere korrekt <cstring> indeholder de gamle C
> funktioner.
Ok.

Nu skal jeg bare have den til at skrive til filen. Når jeg kører
programmet som "helloworld fil.txt", og derefter indtaster noget tekst, så
er der efterfølgende ikke kommet den fil, som gerne skulle være kommet!


mvh.
Mads

Mogens Hansen (19-10-2003)
Kommentar
Fra : Mogens Hansen


Dato : 19-10-03 07:12


"Mads Jensen" <madsJEGHADER@SPAMMEREanything.dk> wrote in message

[8<8<8<]
> Nu skal jeg bare have den til at skrive til filen. Når jeg kører
> programmet som "helloworld fil.txt", og derefter indtaster noget tekst, så
> er der efterfølgende ikke kommet den fil, som gerne skulle være kommet!
>

Prøv at kig på hvilken værdi filnavnet (argv[2]) har.
F.eks. med en løkke som
for(int i = 0; argc != i;++i) {
cout << i << ": " << argv[i] << endl;
}


Venlig hilsen

Mogens Hansen



Michael aka Slowhand (20-10-2003)
Kommentar
Fra : Michael aka Slowhand


Dato : 20-10-03 20:04

> Mads Jensen wrote:
> > Dette er koden fra programmet.
> > #include <iostream.h>
> > #include <fstream.h>
>
> Der er hverken noget der hedder <iostream.h> eller <fstream.h>. Du mener
> sikkert <iostream> og <fstream>.
>
At sige der ikke er noget der hedder <iostream.h> og <fstream.h> er vel så
meget sagt.
En ting er hvad man bør og hvad man gør men der er jo et ganske brugt
preprocessor include direktiv.
Mine bøger er godt nok ikke helt nye men jeg har aldrig set det uden
efternavnet.

Det gør man ikke mere eller?!

Slowhand AKA Michael



Mads Jensen (20-10-2003)
Kommentar
Fra : Mads Jensen


Dato : 20-10-03 20:19

On Mon, 20 Oct 2003 21:04:21 +0200, Michael aka Slowhand wrote:
> Det gør man ikke mere eller?!
Det er blevet fjernet i en eller anden ANSI (? eller er det ISO) C++
standard. Kan det passe, at det er er den fra 99 ?

mvh.
Mads

Michael aka Slowhand (20-10-2003)
Kommentar
Fra : Michael aka Slowhand


Dato : 20-10-03 20:38


"Mads Jensen" <madsJEGHADER@SPAMMEREanything.dk> skrev i en meddelelse
news:pan.2003.10.20.19.19.16.315266@SPAMMEREanything.dk...
> On Mon, 20 Oct 2003 21:04:21 +0200, Michael aka Slowhand wrote:
> > Det gør man ikke mere eller?!
> Det er blevet fjernet i en eller anden ANSI (? eller er det ISO) C++
> standard. Kan det passe, at det er er den fra 99 ?
>
> mvh.
> Mads

Ok.
jeg har bare ikke alle headerfiler uden efternavn. så jeg funderer over om
det er de samme filer.
Jeg programmerer til Debian Linux!

(Og til Mads... mailen var en svipser, sorry!)

Michael



Mogens Hansen (20-10-2003)
Kommentar
Fra : Mogens Hansen


Dato : 20-10-03 21:16


"Mads Jensen" <madsJEGHADER@SPAMMEREanything.dk> wrote

[8<8<8<]
> Det er blevet fjernet i en eller anden ANSI (? eller er det ISO) C++

Begge dele, plus en del andre nationale standardiserings organer.

> standard. Kan det passe, at det er er den fra 99 ?

Næsten.
C++ Standarden blev vedtaget den 14. november 1997 og blev ratificeret i 1.
halvdel af 1998.

Venlig hilsen

Mogens Hansen



Mogens Hansen (20-10-2003)
Kommentar
Fra : Mogens Hansen


Dato : 20-10-03 21:16


"Michael aka Slowhand" <noden@sol.dk> wrote

[8<8<8<]
> At sige der ikke er noget der hedder <iostream.h> og <fstream.h> er vel så
> meget sagt.

Naturligvis findes de.
Det er blot ikke en del af C++ Standarden
Hvis man skriver det er det typisk et udtryk for
* at man har brugt gamle og/eller dårlige bøger/kurser
* det er er længe siden man har set hvad C++ er

> En ting er hvad man bør og hvad man gør men der er jo et ganske brugt
> preprocessor include direktiv.
> Mine bøger er godt nok ikke helt nye men jeg har aldrig set det uden
> efternavnet.

Det kan typisk godt svare sig at få skiftet gamle bøger ud.
Der er sket meget med C++ både i forbindelse med udarbejdelse af standarden
og i forbindelse med viden om hvordan man bruger det effektivt.

For stream biblioteket er der bl.a. sket det at klasserne er blevet
templates som kan understøtte forskellige tegn-typer, således at wchar_t
understøttes, der er lavet lidt om i klasse-hierakiet og der er tilføjet
locale.

Venlig hilsen

Mogens Hansen



Michael aka Slowhand (21-10-2003)
Kommentar
Fra : Michael aka Slowhand


Dato : 21-10-03 17:23

...
>
> Det kan typisk godt svare sig at få skiftet gamle bøger ud.
> Der er sket meget med C++ både i forbindelse med udarbejdelse af
standarden
> og i forbindelse med viden om hvordan man bruger det effektivt.
>
> For stream biblioteket er der bl.a. sket det at klasserne er blevet
> templates som kan understøtte forskellige tegn-typer, således at wchar_t
> understøttes, der er lavet lidt om i klasse-hierakiet og der er tilføjet
> locale.
>
> Venlig hilsen
>
> Mogens Hansen
>
Hmm.. Så skal jeg da finde en opdatering...
Jeg kan ikke kompilere uden filsuffixet.
Så skal jeg vel også finde en stak nye headerfiler.
Jeg bruger G++ vist version 3.3
Hvad anbefaler i?

Michael



Mogens Hansen (21-10-2003)
Kommentar
Fra : Mogens Hansen


Dato : 21-10-03 18:46


"Michael aka Slowhand" <noden@sol.dk> wrote

[8<8<8<]
> Hmm.. Så skal jeg da finde en opdatering...
> Jeg kan ikke kompilere uden filsuffixet.
> Så skal jeg vel også finde en stak nye headerfiler.
> Jeg bruger G++ vist version 3.3

Umiddelbart ville jeg forvente at det var fint.
Prøv lige at skive
g++ --version
for at være sikker.

Jeg kan ikke mindes at have haft problemer med overholdelse af standarden i
stream biblioteket til g++ 3.x.
Jeg har ikke selv installeret dem, men blot brugt de versioner der følger
med Linux installationen. For tiden er det g++3.2 under Mandrake 9.0


Venlig hilsen

Mogens Hansen



Michael aka Slowhand (21-10-2003)
Kommentar
Fra : Michael aka Slowhand


Dato : 21-10-03 19:15

>
> [8<8<8<]
> > Hmm.. Så skal jeg da finde en opdatering...
> > Jeg kan ikke kompilere uden filsuffixet.
> > Så skal jeg vel også finde en stak nye headerfiler.
> > Jeg bruger G++ vist version 3.3
>
> Umiddelbart ville jeg forvente at det var fint.
> Prøv lige at skive
> g++ --version
> for at være sikker.
>
> Jeg kan ikke mindes at have haft problemer med overholdelse af standarden
i
> stream biblioteket til g++ 3.x.
> Jeg har ikke selv installeret dem, men blot brugt de versioner der følger
> med Linux installationen. For tiden er det g++3.2 under Mandrake 9.0
>
Jeg har version: g++ (GCC) 3.3.1 20030722 (Debian prerelease) Kernen er
2.4.18
Headerfilerne følger kernen ikke?!



Martin Moller Peders~ (21-10-2003)
Kommentar
Fra : Martin Moller Peders~


Dato : 21-10-03 22:34

In <3f95780e$0$9757$edfadb0f@dread14.news.tele.dk> "Michael aka Slowhand" <noden@sol.dk> writes:

>Jeg har version: g++ (GCC) 3.3.1 20030722 (Debian prerelease) Kernen er
>2.4.18
>Headerfilerne følger kernen ikke?!


Nej, kun header til kerne og det er ikke saa mange.

/Martin


Michael aka Slowhand (21-10-2003)
Kommentar
Fra : Michael aka Slowhand


Dato : 21-10-03 23:27

Jeg kan se jeg har en "iostream" og i en undermappe som hedder "backwards"
har jeg "iostream.h" så det lader til jeg både har de nye og de gamle
headerfiler.
Jeg har prøvet med #include "iostream" for at få den til ikke at søge efter
filen men har også prøvet #include <iostream>
med sidstnævnte får jeg ikke fejl om at filen ikke kan findes men det kan
ikke finde definition eller prototype cout
Kan det være fordi den finder den gamle først? (Selv om der er forskel i
filnavn.. Den ene hedder iostream og den anden iostream.h)

Hvis jeg compiler:
#include <iostream>
int main(void)
{
cout << "Come up and C++ me some time.";
cout << "\n";
return 0;
}

med g++ ./myfirst.cpp -o ./myfirst
får jeg:
myfirst.cpp: In function `int main()':
myfirst.cpp:5: error: `cout' undeclared (first use this function)
myfirst.cpp:5: error: (Each undeclared identifier is reported only once for
each function it appears in.)




Bertel Lund Hansen (21-10-2003)
Kommentar
Fra : Bertel Lund Hansen


Dato : 21-10-03 23:33

Michael aka Slowhand skrev:

>Hvis jeg compiler:
>#include <iostream>
>int main(void)
> {
> cout << "Come up and C++ me some time.";
> cout << "\n";
> return 0;
> }

Du skal enten skrive:

   std::cout << "Come up and C++ me some time.";

eller erklære et navnerum:

   #include <iostream>
   using namespace std;

--
Bertel
http://bertel.lundhansen.dk/   FIDUSO: http://fiduso.dk/

Lasse Westh-Nielsen (22-10-2003)
Kommentar
Fra : Lasse Westh-Nielsen


Dato : 22-10-03 02:01

"Michael aka Slowhand" <noden@sol.dk> wrote

> Jeg kan se jeg har en "iostream" og i en undermappe som hedder "backwards"
> har jeg "iostream.h" så det lader til jeg både har de nye og de gamle
> headerfiler.

Giver g++ dig ikke en warning når du compilerer, hvis du inkluderer
"iostream.h"?

Prøv eventuelt et compilere med "-Wall -ansi -pedantic" options (det giver i
øvrigt også bedre kode!), så burde den skrive til dig, at du er i færd med
at bruge de gamle backward compatibility headers eller hvad de nu hedder...

- Lasse


--
Lasse Westh-Nielsen
lasse@daimi.au.dk




Michael aka Slowhand (22-10-2003)
Kommentar
Fra : Michael aka Slowhand


Dato : 22-10-03 10:24


"Lasse Westh-Nielsen" <lasse@daimi.au.dk> skrev i en meddelelse
news:bn4kup$2br$1@jarjarbinks.mobilixnet.dk...
> "Michael aka Slowhand" <noden@sol.dk> wrote
>
> > Jeg kan se jeg har en "iostream" og i en undermappe som hedder
"backwards"
> > har jeg "iostream.h" så det lader til jeg både har de nye og de gamle
> > headerfiler.
>
> Giver g++ dig ikke en warning når du compilerer, hvis du inkluderer
> "iostream.h"?
>
> Prøv eventuelt et compilere med "-Wall -ansi -pedantic" options (det giver
i
> øvrigt også bedre kode!), så burde den skrive til dig, at du er i færd med
> at bruge de gamle backward compatibility headers eller hvad de nu
hedder...

Hej Lasse

Jo det gør den faktisk men da jeg er ny c++ udvikler på linux troede jeg
bare det var en brist i linux.
Den skriver at jeg bruger en "depreciated" headerfil hvis jeg bruger
iostream.h

Alle:
Tak for hjælpen!



Per Abrahamsen (22-10-2003)
Kommentar
Fra : Per Abrahamsen


Dato : 22-10-03 11:22

"Lasse Westh-Nielsen" <lasse@daimi.au.dk> writes:

> Prøv eventuelt et compilere med "-Wall -ansi -pedantic" options (det giver i
> øvrigt også bedre kode!),

For lige at være specifik: Det får gcc til at generere præcis den
same kode som uden ovenstående flag, men får også gcc til at advare
mod en masse tvivlsomme konstruktiner i kildeteksten.

Personligt bruger jeg:

   WARNING = -W -Wall -Wno-sign-compare -Wstrict-prototypes \
       -Wconversion -Wmissing-prototypes -Woverloaded-virtual \
       -Wsign-promo -Wundef -Wpointer-arith -Wwrite-strings
# -Wold-style-cast: triggered by header files for 2.95/woody
# -Wmissing-noreturn: triggered by some virtual functions.
   COMPILE = $(GCC) -ansi -pedantic $(WARNING) $(DEBUG) $(OSFLAGS)

I hvert fald -W (eller -Wextra som er det nye navn) er en god
tilføjelse til -Wall.

Jeg ville foretrække at GCC havde en -Weverything der slog alt til, så
kunne man selv slå de mere fjollede advarsler fra med -Wno-eff-c++ og
lignende. Som det er nu ved man aldrig om man misser en god advarsel.

Jacob Atzen (18-10-2003)
Kommentar
Fra : Jacob Atzen


Dato : 18-10-03 21:27

"Mads Jensen" <madsJEGHADER@SPAMMEREanything.dk> writes:

> Hej
>
> Er der nogen, der kan svare mig på, hvorfor den ikke skriver "usage:
> ....", når programmet bliver kørt i konsollen således:
> program
> altså uden brug af argumenter. Jeg bruger GCC, og compiler ved at skrive:
> gcc fil.cpp
>
> Dette er koden fra programmet.
> #include <iostream.h>
> #include <fstream.h>
> #include <string.h>
>
> using namespace std;
>
> int main(int argc, char *argv[]){
> cout << sizeof(argv);

argv er en pointer til et array eller en pointer til en pointer om du
vil. sizeof(argv) giver dig altså størrelsen på en pointer og *ikke*
antallet af elementer i arrayet. Mon ikke du hellere vil bruge argc
til formålet?

--
Med venlig hilsen
- Jacob Atzen

Mogens Hansen (19-10-2003)
Kommentar
Fra : Mogens Hansen


Dato : 19-10-03 07:13

Oven i hvad andre har sagt:

"Mads Jensen" <madsJEGHADER@SPAMMEREanything.dk> wrote

[8<8<8<]
> ofstream file((const char *)argv[2]);

Er det cast nødvendigt ?

[8<8<8<]
> if (file.bad()){

Strengt taget har en stream også andre fejl-states der kan være sat.
Den typiske måde at test om en stream er i orden er:
if(file)
eller rettere ofte
if(!file) {
// do error handling
}

Hvilket får mig til at sige, at hvis du vender betingelserne for
fejl/success, slipper du af med alle dine "else" og programmet bliver
simplere at læse, fordi det får færre nested if-statements.
Altså

if(argc < 2){
cout << "usage: open <file>" << endl;
return 0;
}
// ingen else - det er implicit pga. return

// ...

if(!file) {
cerr << "An error occured!" << endl;
return 1;
}
// ingen else - det er implicit pga. return


Venlig hilsen

Mogens Hansen



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

Månedens bedste
Årets bedste
Sidste års bedste