abonnement Unibet Coolblue Bitvavo
pi_85683865
Hier kun je beter gewoon de file-I/O-functies van C gebruiken in plaats van die streamzooi van C++.
pi_85685297
Met operator>> zit je volgens mij formatted data in te lezen, gebruik gewoon getc() oid. Ik weet niet waarom eof() niet triggert, maar ik gebruik het te weinig...

gooi in je read loopje een std::cout die de char output die net gelezen is (even casten naar int zodat je de waarde krijgt) dan zie je vanzelf waar het fout gaat. Ik kan me voorstellen dat hij bijv. een integer probeert te lezen in binaire stream vol willekeurige bytes, dan leest ie steeds 0 bytes uit als het niet begint met '0' - '9'
pi_85698949
quote:
Op woensdag 25 augustus 2010 12:23 schreef netolk het volgende:
Hey, ik heb problemen met het maken van een ico...

ik heb op http://www.hackerfactor.c(...)-Ico-Ico-Un-Day.html en op http://en.wikipedia.org/wiki/BMP_file_format gekeken, maar nu werkt de volgende code niet...
SPOILER
Om spoilers te kunnen lezen moet je zijn ingelogd. Je moet je daarvoor eerst gratis Registreren. Ook kun je spoilers niet lezen als je een ban hebt.
bij de raw data copy (die while(!Read.eof()) loop) komt ie nooit aan bij end of file en krijg ik dus een oneindig groot ico file... weet iemand miss wat ik niet goed doe
Kijk eens naar de functies seekg en read van fstream. Houd er verder rekening mee dat je structs goed gepacked (dus dat iedere char maar 1 byte inneemt ipv 4)
  donderdag 26 augustus 2010 @ 10:35:42 #244
189216 netolk
maar dan andersom
pi_85721067
Het maakt niet uit wat ik doe of ik unformatted data lees of unsigned int/char lees hij blijft in een oneindige loop en geeft geen end of file aan...
Beware of the Raping Zebra's
pi_85722849
Wat lees je dan uit, zet die zooi op het scherm en kijk waar het mis gaat. Toch niet zo enorm moeilijk?
  donderdag 26 augustus 2010 @ 12:17:38 #246
189216 netolk
maar dan andersom
pi_85724731
quote:
Op donderdag 26 augustus 2010 11:25 schreef Cruise.Elroy het volgende:
Wat lees je dan uit, zet die zooi op het scherm en kijk waar het mis gaat. Toch niet zo enorm moeilijk?
nou op een gegeven moment leest ie alleen maar het zelfde getal uit...

Ik dacht probeer eerst een een ico te lezen maar daar krijg ik ook allemaal rare code uit dus die structs zullen wel weer eens niet kloppen :( nouja dat bekijk ik later wel weer
Beware of the Raping Zebra's
pi_85725544
Die streams die zien het gewoon als een string ofzo. Dus als je de int 1234 op een stream zet met <<, dan zet hij er in feite de string "1234" erop (denk ik). Dat hele streamgebeuren in C++ is geen verbetering ten opzichte van C. (Sowieso kun je voor dit soort simpele file-conversies beter Python gebruiken, maar dat terzijde).
pi_85725807
Je moet ook geen << operator gebruiken bij binary streams. Je wilt gewoon byte-voor-byte die data ophalen en wegschrijven met read en write. Als hij nog maar 1 getal uitleest, welke is dat dan? -1 ofzo?
  donderdag 26 augustus 2010 @ 15:08:35 #249
189216 netolk
maar dan andersom
pi_85732185
quote:
Op donderdag 26 augustus 2010 12:44 schreef Cruise.Elroy het volgende:
Je moet ook geen << operator gebruiken bij binary streams. Je wilt gewoon byte-voor-byte die data ophalen en wegschrijven met read en write. Als hij nog maar 1 getal uitleest, welke is dat dan? -1 ofzo?
nee iets van 236825 ofzo het maakte niet uit of ik binary las en schreef of niet bleef het zelfde getal krijgen...
Beware of the Raping Zebra's
pi_85734858
quote:
Op donderdag 26 augustus 2010 15:08 schreef netolk het volgende:

[..]

nee iets van 236825 ofzo het maakte niet uit of ik binary las en schreef of niet bleef het zelfde getal krijgen...
Gebruik je nog steeds << ? Want die moet je dus _niet_ gebruiken voor dit soort dingen

edit: ik zie dat je hele grote getallen krijgt, dus je bent niet byte voor byte binair aan het lezen. Dat moet je wel doen aangezien een BMP/ICO file vol zit met binaire troep.
Gooi dat getal er eens in HEX uit, misschien iets van 0xFFFF of 0x8000: een of andere errorwaarde.
  donderdag 26 augustus 2010 @ 17:05:43 #251
189216 netolk
maar dan andersom
pi_85736579
quote:
Op donderdag 26 augustus 2010 16:18 schreef Cruise.Elroy het volgende:

[..]

Gebruik je nog steeds << ? Want die moet je dus _niet_ gebruiken voor dit soort dingen

edit: ik zie dat je hele grote getallen krijgt, dus je bent niet byte voor byte binair aan het lezen. Dat moet je wel doen aangezien een BMP/ICO file vol zit met binaire troep.
Gooi dat getal er eens in HEX uit, misschien iets van 0xFFFF of 0x8000: een of andere errorwaarde.
Probleem is opgelost... Had eerst mn struct maar eens even in C++ geschreven in plaats van die windows meuk met byte enzo en daar hadden ze arrays dus dacht nou dat kan dan ook wel in 1 variabele maar dat kan dus niet XD

Bedankt iedereen nu kan ik een ICO tenminste lezen, en moet schrijven ook niet zo moeilijk meer zijn...
Beware of the Raping Zebra's
pi_85741249
Euh ok, logisch. ;)
  vrijdag 27 augustus 2010 @ 23:38:46 #253
