|
| 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
| |
|
|