Just nu i M3-nätverket
Gå till innehåll

Vektorer och funktionsanrop i c++


*Chris*

Rekommendera Poster

Hej!

Jag ska bygga en liten frågesport i c++ hade jag tänkt :) Problemet är att jag har en funktion som ska "ladda" de vektorer som ska innehålla all information. Jag vet inte riktigt hur jag ska skicka vektorerna och få dem fyllda. Se mitt försök nedan och tipsa gärnad vart jag tänker fel.

 

 

 

#include <iostream>
#include <cstdlib>
#include <iomanip>
#include <string>
#include "unistd.h"

using std::cout;
using std::cin;
using std::endl;

void fyll(char lander[5],char huvud[5])
    {
             char lander[5] = {"Sverige", "Norge", "Finland", "Danmark", "Island"};  // alla länder
             char huvud[5] = {"Stockholm", "Oslo", "Helsingfors", "Köpenhamn", "Reykjavik"}; // alla huvudstäder
    }

int main()
{
   char lander[5];
   char huvud[5];


   system("clear");

   fyll(lander, huvud);
   cout<<lander[2]<<huvud[2]<<endl;

   return 0;
}

 

Länk till kommentar
Dela på andra webbplatser

Eftersom du vill skriva det i C++ föreslår jag att du på en gång lär dig använda "string" och "vector". Ta en titt på följande exempel:

 

#include <vector>
#include <string>
#include <iostream>

using namespace std;

int main()
{
 vector<string> huvud;
 huvud.push_back("Stockholm");
 huvud.push_back("Oslo");
 huvud.push_back("Helsingfors");

 cout << huvud[2] << endl;

 vector<string>::iterator iter, end = huvud.end();
 for(iter = huvud.begin(); iter != end; ++iter)
   {
     cout << *iter << endl;
   }

 return 0;
}

 

 

Du kan försöka modifiera denna kod själv så att du får en funktion som "laddar" vektorn med sina rätta värden.

 

[inlägget ändrat 2006-11-29 20:32:20 av lizardKng]

Länk till kommentar
Dela på andra webbplatser

hm...push_bback, vad är det?

Du skulle inte kunna förklara det jag försöker göra? Varför fungerar inte det jag skrev? Vad gör jag för fel?

 

Länk till kommentar
Dela på andra webbplatser

push_back betyder att man lägger in ett nytt element i slutet av vektorn.

 

I ditt exempel ska det t ex vara char* lander[] = { "a", "b", ...} eftersom det är en array av pekare till tecken. Dessutom ska funktionens argument inte deklareras om inuti funktionen.

 

Men som sagt, medd C++ finns det ingen egentlig anledning att trixa med char-arrayer på det viset. Det är bara dumt att hålla fast vid gammal C-syntax (om man nu inte har speciell anledning att göra det). Bättre att lära sig saker som det ska vara på en gång.

 

Länk till kommentar
Dela på andra webbplatser

Nu har jag fixat till det efter vad du beskrev, men jag får felmeddelande:"declaration of 'char*huvud[]' shadows a parameter" och samma för lander...vad är fel?

 

kod nu:

 

#include <iostream>
#include <cstdlib>
#include <iomanip>
#include <string>
#include "unistd.h"

using std::cout;
using std::cin;
using std::endl;

void fyll(char lander[],char huvud[])
    {
             char* lander[] = {"Sverige", "Norge", "Finland", "Danmark", "Island"};  // alla länder
             char* huvud[] = {"Stockholm", "Oslo", "Helsingfors", "Köpenhamn", "Reykjavik"}; // alla huvudstäder
    }

int main()
{
   char lander[5];
   char huvud[5];


   system("clear");

   fyll(lander, huvud);
   cout<<lander[2]<<huvud[2]<<endl;

   return 0;
}

 

Länk till kommentar
Dela på andra webbplatser

Nu har jag inte konverterat allt men du förstår säkert mönstret.

 

Den initiering du försökte göra kan man bara göra vid deklaration av en variabel, istället får du göra så här. Jag rensade också bort onöda inkluderingar eftersom du inte vill använda t ex de färdiga strängar som finns.

 

