Avatar billede shjtip Nybegynder
16. september 1999 - 11:15 Der er 13 kommentarer og
1 løsning

argv og argc i main hvad er der galt med denne kode stump

jeg kan ikke gennemskue hvorfor min lille kodestump her ikke virker. Når jeg kompilere den er der ingne fejl, men den reagere ikke på argumenterne.

#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
main(int argc, char *argv[])
{
  char linie[256];
  char ord[64];
  if(argc!= 4)
  {
  cout<<"du skal angive fil1, fil2, streng1,streng2 i komando linien"<<endl;
  exit(1);
  }
  ifstream fil_1(argv[1],ios::out|ios::in);
  if(! fil_1)
  {
  cout <<"kan ikke åbne filen "<<argv<<endl;
  exit(1);
  }
  while(! fil_1.eof())
  {
      fil_1>> ord;
      if(ord == argv[5])
      {
      cout<<ord<< " er = med "<<argv[4]<<endl;
      exit(0);
      }
  }

}
Avatar billede bjarke Nybegynder
16. september 1999 - 12:13 #1
Jeg har ikke lige en compiler ved hånden, men (hvis ikke jeg husker helt galt) det første argument er stien til programmet. Dvs at hvis du skal bruge 4 parametre, så skal du altså skrive
    if( argc!=5 ) ...

Når man programmerer og det ikke virker, så er det ofte en god idé at kontrollere værdien/indholdet af forskellige variabler.

Ovenstående kunne du f.eks. kontrollere ved
1)  cout << argc;
2)  for(int i=0; i<argc; i++)
        cout << argv[i] << endl;

Og så ville du formentlig opdage det jeg har skrevet ;-)
Avatar billede soepro Nybegynder
16. september 1999 - 12:34 #2
Problemerne er flere:

1) Dit check på antal parametre er galt - du kræver at argc skal være 4 - men da programmets eget navn altid er parameter 1, betyder det at dit program kun modtager 3 andre parametre. Hvis brugeren følger din vejledning med filenavn1, filnavn2, streng1, streng2 vil programmet aldrig starte op.

2) Din åbning af fil1 sletter indholdet af filen, fordi du skrive 'ios::out|ios::in' - det skal du rette til 'ios::in'.

3) Din sammenligning på (ord == argv[5]). I modsætning til hvad du sikkert tror, er det ikke INDHOLDET af ord du sammenligner med INDHOLDET af parameter 5, men derimod adressen på de to. (Det er char* variabler, dvs. adresser på et areal i hukommelsen. Se mit svar til bjarke omkring far/near pointere, hvis du vil vide mere om pointere.) Hvis dit program skal virke skal du inkludere <string.h> i toppen af dit program, og ændre IF'en til if (strcmp(ord, argv[2]) == 0). (Se nedenfor omkring argv[2].)

Derudover checker du i dit program ord mod argv[5] - men der er aldrig udfyldt. Indkser i C er 0-baserede, dvs. det færste element (element 1) i en tabel har indeks 0, 2. element indeks 2 osv. Hvis vi antager at man blot skal indtaste et fil-navn og et søge ord, skal du blot kræve at argc er 3 (programnavn + de to parametere), og i IF'en checke ord mod argv[2]. (Det tredie element i parameter tabellen.) Tilsvarende skal du så udskrive argv[2] i cout'en lige under IF'en.

:-) Jeg har lavet en ændret version af dit program, der virker nu. Skriv igen, hvis jeg skal lægge den ind her som svar.

P.S. Istedet for at bruge 'exit(1)', bør du ændre 'main' til 'int main' og skrive 'return 1' i stedet for 'exit(1)'. Det giver kortere kode. 'exit(1)' er kun beregnet til at lave "program halt" i underfunktioner langt "nede" i programmet. Altså i stil med:

int main(int argc, char* argv[])
{
  return 1;
}
Avatar billede soepro Nybegynder
16. september 1999 - 12:35 #3
bjarke >> satans - jeg gik lige til frokost inden jeg sendte svaret !!
Avatar billede bjarke Nybegynder
16. september 1999 - 12:49 #4
hi hi :-) Det er jo min eneste chance! Når jeg ikke har så meget tid og kun laver korte svar, så må jeg jo satse på at spørger giver mig point inden du kommer :-)

Hvad laver du i grunden soepro? Det lader til, at du altid har tid til at skrive en hel roman? (Det er fedt nok når jeg selv spørger, men ikke når jeg skal konkurrere med dig - skulle vi ikke lave pointdeling?)
Avatar billede soepro Nybegynder
16. september 1999 - 12:50 #5
Iøvrigt vil dit program dumpe, hvis du finder et ord der er længere end 63 tegn (64-1). Du bør rette fil_1>>ord til fil1_.getline(ord, sizeof(ord), ' ') i stedet for. Så vil ord aldrig indlæse mere end 63 tegn.
Avatar billede soepro Nybegynder
16. september 1999 - 12:54 #6
bjarke>>Du kan jo kigge på min mini-site her på eksperten - ellers på min hjemmeside hjem.get2net.dk/soepro
Avatar billede bjarke Nybegynder
16. september 1999 - 12:57 #7
Hold da helt op mand - du er jo et helt firma!!! Hvordan skal vi andre så klare os - hvad med at konkurrere lidt med IBM i stedet ;-)
Avatar billede shjtip Nybegynder
16. september 1999 - 13:45 #8
sorry Bjarke, men jeg blev altså nød til at give point til soepro, han er simpelthen for sej til c++, hilsen Simon
Avatar billede bjarke Nybegynder
16. september 1999 - 13:47 #9
Øv - bare fordi han skriver en hel roman:-( Men OK, han gav et godt svar.

soepro >> skal du ikke snart på ferie??? ;-)
Avatar billede shjtip Nybegynder
16. september 1999 - 13:53 #10
Det betyder iøvrigt ikke at jeg ikke sætter pris på dine svar, men du er jo oppe mod et c++ monster ik :-)
Avatar billede bjarke Nybegynder
16. september 1999 - 14:03 #11
Tak shjtip. Jeg var ellers lige ved at blive ked af det (jeg synes nemlig selv at jeg er ret sej;-)

soepro >> har du selv lavet dryCASH 2000? Og hedder du Vagn?
Avatar billede shjtip Nybegynder
16. september 1999 - 15:08 #12
soepro

Vil du ikke være så venlig at ligge din version af min kodestump up, eller maile den til mig på shj@get2net.dk
Hilsen Simon
Avatar billede soepro Nybegynder
16. september 1999 - 21:56 #13
Her er den:

#include <fstream.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
  char linie[256];
  char ord[64];
  if(argc!= 3)
  {
    cout<<"du skal angive fil1, streng1 i komando linien"<<endl;
    return 1;
  }
  ifstream fil_1(argv[1],ios::in);
  if(! fil_1)
  {
    cout <<"kan ikke åbne filen "<<argv<<endl;
    return 1;
  }
  cout << "Leder efter "<<argv[2]<< " i "<<argv[1]<<endl;

  while(! fil_1.eof())
  {
    fil_1.getline(ord, sizeof(ord), ' ');
    if(strstr(ord, argv[2]) != NULL)
    {
      cout<<argv[1]<< " indeholder ordet "<<argv[2]<<endl;
      return 0;
    }
  }
  cout<<argv[2]<<" er IKKE fundet i "<<argv[1]<<endl;
  return 2;
}
Avatar billede soepro Nybegynder
16. september 1999 - 21:57 #14
bjarke >> Ja, jeg har selv lavet DryCASH 2000 og jeg hedder Vagn.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester