Gå til innhold

Bone's Offisielle C++ hjelpetråd


Anbefalte innlegg

Videoannonse
Annonse

sleep(0); // thread yield

 

:\ Dette hjelper ikke på 100% CPU-bruk. Er som regel en form for blocking synkronisering man kan vente på. VBlank, events, etc. Sleeping er aller siste utvei.

Ihvertfall Sleep under Windows har denne kjekke saken:

 

A value of zero causes the thread to relinquish the remainder of its time slice to any other thread that is ready to run. If there are no other threads ready to run, the function returns immediately, and the thread continues execution.

Som er akkurat det som er interessant. Hvis det er lite å gjøre, for eksempel en tom scene, så vil CPU-bruken falle til 0%.

 

Hvis sleep ikke gjør dette under Linux, så kan det være lurt å bruke sched_yield istedet.

Lenke til kommentar
  • 3 uker senere...

Dette er egentlig et C-spørsmål, men tror ikke jeg blir slaktet for å spørre her :)

Har gått gjennom litt tutorials nå, men sitter fast her:

int main(void)
{
int num;
printf("Enter any number\n");
scanf("%d", &num);
printf("%d is your number", &num);

getch();
}

Uansett hvilket tall jeg setter inn blir resultatet: "2686788 is your number". Ser ikke selv hvor problemet ligger og håer noen kan gi meg et svar :D

Lenke til kommentar

Ta en ekstra titt på denne linjen ;)

 

printf("%d is your number", &num);

 

EDIT: Du tar adressen til num ved å sette & foran.

Du ønsker naturlig nok ikke å gjøre dette når du skal hente ut inneholdet i num, snarere enn å fortelle en annen funksjon hvor den kan finne num.

Endret av ze5400
  • Liker 2
Lenke til kommentar
  • 1 måned senere...

Jeg har en header fil som brukes til sockets vha. SFML.

 

Dersom jeg endrer rekkefølgen på deklerasjonene, så slutter alt å fungere. Hvorfor?

 

Versjon 1 fungerer, versjon 2 kjører uten feil men kan ikke sende eller motta pakker, versjon 3 gir en Memory Access reading violation.

 

Det eneste jeg gjør er å flytte på linja:

sf::SocketTCP Client;

 

Koden er veldig rotete beklager det, fant denne feilen når jeg skulle rydde i koden, og endra på rekkefølgen i fila og fjernet noen variabler jeg kun brukte for å finne ut av ting, og plutselig fungerte ingenting lengre.

 

Har også inkludert en versjon 4, som er min "oppryddede" versjon av koden, dersom det skulle være interessant å se hva jeg faktisk bruker i filen.

 

Fungerer:

 

 

//============================================================================= 
#ifndef _CCLIENT_H_ 
   #define _CCLIENT_H_ 

#include <SFML/Network.hpp> 
#include <string> 
#include "CEntity.h" 

//============================================================================= 
class CClient{ 
   public: 
     struct Playern 
{ 
  int      PID; 
  int      X; 
   int      Y; 
  int      Dead; 
}; 
     // Packet content 
  int packetID; 
  int entityID; 
  int playerID; 
  int command; 
  // --------------- 
  sf::SelectorTCP selector; 
  sf::SocketTCP Socket; 
     unsigned int NbSockets; 
     CClient(); 
     int targX; 
     int targY; 
     void Connect(); 
       void RunClient(); 
     void setMyID(int id); 
     int getMyID(); 
     void SendPacket(int packetID, int entityID, int playerID, int command); 
     void SendPacket(int packetID, int entityID, int playerID, int command, int tarX, int tarY); 
     sf::Packet ReSend; 
     std::string ty; 
     sf::IPAddress ServerAddress; 
     std::string inString; 
     sf::Packet ToSend; 
     std::string s; 
     sf::Packet onConnect; 
     static int myID; 
     bool connected; 
     Playern P; 
sf::SocketTCP Client; 
public: 
}; 

//============================================================================= 

#endif

 

 

 

Fungerer ikke, gir ingen error, bare kan ikke sende pakker:

 

 

//============================================================================= 
#ifndef _CCLIENT_H_ 
   #define _CCLIENT_H_ 

#include <SFML/Network.hpp> 
#include <string> 
#include "CEntity.h" 

