daysleper
-
Innlegg
296 -
Ble med
-
Besøkte siden sist
Innholdstype
Profiler
Forum
Hendelser
Blogger
Om forumet
Innlegg skrevet av daysleper
-
-
Ja - IPC i Windows ved hjelp av Pipes krever at du bruker en egen compiler f.eks. .. ikke noe særlig synes jeg i hvertfall ..
..og du fortstod riktig ja, zyp
-
..du kan jo enable debuggings-symboler "manuellt"..
Legg til -g der du kan skrive inn "compiler options".
-
Jeg kan ikke fordra Windows og har ikke råd til å betale for en compiler - så jeg kan istedet vise deg et eksempel der jeg bruker posix-threads som er mer Linux'ish.
Bruker her MinGW som compiler under Windows, og har MingGW installert i C:MinGW -katalogen.
MinGW finner du her: http://www.mingw.org/ (er en del forskjellige pakker å velge i når man skal laste ned, jeg lastet ned pakken med navnet "MinGW")
Siden pthreads-biblioteket ikke følger med MinGW compileren må du laste ned dette selv.
Du trenger
Biblioteket:
ftp://sources.redhat.com/pub/pthreads-win...libpthreadGCE.a
..som du legger i C:MinGWlib og renamer til libpthread.a
.. og headerfilene:
ftp://sources.redhat.com/pub/pthreads-win...clude/pthread.h
ftp://sources.redhat.com/pub/pthreads-win...include/sched.h
ftp://sources.redhat.com/pub/pthreads-win...ude/semaphore.h
..som du legger i C:MinGWinclude
Eksempelkode
#include <iostream> #include <sstream> #include <pthread.h> #include <unistd.h> using namespace std; // Dette for at visse ting skal være likt mellom Linux og Win32(MinGW) #ifdef _WIN32 #define strupr _strupr #define strncasecmp _strnicmp #ifdef __GNUC__ #define sleep(t) _sleep(t*1000) #define kbhit _kbhit #endif #endif stringstream buffer; // denne kan brukes til å kommunisere mellom prosessene hare() og rev() pthread_mutex_t mutex; void *hare(void* param) { int* i = static_cast<int*>(param); *i++; for(;;){ cerr << "Hare" << endl; pthread_mutex_lock(&mutex); buffer << "Hare "; pthread_mutex_unlock(&mutex); sleep(2); } } void *rev(void* param) { int* i = static_cast<int*>(param); *i++; for(;;){ cerr << "tRev" << endl; pthread_mutex_lock(&mutex); buffer << "Rev "; pthread_mutex_unlock(&mutex); sleep(4); } } int main(int argc, char** argv) { pthread_t hareThread; pthread_t revThread; pthread_mutex_init(&mutex, 0); cerr << "buffer før kjøring: "" << buffer.str() << """ << endl; cerr << "--" << endl; pthread_create(&hareThread, 0, hare, 0); pthread_create(&revThread, 0, rev, 0); sleep(10); pthread_mutex_lock(&mutex); cerr << "--" << endl; cerr << "buffer etter kjøring: "" << buffer.str() << """ << endl; return(0); }
..lagre filen som main.cpp og kompiler den slik:
Kompilering
Regner med at du vet hvordan man får frem en kommandolinje i Windows og at du kan bruke den?
g++ -g -Wall main.cpp -o main -lpthread..det er viktig at -lpthread kommer bakerst!
Hvis du i stedet velger å bruke Linux , er compileringen helt lik.
Kjøring
Når jeg kjører programmet får jeg denne utskriften:
buffer før kjøring: ""--
Hare
Rev
Hare
Rev
Hare
Hare
Rev
Hare
--
buffer etter kjøring: "Hare Rev Hare Rev Hare Hare Rev Hare "
Kort forklaring av mutex
Mutex er et begrep som gjelder thread-programmering generellt.
pthread_mutex_lock saken gjør at funksjonene hare() og rev() ikke skriver til buffer samtidig - noe som kunne gitt resultater som:
buffer etter kjøring: "HaRerve HaRreve HarReev RevH are HareRe HvHare "
Her er en oversikt over IPC-teknologier spesiellt for Windows: http://msdn.microsoft.com/library/default....munications.asp
-
Etter litt roting compilerer koden, og "diffen", patchen eller endringene ser slik ut:
- forran linja betyr fjernet linje.
+ forran linja betyr ny linje.
diff mytcl.old mytcl.cc -u
--- mytcl.old 2003-10-10 19:32:09.000000000 +0200 +++ mytcl.cc 2003-10-10 23:42:44.000000000 +0200 @@ -205,7 +205,7 @@ // ------------------------------------------------------------- // -int sql_command(ClientData clientData, Tcl_Interp *interp, int argc, char **argv) { +int sql_command(ClientData clientData, Tcl_Interp *interp, int argc, const char **argv) { int ret; if(argc == 1) { @@ -221,7 +221,7 @@ // ----------------------------------- if(strcmp(argv[1], "connect")==0) { - c = mgr->connect(argc-2, argv+2); + c = mgr->connect(argc-2,(char**) argv+2); if(c < 0) { char *basemsg = "Unable to Connect: "; char *errmsg = mgr->getErrorMsg(); @@ -239,7 +239,7 @@ } else if(strcmp(argv[1], "escape")==0) { if(!(argc < 3)) { - ret = sql_escape(interp, argv[2]); + ret = sql_escape(interp, (char*)argv[2]); } else { Tcl_SetResult(interp, "Usage: sql escape string", TCL_STATIC); ret = TCL_ERROR; @@ -253,7 +253,7 @@ if(argc <= 2) { Tcl_SetResult(interp, "Usage: sql command ?handle?", TCL_STATIC); ret = TCL_ERROR; - } else if((connid = stripPrefix(argv[2], HANDLE_PREFIX)) < 0) { + } else if((connid = stripPrefix((char*)argv[2], HANDLE_PREFIX)) < 0) { Tcl_AppendResult(interp, "mytcl: Invalid handle: ", argv[2], ".", NULL); ret = TCL_ERROR; } else if(!mgr->inUse(connid)) { @@ -265,15 +265,15 @@ Connection *conn = mgr->connection(connid); // take care of the command: if(strcmp(argv[1], "exec") == 0) { - ret = sql_exec(interp, conn, argv[3]); + ret = sql_exec(interp, conn, (char*)argv[3]); } else if(strcmp(argv[1], "query") == 0) { - ret = sql_query(interp, conn, argv[3]); + ret = sql_query(interp, conn, (char*)argv[3]); } else if(strcmp(argv[1], "endquery") == 0) { - ret = sql_endquery(interp, conn, argv[3]); + ret = sql_endquery(interp, conn, (char*)argv[3]); } else if(strcmp(argv[1], "fetchrow") == 0) { - ret = sql_fetchrow(interp, conn, argv[3]); + ret = sql_fetchrow(interp, conn, (char*)argv[3]); } else if(strcmp(argv[1], "numrows") == 0) { - ret = sql_numrows(interp, conn, argv[3]); + ret = sql_numrows(interp, conn, (char*)argv[3]); } else if(strcmp(argv[1], "affectedrows") == 0) { ret = sql_affectedrows(interp, conn); } else if(strcmp(argv[1], "insertid") == 0) { @@ -281,7 +281,7 @@ } else if(strcmp(argv[1], "disconnect") == 0) { ret = sql_disconnect(interp, mgr, connid); } else if(strcmp(argv[1], "selectdb")==0) { - ret = sql_selectdb(interp, conn, argv[3]); + ret = sql_selectdb(interp, conn, (char*)argv[3]); } else if(strcmp(argv[1], "isconnected")==0) { ret = sql_isconnected(interp, conn); } else {
-
Fikk mail - men ingen tilgang.. Har du IRC? Du kunne tatt en tur innom #c++.no på undernet eller efnet så tar vi det der.
(jeg paster eventuelle løsninger vi kommer frem til her i denne tråden ..)
-
Jeg mente at du skrev inn linjenummeret manuellt - dette fordi linjenummerene i feilmeldingene ikke ser ut til å stemme med koden på den linken ..
F.eks:
mytcl.cc:220: error: `ret' undeclared (first use this function)
Det finnes ingen ret på den linjen i koden fra den linken.. så koden du compilerer må se annerledes ut, altså ha flere eller færre linjer. (Er det mulig #include kan ha noe med dette å gjøre?)
Du kan eventuellt gi meg en temp. shell/ssh-konto - så kan jeg gå inn på maskinen din og compilere og se selv.
-
Ja - det sier seg selv at den får problemer her.
Du kan ta en kopi av argv som ikke er const og jobbe mot denne i stedet. Bruk strcpy().
Kunne jeg sett koden? Det om ret så litt rart ut ..
Ta med første linjenummer i det du paster, eks:
linje 220: kode(); kode(); kode();
..så ser jeg hva feilmeldingene peker på.
Det kan også hende det er lurere å endre det "fra andre siden", men dette vet jeg lite om siden jeg ikke vet hvordan resten av programmet eller headere rundt det forventer at ting skal se ut.
Altså at du i stedet for å forandre på sql_command sitt format (type), så endrer du på Tcl_CreateCommand sin functor-parameter slik at den matcher og kan ta i mot en functor uten const char** .. hvis u skjønner.. Kan som sagt ikke vite om det er en god idé sett fra her jeg står.
-
Jeg kan si med en gang at du må caste char** til const char** eksplisitt i koden din.
Koden som utløser feilmeldingen:
Tcl_CreateCommand(interp, "sql", sql_command ,(ClientData)s, (Tcl_CmdDeleteProc *)NULL);
Feilmeldingen:
invalid conversion from `int (*)(void*, Tcl_Interp*, int, char**)' to`int (*)(void*, Tcl_Interp*, int, const char**)'
sql_command, som blir sendt til Tcl_CreateCommand ser slik ut:
int sql_command(ClientData clientData, Tcl_Interp *interp, int argc, char **argv);
Du må med andre ord endre char **argv til const char** argv.
..det kan hende du "breaker" noe annet som forventer at argv -ikke- er const når du gjør dette.
Det kan ofte være lurt å endre på linjen som feilmeldingen peker på:
Tcl_CreateCommand(interp, "sql", sql_command, (ClientData)s, (Tcl_CmdDeleteProc *)NULL);
..da ville du med en gang sett at det var linjen sql_command compileren snakket om.
-
Edit:
La til denne som en kodesnutt, gå hit for event. siste versjon!
#include <iostream> #include <map> using namespace std; template<int ndim, typename T, typename DIM = int> class Tabell; // 2 Dimensjoner template<typename T, typename DIM> class Tabell<2, T, DIM> : public std::map<DIM, std::map<DIM, T> > { }; // 3 Dimensjoner template<typename T, typename DIM> class Tabell<3, T, DIM> : public std::map<DIM, std::map<DIM, std::map<DIM, T> > > { }; // 4 Dimensjoner template<typename T, typename DIM> class Tabell<4, T, DIM> : public std::map<DIM, std::map<DIM, std::map<DIM, std::map<DIM, T> > > > { }; // osv. .5, 6, .. 1000 dimensjoner.. :) int main() { Tabell<2, char> tabell2Da; // 2-dimensjonell tabell som lagrer char'er ved hjelp av templates (lagret på akser av den defaulte typen int) int const xMax = 20; int const yMax = 10; // lager er "spillebrett" for(int y = 0; y < yMax; y++) for(int x = 0; x < xMax; x++) tabell2Da[x][y] = '.'; cerr << "tegner brettet" << endl; for(int y = 0; y < yMax; y++) { for(int x = 0; x < xMax; x++) cerr << tabell2Da[x][y]; cerr << endl; } cerr << endl; cerr << "setter et kryss" << endl; tabell2Da[2][3] = 'X'; cerr << "tegner brettet" << endl; for(int y = 0; y < yMax; y++) { for(int x = 0; x < xMax; x++) cerr << tabell2Da[x][y]; cerr << endl; } cerr << endl; cerr << "setter en sirkel" << endl; tabell2Da[3][4] = 'O'; cerr << "tegner brettet" << endl; for(int y = 0; y < yMax; y++) { for(int x = 0; x < xMax; x++) cerr << tabell2Da[x][y]; cerr << endl; } cerr << endl; // andre eksempler på ting man kan lagre i disse flerdimensjonale tabellene: Tabell<2, int, double> tabell2Db; // 2-dimensjonell tabell med inter ved hjelp av templates lagret på akser av typed double Tabell<3, int, double> tabell3Da; // 3-dimensjonell tabell med inter lagret på akser av typen double Tabell<3, double> tabell3Db; // 3-dimensjonell tabell med double'r (lagret på akser av den defaulte typen int) return(0); }
Når jeg kjører programmet får jeg denne utskriften:
tegner brettet....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
setter et kryss
tegner brettet
....................
....................
....................
..X.................
....................
....................
....................
....................
....................
....................
setter en sirkel
tegner brettet
....................
....................
....................
..X.................
...O................
....................
....................
....................
....................
....................
Edit:
La til denne som en kodesnutt, gå hit for event. siste versjon!
-
Trenger ikke new til det, du kan bruke std::map og noen enkle typedefs:
#include <iostream> #include <map> using namespace std; typedef map<int, map<int, int> > Tabell2D; typedef map<int, map<int, map<int, int> > >Tabell3D; int main() { Tabell2D tabell2D; // lager en 2-dimensjonell tabell med int'er Tabell3D tabell3D; // lager en 3-dimensjonell tabell tabell2D[2][2] = 123; tabell3D[1][2][3] = 123; cerr << tabell3D[1][2][3] << endl; return(0); }
Paster en template-basert versjon, kanskje bedre altså, om 5 minutter ..
En ting:
Nå har ikke jeg så kjennskap til matte og slikt, men er Tabell2D egentlig 3dimensjonal sånn av definisjon? ..og Tabell3D 4dimensjonal?
Jeg roter sikkert ..
-
Du kan jo starte med å ta en titt på FAQ'en. Se om du finner ut av noe.
-
Lek og morro.
-
Ok, legger den til under "FAQ: 2.3 - Anbefalte bøker for ikke-så-nybegynnere?" siden den kanskje har mer med avansert programmering og implementering av egne algoritmer å gjøre. Tror ikke den er for nybegynnere som vil lære generell C++ hvis du ikke mener noe absolutt helt annet da ..
Har ikke boken selv, men fannt en innholdsfortegnelse på den:
1. Software Engineering Principles and C++ Classes
2. Object-Oriented Design (OOD) and C++
3. Pointers and Array-Based Lists
4. Standard Template Library (STL)
5. Linked Lists
6. Recursion
7. Stacks
8. Queues
9. Search Algorithms
10. Sorting Algorithms
11. Binary Trees
12. Graphs
13. Standard Template Library (STL) II
Appendix A Reserved Words
Appendix B Operator Precedence
Appendix C Character Sets
Appendix D Operator Overloading
Appendix E Header Files
Appendix F Additional C++Topics
Appendix G C++ for Java Programmers
Appendix H References
Appendix I Answers to Selected Exercises
..og det er derfor jeg tror den har mest med algoritmer og mer avanserte ting å gjøre uten at jeg har selve boken.
-
FAQ: 4.5 - Hvordan programmere og hva er OpenGL/DirectX?
Linker til resurser
http://www.codersdelight.com/opengl.htm Linksamling for OpenGL (takk til skinner)
http://www.codersdelight.com/directx.htm Linksamling for DirectX (takk til skinner)
-
Har ikke vært så mye borti dette, men fannt i det minste en link:
-
Vet ikke helt hva du lurer på, men her er litt så du kommer i gang i hvertfall.
#include <iostream> #include <pthread.h> #include <unistd.h> using namespace std; void *hare(void* param) { for(;;){ cerr << "Hare" << endl; sleep(2); } } void *rev(void* param) { for(;;){ cerr << "tRev" << endl; sleep(4); } } main(int argc, char** argv) { pthread_t hareThread; pthread_t revThread; pthread_create(&hareThread, 0, hare, NULL); pthread_create(&revThread, 0, rev, NULL); sleep(10); return(0); }
Lagre filen som test.cpp og kompiler den slik:
g++ test.cpp -g -Wall -o test -lpthreadEtter 10 sekunder avsluttes programmet og de 2 trådene som ble laget avsluttes også.
Jeg tar alle utfordringer - spesiellt hvis jeg får litt igjen når jeg lykkes.
-
Ja, det gjør det:
system("dir C:");
eller,
system(""min kommando.exe" param1 param2");
..dette fungerer i Linux også.
-
FAQ: 2.4 - Tutorialer, dokumentasjon og oppslagsverk på Internett?
Ingen ting kan måle seg med en god bok, men det finnes online-resurser også.
Hvis du har lyst til å begynne å lese med en gang, kan du laste ned Bruce Eckels bøker som er rimelig gode og gratis tilgjengelig her:
Del 1: Thinking in C++, 2nd edition, Volume 1
Del 2: Thinking in C++, 2nd edition, Volume 2
Vol. 1 inneholder en intro om C.
http://www.cs.cf.ac.uk/Dave/C/ En bok om C (bias mot Linux/Unix. Virker god og tar for seg andre ting enn bare språket.) Takk til Sugx
Det finnes masse på google, men mye er av gammel dato og stemmer ikke med de nye standarene.
Andre FAQ'er
http://www.parashift.com/c++-faq-lite/
http://groups.google.com/groups?hl=en&lr=&...mmering.c%2B%2B (det postes en norsk FAQ her - har også sett en versjon av denne på web, men linken er død(?))
Tutorialer
http://www.fredosaurus.com/notes-cpp/
http://www.gametutorials.com/Tutorials/c++/Cpp_Pg1.htm
http://www.relisoft.com/book/index.htm
http://cplus.about.com/library/blcplustut.htm - Denne ser ut til å være nyere enn mange andre (den stemmer med standaren)
http://www.arachnoid.com/cpptutor/index.html
http://www.howstuffworks.com/c.htm - Denne tar for seg C.
http://www.cprogramming.com/tutorial.html - Denne er ikke helt ny, (men er kanskje god fordet?)
http://www.cplusplus.com/doc/tutorial/ - Denne er heller ikke helt ny.
Referanser og oppslagsverk
http://cppreference.com - Kjekk ved kjappe oppslag når du lurer på noe fra C++'s standard bibliotek. Denne synes jeg er god
selv om den ikke er komplett.
http://gcc.gnu.org/onlinedocs/libstdc++/la.../annotated.html - Denne er mer detaljert og mer komplett.
http://www.sgi.com/tech/stl/table_of_contents.html - Hørt et sted at denne ikke stemmer -helt- overens med standaren?
http://www.dinkumware.com/manuals/reader.aspx?lib=cpp
http://www.gnu.org/manual/glibc-2.2.5/html...node/index.html
http://msdn.microsoft.com/library/default....by_Category.asp
http://msdn.microsoft.com/library/default....TML/LIB_CPP.asp
Win32 relatert
http://home.no.net/dubjai/contents.html
http://msdn.microsoft.com/library/en-us/sd....asp?frame=true (denne kan være lur å laste ned)
I linux har du kommandoene man, info og hvis du bruker Gnome/KDE et grafisk frontend til disse.
-
Ta en titt på www.dyndns.org der kan man få et:
[domenenavn] ---> [ikke fast ip]
..man laster ned en klient som kjøres i bakgrunnen på maskinen. Den oppdaterer domenenavnets ip til å matche din maskins ip (som er dynamisk, og kan endre seg med jevne mellomrom).
Det finnes flere "domene-etter-navn" å velge i mellom:
dittnavn.ath.cx
dittnavn.homeip.org
..osv.
Slik vil folk kunne skrive inn dittnavn.ath.cx i stedet for en ip-adresse når dem skal koble seg til f.eks. http-serveren (apache eller iis) eller ftp-serveren din.
Man kan også få .net/.org/.com etc. -adresser hos dem, men disse må man betale for.
-
:o .....
Ok, slik:
<alt-d> www.google.com <enter> kdevelop <enter>
tid: 0.5 sek!
Bytt ut <alt-d> med det som funker for din browser.
-
Sagt om Dev-C++:
Eneste ulemper er at programmene dine blir litt trege, men det merkes først når du lager store krevende programmer.Jeg er ikke helt enig i dette, fordi:
Dev-C++ bruker GCC 3.*.* (eller MinGW som den "kalles" under Win32) som compiler som er en av de beste (den beste?) compilerene du kan få tak i.
Bare husk dette:
- Du må spesifisere at du vil optimalisere koden.
- Du må slå av generering av informasjon for debugging.
http://www.willus.com/ccomp_benchmark.shtml?p11
For det andre så stemmer den med standaren, noe flere av Microsofts compilere ikke greier å leve opp til.
http://lists.trolltech.com/qt-interest/200...ead00291-0.html
http://www.coyotegulch.com/reviews/intel_c...gcc_bench2.html
og..
Selv bruker jeg Emacs og gdb + ddd til debugging.
-
system(""mitt program.exe"");
-
Dummies* -bøkene er desverre sjeldent gode. Men jeg tror de lærer deg hvordan du legger sammen tall?
Jeg trodde C++ var ganske tungt og lære seg, men ikke så tungt. Det er jo vanskelig.
Ja, det er det.
Jeg får ikke til og se æ,ø,å i console en gang.
Ikke bry deg om det - det er en norsk-tegnsett-Windows-ting.
Bruk konsollet til å lære i og til å skrive ut debug-meldinger fra de grafikkbaserte programmene du lager siden.
I visual basic 6 så ser man liksom det grafiske, den er "finere" på en måte.
I C++ (så langt som jeg har kommet ivertfall) så sitter man bare der, med en kjedlig konsoll/console og får ikke engang æøå til og fungere.
Visual Basic 6 ble skrevet i C++, hva har du å si til det?
Men jeg vet fint lite om det, har som sagt ikke lært stort ennå. Vet ikke hvordan jeg får kalkulatoren til og gå i "loop" ennå :oops:
Men jeg driver og leser en engelsk tutorial, en veldig bra en.
Det er bra.
Ta tiden til hjelp -- ikke vær alt for hard mot deg selv, du finner ut av det til slutt; husk at det er reisen som er målet - ikke selve målet.
... , uheldigvis er den på engelsk.
Driver å skriver litt på en norsk tutorial. Hvis du er intressert så finner du et eksempel på en "while-loop" der: http://nostdal.net/forum/viewtopic.php?p=163#163 Ikke noen forklaringer der foreløpig, men regner med at jeg skal få skrivd litt ... :-)
-
Tror det har mye med min personlige innfallsvinkel å gjøre. Boka går veldig i dybden når det gjelder C++ templater, men det blir mye av det samme som tas opp i Modern C++ (og en del basics jeg kjente til fra før) Design. Modern C++ Design hadde på forhånd fått opp øynene mine for teknikker som rekursive templater, og er nok en del mer tungt fordøyelig enn Vandevoorde/Josuttis. Derimot kunne jeg trengt en skikkelig referanse for standard-biblioteket (Josuttis).
Ok,
Så man burde kanskje lære språket, så biblioteket og avslutte med templates?
Starte med språket (bøker fra nybegynner tråden).
For så å gå videre med Josuitts bok om standardbiblioteket (The C++ Standard Library: A Tutorial and Reference (Nicolai M. Josuttis)).
Slik at man kan bruke det som allerede eksisterer.
..og videre med Josuitts bok om templates (C++ Templates: The Complete Guide (David Vandervoorde, Nicolai M. Josuttis)). Slik at man kan begynne å lage egne, mer avanserte, ting selv.
--og så, tilslutt eller kanskje i stedet for den over hvis man føler at man kan det som er basic innen templates; Modern C++ Design.
"Er så maange bøker..!"
Hackere, hva pokker er det?
i Tilbakemeldinger til redaksjonen
Skrevet
Kanskje det finnes to former for hackere - de "gode" og de "onde".
Begge liker å forske på ting, men den første gruppen gjør det av uskyldig nysjerrighet - den andre for å utnytte noe for å kunne tjene på det selv.
Så når man sier "hacker" - må man kanskje ut i fra sammenhengen -- hvem som sier det, selv finne ut om det menes de "gode" eller "onde".