Dock är jag lite osäker på var i minnet strängarna läggs ut. Kanske det är "tur" att detta ser ut att fungera...

 

#include <iostream>

using namespace std;

void fyll(char *lander[])
{
 lander[0] = "Sverige";
 lander[1] = "Norge";
}

int main()
{
 char *lander[5];
 char *huvud[5];


 fyll(lander);
 cout << lander[1] << endl;

 return 0;
}

 

 

Länk till kommentar
Dela på andra webbplatser

Tackar, jag ska testa det när jag kommer till en riktig dator :)

 

char *lander? Vad gör stjärnan? är inte det för att göra en pekare? Är det nödvändigt att fylla dem 1 och 1, kan man inte göra en sån lista som jag hade från början {"tal","tal","lal"...}?

 

 

Länk till kommentar
Dela på andra webbplatser

Vanligtvis gör man så här:

 

char c = ett tecken.

char c[] = en array av tecken.

char* s= en pekare till ett tecken, används för att symbolisera en sträng, d v s man pekar ut strängens första tecken.

 

Ska vi då ha en array med strängar blir det

 

char* s[] där char* säger att det är en sträng och [] att det är en array av strängar.

 

På C:s lite lustiga vis går det ungefär lika bra att säga

 

char** stringArray;

 

som

 

char* stringArray[];

 

Att initiera en array med { 1, 2, 3 } kan man bara göra när man deklarerar den, inte efteråt.

 

Det finns ett mellanting mellan array och vector som heter valarray, jag vet inte om det kanske skulle vara användbart i det här fallet.

 

Men jag tycker i alla fall att du ska ge dig på de vektorer och strängar som finns som standard i C++!

 

Länk till kommentar
Dela på andra webbplatser

Nu börjar jag få fart på det här :)

 

Nu har jag ett annat litet problem, nu är det cin.getline som spökar, jag tror att jag gör något fel där... Den går igenom kompileringen utan fel, men minnet dumpas när man kör.

 

Kod:

 

#include <iostream>
#include <cstdlib>
#include <iomanip>
#include <string>
#include "unistd.h"

using namespace std;

using std::cout;
using std::cin;
using std::endl;

//fyll på med länder och huvudstäder
void fyll(char *lander[], char *huvud[])
    {
              lander[0] = "Sverige";
              lander[1] = "Norge";
              lander[2] = "Finland";       //alla länder
              lander[3] = "Danmark";
              lander[4] = "Island";

              huvud[0] = "Stockholm";
              huvud[1] = "Oslo";
              huvud[2] = "Helsingfors";      //alla huvudstäder
              huvud[3] = "Köpenhamn";
              huvud[4] = "Reykjavik";
    }

void hemligt_tal_funktion (int &hemligt_tal)
    {
                srand(time(0));
                hemligt_tal = rand() % 5;
    }

void get_answer (char *lander[], char *svar[], int hemligt_tal)
    {
               cout<< "                           *Huvudstadsgeografi*"<< endl;
     cout<< "*                                                                              *";
     cout<< "********************************************************************************";
     cout<< "*        Om du vill avsluta tryck (A), om du vill veta svaret tryck (x)        *";
     cout<< "********************************************************************************";
     cout<<"            *Observera att första bokstaven i namnet ska vara stor*"<< endl;
     cout<<"             *****************************************************"<< endl<< endl;


     cout<< "Vad heter huvudstaden i "<< lander[hemligt_tal]<< "?: ";
     cin.getline(svar[0], 50); //Här tror jag det är fel...

    }

int main()
{
   char *lander[5];
   char *huvud[5];
   char *svar[50];
   int hemligt_tal;


   system("clear");

   fyll(lander, huvud);
   hemligt_tal_funktion(hemligt_tal);
   get_answer(lander, svar, hemligt_tal); //eller här
   cout<<svar[0]; //eller här

   return 0;
}

 

[inlägget ändrat 2006-11-30 18:37:15 av *Chris*]

Länk till kommentar
Dela på andra webbplatser

nu börjar jag se hur du vill ha den :P jag tycker din e krånglig, så här skulle jag ha gjort^^

 