//============================================================================= 
class CClient{ 
   public: 
     struct Playern 
{ 
  int      PID; 
  int      X; 
   int      Y; 
  int      Dead; 
}; 
     // Packet content 
  int packetID; 
  int entityID; 
  int playerID; 
  int command; 
  // --------------- 
  sf::SelectorTCP selector; 
  sf::SocketTCP Socket; 
     unsigned int NbSockets; 
     CClient(); 
     int targX; 
     int targY; 
     void Connect(); 
       void RunClient(); 
     void setMyID(int id); 
     int getMyID(); 
     void SendPacket(int packetID, int entityID, int playerID, int command); 
     void SendPacket(int packetID, int entityID, int playerID, int command, int tarX, int tarY); 
     sf::Packet ReSend; 
     std::string ty; 
     sf::IPAddress ServerAddress; 
     std::string inString; 
     sf::Packet ToSend; 
     std::string s; 
     sf::Packet onConnect; 
     static int myID; 
     bool connected; 
sf::SocketTCP Client; 
     Playern P; 
public: 
}; 

//============================================================================= 

#endif

 

 

 

Memory access reading violation:

 

 

//============================================================================= 
#ifndef _CCLIENT_H_ 
   #define _CCLIENT_H_ 

#include <SFML/Network.hpp> 
#include <string> 
#include "CEntity.h" 

//============================================================================= 
class CClient{ 
   public: 
     struct Playern 
{ 
  int      PID; 
  int      X; 
   int      Y; 
  int      Dead; 
}; 
     // Packet content 
  int packetID; 
  int entityID; 
  int playerID; 
  int command; 
  // --------------- 
  sf::SelectorTCP selector; 
  sf::SocketTCP Socket; 
     unsigned int NbSockets; 
     CClient(); 
     int targX; 
     int targY; 
sf::SocketTCP Client; 
     void Connect(); 
       void RunClient(); 
     void setMyID(int id); 
     int getMyID(); 
     void SendPacket(int packetID, int entityID, int playerID, int command); 
     void SendPacket(int packetID, int entityID, int playerID, int command, int tarX, int tarY); 
     sf::Packet ReSend; 
     std::string ty; 
     sf::IPAddress ServerAddress; 
     std::string inString; 
     sf::Packet ToSend; 
     std::string s; 
     sf::Packet onConnect; 
     static int myID; 
     bool connected; 
     Playern P; 
public: 
}; 

//============================================================================= 

#endif

 

 

 

Versjon 4, oppryddet med kommentarer, gir memory access reading violation:

 

 

//============================================================================= 
#ifndef _CCLIENT_H_ 
   #define _CCLIENT_H_ 

#include <SFML/Network.hpp> 
#include <string> 
#include "CEntity.h" 

//============================================================================= 
class CClient{ 
public: 

  // Packet content 
  int packetID;   // What type of packet. 
  int entityID;   // EntityID, currently unused. 
  int playerID;   // PlayerID, which player the command is for. 
  int command;   // What command was issued. Move left, cast spell, etc. 

  sf::SelectorTCP selector;      // Selector, used to add a timeout on the recieve to not cause blocking. 
  unsigned int NbSockets;         // Used by the Selector. 

  CClient();                  // Constructor. 

  // Projectile packets only. 
  int targX;      // Target X coordinate for projectiles. 
  int targY;      // Target Y coordinate for projectiles. 
  // --------------- 


  sf::SocketTCP Client;         // The socket used to communicate. 

   void RunClient();            // Runs in the gameLoop, gets incoming packets. 

  // Send packet function for normal commands.    
  void SendPacket(int packetID, int entityID, int playerID, int command); 

  // Send projectile packet function. 
  void SendPacket(int packetID, int entityID, int playerID, int command, int tarX, int tarY); 

  sf::Packet ReSend;         // Packet used when receiving packets. 

  sf::IPAddress ServerAddress;   // IP Address to connect to. 
  sf::Packet ToSend;            // Packet used when sending packets. 
  void Connect();               // Connect function. Sets up connection. 
  sf::Packet onConnect;         // Packet used when receiving info on connect. 
  static int myID;            // ID of your character. 
  bool connected;               // Connected to the server if true. 

private: 

}; 

//============================================================================= 

#endif

 

 

Lenke til kommentar
  • 1 måned senere...

Hei. Jeg har lyst å lære C++ men jeg er helt grønn...skikkelig grønn. Jeg har minimal erfaring med ting som HTML og LUA, men jeg ønsker å finne ut om noen vet om en bok som kan lære meg C++ i nær babyspråk slik at jeg kan forstå meningen med tingene jeg lærer.

