Forum: Global Struct

Forum huvudsida -> Programmering -> Global Struct

Sidor: 1

Till botten

prog_anton 12:52 - 14:e Oktober 2007 | Post #1
Medlem
Inlägg: 9


Skicka PM
Hejsan!
Jag är en relativt ny programmerare som nyligen inlett arbetet med ett spel. Har dock stött på ett litet problem.
Jag vill skapa en struct med variabler för en hjälte och möjligen också för monstren han möter. Jag vill sedan kunna tilldela värden till dessa variabler i funktionen "creation()" för att de sedan skall kunna användas ute i "world()" funktionen och även i "levelup" funktionen där de skall kunna ändras. ,,r detta möjligt? All hjälp är välkommen.Smiley

Tack på förhand!


  1. #include<iostream> // Bibliotek
  2. #include<ctime> //Bibliotek
  3. #include<windows.h>
  4. #include <stdio.h>
  5. using namespace std;
  6.  
  7. //Hjältens variabler
  8. struct character
  9. {
  10. string namn;
  11. int HP;
  12. int MDMG;
  13. int LDMG;
  14. int EXP;
  15.  
  16. }
  17.  
  18. ;
  19.  
  20.  
  21. //Funktioner
  22. int main();
  23. int huvudmeny();
  24. int creation();
  25. int world();
  26.  
  27.  
  28.  
  29.  
  30. //Skapa sin hjälte funktionen
  31. int creation()
  32. {
  33. struct character man;
  34. man.HP = 4;
  35. man.MDMG = 3;
  36. man.LDMG = 1;
  37. man.EXP = 0;
  38. string attr;
  39. int points;
  40. int iTmp;
  41. points = 3;


Jag valde att inte ta med hela källkoden för att spara rum men vill någon se allt så säg bara till. Smiley

-------------------------
"...There is only do"



Slash 14:05 - 14:e Oktober 2007 | Post #2
Medlem
Inlägg: 141


Skicka PM
Det finns ganska många sätt att lösa detta på. Ser ut som att du kodar C++ så jag anpassar det till det, men lösning ett och två går att skriva om till C utan större problem.

1a)
Med hjälp av pekare så kan det se ut så här:
  1. struct character {
  2. string name;
  3. // osv
  4. };
  5.  
  6. int creation(character *man) {
  7. // Fyll i uppgifterna på objektet genom pekaren, operatorn -> används för att komma åt medlemmar hos en pekare till en struct.
  8. man->name = "bosse";
  9. }
  10.  
  11.  
  12. int main()
  13. {
  14. character c;
  15. creation(&c); // &-operatorn tar adressen till c
  16.  
  17. // c har nu bosse som namn
  18. }


1b)
Med en referens så kan du få det att se lite finare ut (bara C++)
  1. struct character {
  2. string name;
  3. // osv
  4. };
  5.  
  6. int creation(character &man) {
  7. // Fyll i uppgifterna på objektet genom referensen operatorn -> behövs inte längre
  8. man.name = "bosse";
  9. }
  10.  
  11.  
  12. int main()
  13. {
  14. character c;
  15. creation(c); // &-operatorn behövs inte längre
  16.  
  17. // c har nu bosse som namn
  18. }


2)
Eftersom du ska skapa en så kan du göra en create-funktion

  1. struct character {
  2. string name;
  3. // osv
  4. };
  5.  
  6. // Returnerar en karaktär med namnet i name
  7. character* createCharacter(string name) {
  8. // Skapa karaktären
  9. character *c = new character; // C++-sättet att allokera minne, använd malloc för C
  10. c->name = name;
  11. return c;
  12. }
  13.  
  14. // Nackdelen är att du måste lämna tillbaka minnet
  15. void deleteCharacter(character *c) {
  16. delete c;
  17. }
  18.  
  19. int main()
  20. {
  21. character *man = createCharacter("bosse");
  22. // man->name; innehåller alltså bosse nu
  23.  
  24. deleteCharacter(man);
  25. }


3)
Det här sättet är det som jag rekommenderar: använd klasser!
  1. class Character {
  2. public:
  3. Character(string charaName) {
  4. name = charaName;
  5. }
  6.  
  7. string getName() {
  8. return name;
  9. }
  10. private:
  11. string name;
  12. };
  13.  
  14.  
  15. int main()
  16. {
  17. Character man("bosse");
  18.  
  19. man.getName(); // Returnerar nu "bosse"
  20. }


Hmm kanske blev lite för många val, men fråga om det är något som är oklartSmiley

EDIT: Om du jättegärna vill kan du ju göra en global variabel. Men det är inte nånting som i allmänhet rekommenderas. Det är bara så här:

  1. struct character {
  2. // Habla
  3. };
  4.  
  5. character man;
  6.  
  7. int creation()
  8. {
  9. man.name = "bosse";
  10. }
  11.  
  12. int main()
  13. {
  14. creation();
  15. man.name; // innehåller "bosse"
  16. }