189216 netolk
maar dan andersom
pi_85792252
kan iemand mij uitleggen waarom dit niet werkt??
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main(int argc,char *argv[]){
    for(int i = 0; i < argc; i++){ // tijdelijk
        std::cout << argv[i] << '\n';
    }
    if(argc > 1){
        if(argc == 2){
            if(argv[1] == "/?"){
                std::cout << '\n' << argv[0] << " [bitmap 1] etc. \n\n";
                std::cout << "[bitmap] File location of a bitmap (*.bmp)\n";
                std::cout << "/?       Program help\n";
            }
    }
    return 0;
}
als ik mn programma nu aanroep met CreateICO.exe /? dan krijg ik het volgende te zien:
1
2
CreateICO.exe
/?
maar dus niet het gedeelte dat in het if-statement staat...

EDIT: code foutje

[ Bericht 0% gewijzigd door netolk op 27-08-2010 23:44:59 ]
Beware of the Raping Zebra's
pi_85792372
if(argc = 2) moet if(argc == 2) zijn
  vrijdag 27 augustus 2010 @ 23:45:54 #255
189216 netolk
maar dan andersom
pi_85792574
quote:
Op vrijdag 27 augustus 2010 23:41 schreef thabit het volgende:
if(argc = 2) moet if(argc == 2) zijn
umja dat klopte idd ook niet maar het is niet de oplossing ik compile overigens met g++ niet dat dat uit zou moeten maken maar toch

zo doet ie het overigens wel
1if(argv[1][0] == '/' && argv[1][1] == '?')
Maar dit word een error als je maar 1 digit mee geeft...
EDIT: vind ik niet netjes geprogrammeerd en volgens mij zou het bovenste gewoon moeten werken

[ Bericht 19% gewijzigd door netolk op 28-08-2010 00:07:48 ]
Beware of the Raping Zebra's
pi_85793889
O ja, C heeft geen strings, dus dat zijn dan pointers. Om strings te vergelijken kun je de string klasse van C++ gebruiken. string(argv[0]) == string(argv[1])
  zaterdag 28 augustus 2010 @ 00:21:36 #257
189216 netolk
maar dan andersom
pi_85794114
ja, nu werkt het idd wel bedankt thabit :)
Beware of the Raping Zebra's
pi_85804994
netolk, je bent bekend met de string-zero opslag in C++ neem ik aan?
Een string sla je dus op als een reeks char's, en je point dan naar het begin van de string. het einde van de string wordt aangegeven met een nul (als character kan je het schrijven als '\0')

Als je dus twee strings wilt vergelijken moet je dus het volgende doen:
1
2
3
4
5
6
7
8
bool compareStrings(const char* str1, onst char* str2)
{
  for (int x = 0; str1[x] != 0 || str2[x] != 0; x++)
  { 
    if (str1[x] != str2[x]) return false;
  }
  return true;
}
deze lus loopt de beide strings af totdat er een verschil wordt gevonden, of totdat ze beide tegelijk aflopen. Oh en deze methode is niet optimaal en zit wss vol fouten, gebruik daarom de ingebouwde strcmp() functie.

Of gebruik de std::string klasse uit de STL lib van C++, maar mss leuk om precies te weten wat je doet.
  zondag 29 augustus 2010 @ 00:25:21 #259
189216 netolk
maar dan andersom
pi_85821591
quote:
Op zaterdag 28 augustus 2010 13:44 schreef Cruise.Elroy het volgende:
netolk, je bent bekend met de string-zero opslag in C++ neem ik aan?
Een string sla je dus op als een reeks char's, en je point dan naar het begin van de string. het einde van de string wordt aangegeven met een nul (als character kan je het schrijven als '\0')

Als je dus twee strings wilt vergelijken moet je dus het volgende doen:
[ code verwijderd ]

deze lus loopt de beide strings af totdat er een verschil wordt gevonden, of totdat ze beide tegelijk aflopen. Oh en deze methode is niet optimaal en zit wss vol fouten, gebruik daarom de ingebouwde strcmp() functie.