De fleste programmeringsbøkene jeg har sett kaster deg rett inn i programmeringa, uten å egentlig f.eks forklare hva en array er eller hva den gjør, eller hvordan den skal kunne kombineres i programeringen. Finnes det noen skikkelig bra nybegynnerbøker der ute for folk som aldri har rørt programmering?..eller artikkler?

 

send meg gjerne en e-post på boolsen @online.no hvis dere vet om noe.

 

på forhånd takk.

 

mvh

 

Bård

Lenke til kommentar

Lurer på hvorfor denne kodesnutten printer ut. (...)

 

Istedenfor. (...)

 

Fordi du ikke poster det minste komplette eksempelet som illustrerer problemet.

 

Spøk til side[1], fordi det er slik formatted I/O virker. ' ' virker som separator for det som er std::string. Hvis du vil plukke en og en linje av gangen, bruk std::getline(). Hvis du vil lese inn ett og ett ord av gangen, bruk gjerne operator>>(), men da med de begrensningene som gjelder.

 

[1] Antagelsen her er at String har typen std::string og at du skriver "this is a test! /exit" før du trykker på hva som nå enn er "enter"-tasten i terminalen din.

Lenke til kommentar

Lurer på hvorfor denne kodesnutten printer ut. (...)

 

Istedenfor. (...)

 

Fordi du ikke poster det minste komplette eksempelet som illustrerer problemet.

 

Spøk til side[1], fordi det er slik formatted I/O virker. ' ' virker som separator for det som er std::string. Hvis du vil plukke en og en linje av gangen, bruk std::getline(). Hvis du vil lese inn ett og ett ord av gangen, bruk gjerne operator>>(), men da med de begrensningene som gjelder.

 

[1] Antagelsen her er at String har typen std::string og at du skriver "this is a test! /exit" før du trykker på hva som nå enn er "enter"-tasten i terminalen din.

 

#include <iostream>
#include <string.h>
#include <string>
#include <map>

using namespace std;

int main() {

//typedef std::map <std::string, int> MapType;
  // MapType data;


int exit = 0;
   std::string String;

cout<<"hello"<<endl;

while(exit==0) {

std::getline(String);
cout<<"you entered: "<<String<<endl;


if(String=="/exit") {exit = 1;}

} 

return 0;
}

 

Er bare et program jeg skrev for å lære hvordan strings fungerer i c++ da jeg er vant med en helt annen syntax på d! :p Den skal bare gjenta det jeg skriver, og så hvis jeg skriver /exit skal den stoppe programmet!

Lenke til kommentar

Er bare et program jeg skrev for å lære hvordan strings fungerer i c++ da jeg er vant med en helt annen syntax på d! :p Den skal bare gjenta det jeg skriver, og så hvis jeg skriver /exit skal den stoppe programmet!

 

Ja, og forklaringen på min gjetting stemmer med virkeligheten. En noe forenklet variant er da:

 

#include <iostream>
#include <string>

int main() 
{
   std::string String;

   std::cout<<"hello\n";

   while ( std::getline(std::cin, String) ) {
       if ( String == "/exit" )
           break ;

       std::cout<< "you entered: " << String << "\n";
   }

   return 0;
}

Lenke til kommentar

Jess, tusen takk, nå funker det!

 

Bonus/forståelsesspørsmål -- hvorfor tester man returverdien fra std::getline() i while?

 

Man tester den i while for det er en bedre måte å kjøre programmet flere ganger enn goto? :p

 

Er litt stuck igjen, trenger en funksjon som tilsvarer lua/e2s Array = String:explode(String) funksjon.

Altså en funksjon som splitter en string til en array basert på en seperasjons string.

eks: S = "Dette er en test" kjørt gjennom funksjonen Array = S:explode(" ") blir til Array(Dette,er,en,test). Har prøvd strtok, men den trenger en char string og får den ikke helt til å fungere..

 

#include <iostream>
#include <string.h>
#include <string>
#include <map>

using namespace std;