#include <iostream.h>
#include <conio.h>
#include <stdio.h>

void main() {
clrscr();
char lander[15];
char huvud[15];
char svar[15]
int slump;
randomize();
// Länder
lander[0] = "Sverige";
lander[1] = "Norge";
lander[2] = "Finland"; //alla länder
lander[3] = "Danmark";
lander[4] = "Island";
// Huvudstäder
huvud[0] = "Stockholm";
huvud[1] = "Oslo";
huvud[2] = "Helsingfors"; //alla huvudstäder
huvud[3] = "Köpenhamn";
huvud[4] = "Reykjavik";

slump = rand() % 5;
cout<< " *Huvudstadsgeografi*"<< endl;
cout<< "Vad heter huvudstaden i "<< lander[slump]<< "?: ";cin>>svar;
if (stricmp(huvud[slump],svar) == 0) {
cout<< "rätt!"
}
getch();
}

 

Länk till kommentar
Dela på andra webbplatser

Det där funkar inte, lander[0] t ex är av typen char, där kan du inte lägga in en sträng.

 

Ska du dessutom inte fylla upp arrayerna i en funktion som *Chris* vill göra ska man naturligtvis använda sig av snabbvarianten för initiering, t ex:

 

char* lander[] = {"Sverige", "Norge", ...};

 

Länk till kommentar
Dela på andra webbplatser

oh ok sry, har inte fått lära mig arrays i c++ än, men jag trodde man kunde göra så eftersom man kan göra det i javascript.

 

Länk till kommentar
Dela på andra webbplatser

Hello codler, det där var väldigt olikt det jag skrev, men det finns säkert många lösningar på ett problem. Jag vill dock skriva mitt program med funktioner för jag tycker det ger en bra överblick.

 

lizardking, hur ska jag då göra för att få in det svar jag vill ha av användaren?

 

Länk till kommentar
Dela på andra webbplatser

Javascript och C++ skiljer sig åt mer än man kan tro.

 

Själv tycker jag dock man ska använda sig av vector och string i C++, se mitt tidigare exempel.

 

Länk till kommentar
Dela på andra webbplatser

Ändra först deklarationen av svar till

 

char svar[50];

 

När du sedan läser in ett svar eller skriver ut svaret skriver du bara svar, inte svar[0].

 

svar[0] är nämligen endast det första tecknet.

 

Jag har tyvärr inte tid att testa just nu att det inte är något mer som behövs men imorgon kanske.

 

Länk till kommentar
Dela på andra webbplatser

Tack så mycket, nu funkar det :)

 

Kommer nog att köra fast senare med, det är jättebra att få hjälp såhär. Tack!

 

Hur kommer det sig att jag deklarerar lander och huvud till char * och svar till char? Vad är skillnaden och när ska man använda respektive? Känns som att char * är flera ord och att [] anger ordets position, till skillnad från char där [] anger bokstavens position, är jag helt ute och cyklar?

 

Länk till kommentar
Dela på andra webbplatser

Läste du det jag skrev 16.09 igår?

 

//eforum.idg.se/viewmsg.asp?EntriesId=890885#891154

 

Tillägg till det:

 

Det räcker inte med en char*, denna måste dessutom peka på ett ledigt utrymme i datorn. Med char[50] skapas ett ledigt utrymme att skriva in svaret på. Med

 

char* s1 = "hej hopp";

 

skapas en pekare som pekar på strängen "hej hopp". Ett ytterligare alternativ är

 

char[] s2 = "hej hopp";

 

De två sista är snarlika men i det sista fallet kan man ändra på innehållet, det kan man inte i det första. Det har att göra med hur kompilatorn är tillsagd att fungera. Med

 

char* s;

 

skapas bara en pekare men den har inget att peka på.

 

Pekararitmetik och indexering med [] är på många sätt likvärdiga. T ex så kommer, i exemplen ovan, både s1+2 och &s2[2] att peka ut samma plats i strängen, *(s1+2) och s2[2] är båda bokstaven 'e'.

 

 

[inlägget ändrat 2006-12-01 06:13:06 av lizardKng]

Länk till kommentar
Dela på andra webbplatser