Of gebruik de std::string klasse uit de STL lib van C++, maar mss leuk om precies te weten wat je doet.
Dit klinkt idd logisch had ik zelf nog niet aan gedacht :) maar ik heb voor het makkelijkke maar gewoon de std::string gebruikt
Beware of the Raping Zebra's
pi_85834415
Vergeet niet dat je bij elke string() call wel een stukje geheugen alloceert etc. Als je met std::string werkt, probeer dan zo snel mogelijk (en 1-malig) alle inkomende char* naar strings te converteren, en werk daarna met const string& referenties (of pointers) om zo het onnodig aanmaken van strings te voorkomen. :)

Niet dat je daarmee in de problemen zal komen, tenzij je echt tijdkritieke code gaat schrijven. :)
  maandag 30 augustus 2010 @ 23:35:08 #261
189216 netolk
maar dan andersom
pi_85894240
quote:
Op zondag 29 augustus 2010 15:33 schreef Cruise.Elroy het volgende:
Vergeet niet dat je bij elke string() call wel een stukje geheugen alloceert etc. Als je met std::string werkt, probeer dan zo snel mogelijk (en 1-malig) alle inkomende char* naar strings te converteren, en werk daarna met const string& referenties (of pointers) om zo het onnodig aanmaken van strings te voorkomen. :)

Niet dat je daarmee in de problemen zal komen, tenzij je echt tijdkritieke code gaat schrijven. :)
Ik laat hem een tijdelijk object aanmaken voor het if-statement gebeuren

zoiets als dit
1
2
3
if(std::string(argv[1]) == "/?"){
  //code
}
Beware of the Raping Zebra's
pi_85895610
quote:
Op maandag 30 augustus 2010 23:35 schreef netolk het volgende:

[..]

Ik laat hem een tijdelijk object aanmaken voor het if-statement gebeuren

zoiets als dit
[ code verwijderd ]


ja dat mag, maar kijk uit voor bijv:

1
2
3
4
if (std::string(bla) == "hoi") func_hoi0();
else if (std::string(bla) == "hoi1") func_hoi1();
else if (std::string(bla) == "hoi2") func_hoi2();
else if (std::string(bla) == "hoi3") func_hoi3();
maak er dan van:
1
2
3
4
5
std::string blastr = std::string(bla);
if (blastr == "hoi") func_hoi0();
else if (blastr == "hoi1") func_hoi1();
else if (blastr == "hoi2") func_hoi2();
else if (blastr == "hoi3") func_hoi3();
Ik weet niet wat de operator==() van std::string allemaal accepteert, het zou zelfs kunnen zijn dat hij de rechterkant ook steeds naar strings zit om te zetten voordat ie vergelijkt.
  donderdag 2 september 2010 @ 07:10:47 #263
189216 netolk
maar dan andersom
pi_85975023
volgens mij accepterend string ook (const) char strings
Beware of the Raping Zebra's
pi_85978540
Elke keer als je a == b doet, dan wordt de methode operator== van a uitgevoerd, met b als input. Dus a.operator==(b) wordt dan uitgevoerd. Nu zal dat in elk geval voor een const string& b gedefinieerd zijn, maar waarschijnlijk dus ook voor een const char* b.
pi_85979145
ja ik had het nagezocht, en dat is idd zo. Vergeet niet dat std::string een specialisatie is van std::basicstring<> maar deze heeft nog extra functies om handig met de "ouderwetse" string0s uit C om te kunnen gaan ;)
1typedef basic_string<char> string;
  donderdag 2 september 2010 @ 14:26:49 #266
189216 netolk
maar dan andersom
pi_85985153
quote:
Op donderdag 2 september 2010 11:12 schreef Cruise.Elroy het volgende:
ja ik had het nagezocht, en dat is idd zo. Vergeet niet dat std::string een specialisatie is van std::basicstring<> maar deze heeft nog extra functies om handig met de "ouderwetse" string0s uit C om te kunnen gaan ;)
[ code verwijderd ]

Top dan kan ik het gewoon zo laten staan dus :P
Beware of the Raping Zebra's
pi_85985506
Dat kan sowieso, als je er 20.000 per seconde gaat doen, dan wordt het pas een issue ;)
  donderdag 2 september 2010 @ 21:17:52 #268
189216 netolk
maar dan andersom
pi_85999381
quote:
Op donderdag 2 september 2010 14:37 schreef Cruise.Elroy het volgende:
Dat kan sowieso, als je er 20.000 per seconde gaat doen, dan wordt het pas een issue ;)
:P nee dat was ik niet van plan XD maar ik wil wel zo efficiënt mogelijke code schrijven
Beware of the Raping Zebra's
pi_85999503
Premature optimization is the root of all evil.
pi_86013554
Ja, maar er vroeg rekening mee houden is wel heel belangrijk. :7
abonnement Unibet Coolblue Bitvavo
Forum Opties
Forumhop:
Hop naar:
(afkorting, bv 'KLB')