Men som du ser så är det inte speciellt tydligt vad som händer. Finns inget sätt att se att creation på något vis påverkar variabeln man, vilket gör att man måste läsa varenda funktion i ditt program för att se vad som verkligen pågår.

-------------------------
Ingen sigantur!

Senast redigerad 14:12 - 14:e Oktober 2007


prog_anton 14:16 - 14:e Oktober 2007 | Post #3
Medlem
Inlägg: 9


Skicka PM
Tack så mycket, trevligt att jag fick så många alternativ av digSmiley. Jag ska testa det du sagt och se, jag hör av mig när jag löst det eller om jag inte lyckas. Tack igenSmiley

-------------------------
"...There is only do"



prog_anton 17:30 - 14:e Oktober 2007 | Post #4
Medlem
Inlägg: 9


Skicka PM
Hej igen!

Har kollat igenom dina förslag och följt ditt råd med att använda klasser. Har dock två frågor till. Jag valde att låta användaren namnge karaktären själv, vilket han/hon skall göra i spelet. Detta funkade bra i main men när jag prövade att kalla på namnet igen i test funktionen så uppstod kompileringsfel. Hur kan jag lösa detta? Jag undrar också hur jag gör för att inkludera fler variabler i min klass. Anar hur jag kanske bör göra men aldrig fel att fråga så man gör det mest effektivaSmiley. Tack igen.


  1. #include<iostream>
  2.  
  3. using namespace std;
  4.  
  5. class Character
  6. {
  7. public:
  8. Character(string charaName)
  9. {
  10. name = charaName;
  11.  
  12. }
  13.  
  14. string getName()
  15. {
  16. return name;
  17. }
  18.  
  19. private:
  20. string name;
  21. };
  22.  
  23. int test();
  24.  
  25.  
  26.  
  27.  
  28.  
  29. int main()
  30. {
  31. bool main = true;
  32. int iTmp;
  33. string namn;
  34.  
  35. cin >> namn;
  36.  
  37. Character man(namn);
  38.  
  39. man.getName();
  40. cout <<man.getName();
  41. cin.get();
  42. cin.get();
  43.  
  44. main = false;
  45.  
  46. iTmp = test();
  47.  
  48. return 0;
  49. }
  50. int test()
  51. {
  52. Character man(namn);
  53. man.getName();
  54. cout << "Hello" << man.getName();
  55. cin.get();
  56. cin.get();
  57. }



Kompileringsfel: rad 52 "Character man(namn);" Namn undeclared.

-------------------------
"...There is only do"



Slash 19:02 - 14:e Oktober 2007 | Post #5
Medlem
Inlägg: 141


Skicka PM
Ja, du kan inte komma åt variabler hur som helst mellan funktioner. När du skapar ''man'' i main så måste du använda just den sen även på andra ställen, annars blir det en helt nytt och orelaterat objekt. Det smidigaste i det här fallet är att skicka med den som en referens:

  1. class Character
  2. {
  3. public:
  4. // osv
  5.  
  6. private:
  7. // osv
  8. };
  9.  
  10. int main()
  11. {
  12. string namn;
  13. cin >> namn;
  14. //osv
  15. Character man(namn); // Skapar objektet
  16.  
  17. test(man);
  18. }
  19.  
  20. int test(Character &c)
  21. {
  22. // c är nu en referens till just det objekt du skapade i main()
  23. cout << "Hello " << c.getName() << endl;
  24. }


Jag vet inte hur van du är med programmering. Men om klasser känns väldigt främmande kanske du ska börja med globala variabler och så för att få in känslan. Och först sen gå över till klasser när du insett hur osmidigt globala variabler kan bli efter ett tag.

-------------------------
Ingen sigantur!

Senast redigerad 19:03 - 14:e Oktober 2007


prog_anton 19:36 - 14:e Oktober 2007 | Post #6
Medlem
Inlägg: 9


Skicka PM
Du har säkert rätt. Jag går just nu prog. kurs A och har inte mycket erfarenhet. Det som är dumt är att jag sprungit lite långt fram och min lärare är inte så engagerad i att hjälpa till. Har också fått lite problem med fstream i avancerad kurs. tror det kan bero på att jag har dev-cpp men jag vet inte. Har liksom haft en tendens att ta mig vatten över huvudet. Men det är bara för att detta är så kul. Tack för all hjälpSmiley

-------------------------
"...There is only do"



Sidor: 1

Forum huvudsida -> Programmering -> Global Struct
Atom feed

Du får inte posta i den här tråden | Till toppen