Jodå jag läste det och nu har jag läst det igen, vara bara helt glömsk i huvudet :)

 

Nu går det rätt bra, får ett kompileringsfel på en fördeklarerad funktion som jag inte förstår varför...ser ut såhär:

 

void hemligt_tal_funktion (int, char*, char);

 

void hemligt_tal_funktion (int &hemligt_tal, char *lander[], char svar[])
    {
                srand(time(0));
                hemligt_tal = rand() % 5;
                get_answer(lander, svar, hemligt_tal);
    }

 

"cannot convert char** to char* for argument 1" säger den, jag tycker det ser rätt ut, men nåt är ju galet..?

 

Länk till kommentar
Dela på andra webbplatser

void hemligt_tal_funktion (int, char*, char);

void hemligt_tal_funktion (int &hemligt_tal, char *lander[], char svar[])

 

De ser väl inte speciellt lika ut, eller hur? ;)

 

Ta bart namnet på argumentet:

 

void hemligt_tal_funktion (int &, char *[], char [])

 

Då kanske det är mer uppenbart?

 

OK, inte helt, char*[] går kanske inte så bra, man får skriva char** istället. Men första och sista argumenten borde du kunna fixa nu.

 

 

Länk till kommentar
Dela på andra webbplatser

Menar du såhär?

 

void hemligt_tal_funktion (int &, char **, char []);

 

Det ser ju helt knäppt ut :)

 

Länk till kommentar
Dela på andra webbplatser

Desvärre fungerade det inte...

 

Hela koden:

 

#include <iostream>
#include <cstdlib>
#include <iomanip>
#include <string>
#include "unistd.h"

using namespace std;

using std::cout;
using std::cin;
using std::endl;

void fyll(char*, char*);
void hemligt_tal_funktion (int &, char **, char []); [color="#ff0000"]//Här klagar den[/color]
void get_answer (char*, char, int);

//fyll på med länder och huvudstäder
void fyll(char *lander[], char *huvud[])
    {
              lander[0] = "Sverige";
              lander[1] = "Norge";
              lander[2] = "Finland";       //alla länder
              lander[3] = "Danmark";
              lander[4] = "Island";

              huvud[0] = "Stockholm";
              huvud[1] = "Oslo";
              huvud[2] = "Helsingfors";      //alla huvudstäder
              huvud[3] = "Köpenhamn";
              huvud[4] = "Reykjavik";
    }

void hemligt_tal_funktion (int &hemligt_tal, char *lander[], char svar[])
    {
                srand(time(0));
                hemligt_tal = rand() % 5;
                get_answer(lander, svar, hemligt_tal);
    }

void get_answer (char *lander[], char svar[], int hemligt_tal)
    {
               cout<< "                           *Huvudstadsgeografi*"<< endl;
     cout<< "*                                                                              *";
     cout<< "********************************************************************************";
     cout<< "*        Om du vill avsluta tryck (A), om du vill veta svaret tryck (x)        *";
     cout<< "********************************************************************************";
     cout<<"            *Observera att första bokstaven i namnet ska vara stor*"<< endl;
     cout<<"             *****************************************************"<< endl<< endl;


     cout<< "Vad heter huvudstaden i "<< lander[hemligt_tal]<< "?: ";
     cin.getline(svar, 50);

    }

int main()
{
   char *lander[5];
   char *huvud[5];
   char svar[50];
   int hemligt_tal;
   char veta_svar_litetx[10]="x";
   char veta_svar_stortx[10]="X";
   char avsluta[10]="A";


   system("clear");

   fyll(lander, huvud);
   hemligt_tal_funktion(hemligt_tal, lander, svar);

   if(strcmp(svar, veta_svar_litetx) == 0 || strcmp(svar, veta_svar_stortx) == 0)
      {
                     cout<<endl<< "Huvudstaden i "<< lander[hemligt_tal]<< " heter "<< huvud[hemligt_tal]<< endl;
                     sleep(2);
                     hemligt_tal_funktion(hemligt_tal, lander, svar);

      }

     else if(strcmp(svar, avsluta) == 0)
      {
                          cout<< endl<< "Tack för att du spelade!";
      }


   return 0;
}

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...