int main() {

typedef map <string, int> MapType;
   MapType data;
char * explode;

int i;
int exit = 0;
   string String;
char * String2;

cout<<"hello"<<endl;

while(exit==0) {

//aktiverer den første stringen
getline(cin,String);
//aktiverer samme greia, men som en char string
cin.getline(String2,String.length());
//returnerer den første stringen
cout<<"you entered: "<<String<<endl;
//kaboom, splitter stringen til en array basert på hvert ord, denne funksjonen funker ikke helt..
explode = strtok(String2," ");
//looper igjennom arrayen fra forrige funksjon for å teste om det funker
for(i=0; i<strlen(explode); i++) {
cout<<explode[i]<<endl;
}

if(String=="/exit") {exit = 1;}

} 

return 0;
}

Lenke til kommentar

Bonus/forståelsesspørsmål -- hvorfor tester man returverdien fra std::getline() i while?

 

Man tester den i while for det er en bedre måte å kjøre programmet flere ganger enn goto? :p

 

Nei (testen ville ha vært den samme med goto).

 

Er litt stuck igjen, trenger en funksjon som tilsvarer lua/e2s Array = String:explode(String) funksjon.

Altså en funksjon som splitter en string til en array basert på en seperasjons string.

 

boost::split() ? Evt. mekke en enkel variant av den selv basert på std::string::find_first_of() og venner.

 

Har prøvd strtok, men den trenger en char string og får den ikke helt til å fungere..

 

strtok er rimelig ond. Verdisemantikk er ganske mye mer behagelig å jobbe med.

 

Et par rettelser:

 

using namespace std;

 

Ikke i et globalt navnerom.

 

while(exit==0) {

 

Det er tøysete bruk av statusvariable. Du har break til rådighet.

 

       //aktiverer den første stringen
getline(cin,String);

 

... og tøysete kommentarer kan man med hell droppe.

 

//aktiverer samme greia, men som en char string
cin.getline(String2,String.length());

 

Dumt å ikke teste hvorvidt innlesingen lyktes.

 

//returnerer den første stringen
cout<<"you entered: "<<String<<endl;
//kaboom, splitter stringen til en array basert på hvert ord, denne funksjonen funker ikke helt..
explode = strtok(String2," ");

 

Det er ikke meningen man skal bruke strtok() på std::string (*Mulig* det vil fungere med strtok på &String[0], men det er helt klart Feil Måte[tm] å angripe problemet på).

 

if(String=="/exit") {exit = 1;}

 

Dette er det første du burde gjøre i løkken. Samt bytte exit med break.

Lenke til kommentar

Takker! :thumbup:

Skrev en funksjon via pushback, men det er en ting til jeg lurer på når det kommer til c++ syntax, hvorfor kan jeg ikke gjøre dette?

 

words[words.size()+1] = explode[i];

 

Både "words" og "explode" er vector<string>, og det skjer inne i en for loop der "i" er giveren!

ser at den blir outranged, men er det noen måte å bypasse dette problemet på?

 

edit:

hehe, dumme meg, løste problemet med å bruke push_back :tease:

Endret av Leif.ross
Lenke til kommentar

Kan noen hjelpe meg å forstå hvorfor eg ikke kan bruke dette programmet? Eg tror det har noe med ReadLine å gjøre...Om det i det hele tatt går ann å bruke :p Eg kunne bare WriteLine og tenkte at det kunne brukes :S

 

 

#include "stdafx.h"
#include "iostream"
#include <limits>
#include <fstream>

using namespace System;
using namespace std;

void pause()
{
   cout << "Press <ENTER> to continue . . .";


   cin.clear();
   cin.ignore(numeric_limits<streamsize>::max(), '\n');

}

int main(array<System::String ^> ^args)
{
double input;
   Console::WriteLine(L"Hello World!\n");
Console::WriteLine(L"Please enter your basic name that we will base the rest fo the names on: ");
Console::ReadLine(input);
ofstream makefile;
makefile.open("accountnames.simsnames");
makefile << input;

pause();
   return 0;
}

 

Fikset den, men får bare ut random nummer istede for navnet!! hjelp :(

Endret av Thitorkin
Lenke til kommentar

Har et siste spørsmål, får feilen "vector subscript out of range" på denne snutten. Kan vær jeg ikke ser det fordi jeg er utrolig sliten, men flere øyne på saken kan kanskje hjelpe også!

 

	srand(time(0));

for(b=0; b<length[trigger]; b++) {
randint = (rand()%length[trigger])+1;

if(randint<(length[trigger]/2)) {

	sentence[b]=context[trigger][b]; 
}else{ 

randint2 = (rand()%words.size())+1;
   sentence[b]=words[randint2];
    } 
}

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...