Nybörjarfråga om C++ [LÖST]

Här diskuteras programmering och utveckling
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Nybörjarfråga om C++ [LÖST]

Inlägg av Johnny Rosenberg »

Tänkte börja testa lite C++ och har letat runt lite på nätet för att hitta några enkla exempel för inspiration. Just nu är det filhantering jag försöker lära mig, exempelvis.

Har installerat g++ 4.1.2-16ubuntu2 och dess beroenden. Min fråga är vad jag behöver mer. Verkar som om något väsentligt saknas, eftersom i stort sett samtliga enkla exempel jag provat ger många felmeddelanden vid kompilering. Kan väl ge ett exempel, annars blir detta kanske lite väl flummigt:

Kopierade följande text in i emacs, sparade, avslutade och kompilerade med g++ (vilket också får mig att tänka på att jag i början av 90-talet kompilerade C-kod direkt i emacs, men nu kommer jag inte på hur man gör det, men det går säkert att hitta på nätet hur man gör).

Så här ser programexemplet ut som jag snodde rakt av härifrån:

Kod: Markera allt

#include <fstream>
#include <string>

int main (int argc, char * argv[]) {
  int Antal = 0;
  string Ord;
  
  // har vi tillräckligt parametrar?
  if ( argc != 2 ) {
    cout << "Fel antal parametrar!" << endl;
    cout << "Användning: " << argv[0] << " filnamn" << endl;
    exit ( EXIT_FAILURE );
  }

  // öppna en fil
  ifstream Data ( argv[1] );
  if ( ! Data ) {
    // kunde inte öppna filen
    cout << "Kunde inte öppna filen: " << argv[1] << endl;
    exit ( EXIT_FAILURE );
  }

  // iterera över all ord i filen
  while ( Data >> Ord ) {
    // öka antalet lästa ord
    Antal++;
  }

  // skriv ett svar
  cout << "Läste " << Antal << " ord." << endl;
}
Så här ser det ut när jag försöker kompilera:

Kod: Markera allt

$ g++ Exempel.c++ 
Exempel.c++: In function "int main(int, char**)":
Exempel.c++:6: fel: "string" deklarerades inte i detta definitionsområde
Exempel.c++:6: fel: expected `;' before "Ord"
Exempel.c++:10: fel: "cout" deklarerades inte i detta definitionsområde
Exempel.c++:10: fel: "endl" deklarerades inte i detta definitionsområde
Exempel.c++:16: fel: "ifstream" deklarerades inte i detta definitionsområde
Exempel.c++:16: fel: expected `;' before "Data"
Exempel.c++:17: fel: "Data" deklarerades inte i detta definitionsområde
Exempel.c++:19: fel: "cout" deklarerades inte i detta definitionsområde
Exempel.c++:19: fel: "endl" deklarerades inte i detta definitionsområde
Exempel.c++:24: fel: "Data" deklarerades inte i detta definitionsområde
Exempel.c++:24: fel: "Ord" deklarerades inte i detta definitionsområde
Exempel.c++:30: fel: "cout" deklarerades inte i detta definitionsområde
Exempel.c++:30: fel: "endl" deklarerades inte i detta definitionsområde
$
Har testat fler exempel, bland annat ett från en bok som jag råkar ha liggande, men får liknande felmeddelanden vad jag än testar, även när det gäller enkla "Hello world"-program.

Så förmodligen är det något jag behöver installera, eller?

Testade också att byta ut de första två raderna mot följande, vilket också misslyckades:

Kod: Markera allt

#include <iostream.h>
#include <fstream.h>
#include <string.h>
Fick nu följande felmeddelanden:

Kod: Markera allt

$ g++ Exempel.c++ 
I fil inkluderad från /usr/include/c++/4.1.3/backward/iostream.h:31,
                 från Exempel.c++:1:
/usr/include/c++/4.1.3/backward/backward_warning.h:32:2: varning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated.
Exempel.c++: In function "int main(int, char**)":
Exempel.c++:7: fel: "string" deklarerades inte i detta definitionsområde
Exempel.c++:7: fel: expected `;' before "Ord"
Exempel.c++:25: fel: "Ord" deklarerades inte i detta definitionsområde
$
Med mina numera ruttnande kunskaper i C++ (kunskaper som alltid varit försvinnande små) inser jag ju att string.h eller något annatkanske inte finns i mitt system, så vad jag vill veta är hur jag får med allt man kan tänkas behöva genom att installera så få paket som möjligt... eller något ditåt. Andra tips är också välkomna. Håll i minnet att jag är nybörjare på detta, kanske rent av idiot.

Jag testade också med följande första tre rader:

Kod: Markera allt

#include <iostream>
#include <fstream>
#include <string>
De felmeddelanden jag då fick var följande:

Kod: Markera allt

$ g++ Exempel.c++ 
Exempel.c++: In function "int main(int, char**)":
Exempel.c++:7: fel: "string" deklarerades inte i detta definitionsområde
Exempel.c++:7: fel: expected `;' before "Ord"
Exempel.c++:11: fel: "cout" deklarerades inte i detta definitionsområde
Exempel.c++:11: fel: "endl" deklarerades inte i detta definitionsområde
Exempel.c++:17: fel: "ifstream" deklarerades inte i detta definitionsområde
Exempel.c++:17: fel: expected `;' before "Data"
Exempel.c++:18: fel: "Data" deklarerades inte i detta definitionsområde
Exempel.c++:20: fel: "cout" deklarerades inte i detta definitionsområde
Exempel.c++:20: fel: "endl" deklarerades inte i detta definitionsområde
Exempel.c++:25: fel: "Data" deklarerades inte i detta definitionsområde
Exempel.c++:25: fel: "Ord" deklarerades inte i detta definitionsområde
Exempel.c++:31: fel: "cout" deklarerades inte i detta definitionsområde
Exempel.c++:31: fel: "endl" deklarerades inte i detta definitionsområde
$
Kan min senare tids programmering av OpenOffice.org-makron ha förstört mig..? Där är ju allting så enkelt och självklart och allt bara finns där från början, så att säga... Har kanske blivit bortskämd...

J.R.
Senast redigerad av 1 DrMegahertz, redigerad totalt 31 gånger.
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Användarvisningsbild
mcNisse
Inlägg: 5211
Blev medlem: 06 feb 2007, 20:51
OS: Debian
Utgåva: Vet inte/ingen utgåva passar

SV: Nybörjarfråga om C++

Inlägg av mcNisse »

Jag kan bara ge dig en fingervisning om var problemet ligger då jag kan nästan ingen c++ själv.

Det har men namnrymder (namespaces) att göra. Tror att det går bättre om du deklarerar en string från standard namrymden. Kan tyvär inte syntax...
KDE 4.5 SC är ute i det fria!!! Tjoho

Stagnation is good for nobody - after all if you don't progress you end up with gnome
Användarvisningsbild
gasol
Inlägg: 405
Blev medlem: 27 jul 2007, 14:57
Kontakt:

SV: Nybörjarfråga om C++

Inlägg av gasol »

Jao mcNisse har helt rätt.

Lägg till raden using namespace std; efter dina include rader


klasserna string och ifstream tillhör standard biblioteket så om du inte vill använda std namespace så måste du skriva std::string och std::ifstream osv...


edit: du måste även inkludera iostream så att cout är deklarerat.
#include <iostream>
Senast redigerad av 1 gasol, redigerad totalt 12 gånger.
The Black Mountain Scorpion Hoedown Bluegrass Experience Gang
From Left to Right: Wizard on Bicycle, Wizard on Bicycle, Wizard on Bicycle, Wizard on Bicycle, Wizard on Bicycle.
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

SV: Nybörjarfråga om C++

Inlägg av Johnny Rosenberg »

gasol skrev: Jao mcNisse har helt rätt.

Lägg till raden using namespace std; efter dina include rader


klasserna string och ifstream tillhör standard biblioteket så om du inte vill använda std namespace så måste du skriva std::string och std::ifstream osv...


edit: du måste även inkludera iostream så att cout är deklarerat.
#include <iostream>
Angående iostream, läs slutet av mitt ursprungliga inlägg.

Men namespace? Är detta något nytt påfund? Står inget om något sådant i de C++-böcker och liknande jag bläddrat i... men dessa har ju några år på nacken, så många år att man på den tiden skrev #include <iostream.h> istället för #include <iostream>, exempelvis.

Vad innebär namespace? Om det går att förklara enkelt förstås.
Och tillhör inte även iostream standardbiblioteket?

Sedan funderar jag lite, när det gäller de paket som finns att installera via Synaptic: Vad då Multilib? Det finns ett paket som heter samma som det jag installerade, men med tillägget "Multilib".

När jag söker på "g++" i Synaptic får jag upp att jag har följande installerat för tillfället:

Kod: Markera allt

g++                   4:4.1.2-9ubuntu2
g++-4.1               4.1.2-16ubuntu2
Av det jag inte har installerat tänkte jag främst på:

Kod: Markera allt

g++-4.1-multilib      4.1.2-16ubuntu2
Sedan ser jag att det också finns motsvarande paket för g++ 4.2. Är det att föredra istället?

J.R.
Senast redigerad av 1 Johnny Rosenberg, redigerad totalt 13 gånger.
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

SV: Nybörjarfråga om C++

Inlägg av Johnny Rosenberg »

Nu fick jag exemplet att fungera:

Kod: Markera allt

#include <iostream>
#include <fstream>
#include <string>

int main (int argc, char * argv[]) {
  int Antal = 0;
  std::string Ord;
  
  // har vi tillräckligt parametrar?
  if ( argc != 2 ) {
    std::cout << "Fel antal parametrar!" << std::endl;
    std::cout << "Användning: " << argv[0] << " filnamn" << std::endl;
    exit ( EXIT_FAILURE );
  }

  // öppna en fil
  std::ifstream Data ( argv[1] );
  if ( ! Data ) {
    // kunde inte öppna filen
    std::cout << "Kunde inte öppna filen: " << argv[1] << std::endl;
    exit ( EXIT_FAILURE );
  }

  // iterera över all ord i filen
  while ( Data >> Ord ) {
    // öka antalet lästa ord
    Antal++;
  }

  // skriv ett svar
  std::cout << "Läste " << Antal << " ord." << std::endl;
}
Otroligt otympligt att skriva std:: framför nästan allting. Känns otroligt omodernt, om inte annat...

När jag lade till .h i alla include-satserna slapp jag detta, men fick varningar om antika blaha blaha eller nåt. Dock fungerade programmet som det skulle. Varför har man infört detta larv med namespace? Fritt fram för alla och envar att övertyga mig om att det INTE är larv...

Kan tänka mig att syftet kan vara att man vill använda samma namn på olika saker i vissa sammanhang, men hur mycket har egentligen behov av att heta "endl", "ifstream" eller "cout"? Nåja, nu kanske man inte ska göra detta till en debatt, det finns ju gott om sådana...

J.R.
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Användarvisningsbild
Smygis
Inlägg: 849
Blev medlem: 21 jun 2006, 18:41
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS
Ort: Kramfors

SV: Nybörjarfråga om C++

Inlägg av Smygis »

För att slippa det så kan man göra detta i början av filen (efter #include delen)

using namespace std;

Då lever du i namnrymden std.
A Foolish Consistency is the Hobgoblin of Little Minds.Beware: In C++, your friends can see your privates!
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

SV: Nybörjarfråga om C++

Inlägg av Johnny Rosenberg »

He he... läste lite om Namespace i C++ nyss och ser väl nyttan med det hela, men varför nämns inget om detta i enkla exempel som man kan hitta på nätet och i böcker som har till syfte att visa hur saker fungerar? Om man kopierar exemplen och klistrar in dem (eller helt enkelt skriver av dem när det gäller böcker) förväntar man sig ju att det hela åtminstone ska fungera...

Nåja, jag får väl finna mig i detta. I detta exempel behöver man ju bara lägga till en rad för att slippa tillägget std:: i tid och otid. Man vill ju ha det hela så lättläst som möjligt, annars hade man ju hellre programmerat assembler...
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Användarvisningsbild
gasol
Inlägg: 405
Blev medlem: 27 jul 2007, 14:57
Kontakt:

SV: Nybörjarfråga om C++

Inlägg av gasol »

Johnny Rosenberg skrev: He he... läste lite om Namespace i C++ nyss och ser väl nyttan med det hela, men varför nämns inget om detta i enkla exempel som man kan hitta på nätet och i böcker som har till syfte att visa hur saker fungerar? Om man kopierar exemplen och klistrar in dem (eller helt enkelt skriver av dem när det gäller böcker) förväntar man sig ju att det hela åtminstone ska fungera...

Nåja, jag får väl finna mig i detta. I detta exempel behöver man ju bara lägga till en rad för att slippa tillägget std:: i tid och otid. Man vill ju ha det hela så lättläst som möjligt, annars hade man ju hellre programmerat assembler...
Tja namespaces begreppet är väl kanske inte det enklaste att förstå när man sätter sig och skriver sina första rader med kod. Därför brukar alltid alla tutorials för C++ ha med denna rad: using namespace std;.
Det gäller att man förstår lite mer av den objekt orienterade programmeringstypen för att verkligen uppskatta namespaces.
The Black Mountain Scorpion Hoedown Bluegrass Experience Gang
From Left to Right: Wizard on Bicycle, Wizard on Bicycle, Wizard on Bicycle, Wizard on Bicycle, Wizard on Bicycle.
Användarvisningsbild
Luxwarp
Inlägg: 591
Blev medlem: 16 nov 2007, 02:05
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS
Ort: Göteborg
Kontakt:

SV: Nybörjarfråga om C++ [LÖST]

Inlägg av Luxwarp »

Hej Johnny.

<a class="postlink" href="http://www.blinkenlights.se">http://www.blinkenlights.se</a> gå in där och klicka på artiklar och lär dig C++ därifrån,
Det är nog den bästa/lättaste sida, och dom förklarar bra.


Där står oxå en förklaring på varje rad INKLUSIVE

Kod: Markera allt

using namespace std

Lycka till:)
--------------------------------------
Luxwarp (fd. Zifilion / MMCarlsson)

IT Consultant and Web developer.

Check out my blog about Ubuntu, development, tips, tech and all my projects over at https://codeiolo.org
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

SV: Nybörjarfråga om C++ [LÖST]

Inlägg av Johnny Rosenberg »

Stampe skrev: Hej Johnny.

<a class="postlink" href="http://www.blinkenlights.se">http://www.blinkenlights.se</a> gå in där och klicka på artiklar och lär dig C++ därifrån,
Det är nog den bästa/lättaste sida, och dom förklarar bra.


Där står oxå en förklaring på varje rad INKLUSIVE

Kod: Markera allt

using namespace std

Lycka till:)
Tack för tipset. Dock var det ett tag sedan jag skrev till denna tråden och sedan dess har jag köpt en C++-bok på nästan 1200 sidor som jag nu tragglar igenom. Jag var noga med att få senaste upplagan då jag lyckades läsa mig till att det hänt en del med C++ de senaste åren. Men ju fler källor till kunskap, desto bättre bredd i lärandet, så jag ska ta mig en titt på sidan du föreslog också.

Några av de frågor jag ställde i mitt originalinlägg fick jag inget svar på, men exempelvis hur man kompilerar i Emacs lyckades jag hitta på nätet och nu gör jag det hela tiden. Funkar kanon. Har inte testat att avlusa i Emacs än, men det beror mer på att mina programexempel hittills varit så lätta att det inte funnits så mycket som har kunnat gå snett…

Och så frågan om g++ 4.2, med anledning av att jag tydligen har g++ 4.1 installerad: När det gäller Synaptic så får man intrycket att den försöker uppmuntra till installation av 4.1 istället för 4.2. Exempelvis finns en rad där det BARA står g++ och det visar sig vara 4.1, inte 4.2. Dessutom kallar de 4.1 för 4:4.1. Vad betyder "4:" i detta fall?

Och som sagt, "multilib" antyder ju att fler än ett bibliotek ingår, är det först när man installerat det som man får nytta av namespace-möjligheterna?

Om man senare vill programmera med grafiskt gränssnitt, finns det då särskilda bibliotek till detta? Blir man mer kompatibel med alla skrivbordsmiljöer, exempelvis Gnome + KDE + Xtce och så vidare om man använder GTK+? Finns det nackdelar med att skriva en ren GTK+-applikation jämfört med att skriva en ren Gnomeapplikation? Förutom att man måste ha GTK+ installerat för att kunna köra applikationen förstås, om nu det är en nackdel.

Pratar jag helt i nattmössan och blandar ihop äpplen med päron här när jag snackar om GTK+ och Gnome och allt vad det nu är jag vräker ur mig?

Hur som helst så är det roligare att programmera C++ än vad jag kom ihåg att det var när jag försökte lära mig för 15 år sedan… (men det var i värsta vårallergitiderna på våren, så det kan ju vara en orsak till att jag inte orkade engagera mig tillräckligt).

J.R.
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Skriv svar

Återgå till "Programmering och webbdesign"