[C++] Casting unsigned char * naar int

Pagina: 1
Acties:

  • pjonk
  • Registratie: November 2000
  • Laatst online: 29-12-2025
Als eerste ik ben C++ newbie dus als het zou kunnen dat ik rare dingen zeg.

Wat ik probeer te doen is een unsigned char * pointer (uit de command line) te casten naar een integer.

Dit probeer ik als volgt te doen:
code:
1
2
int LinesToSkip = 0;
LinesToSkip = (int)argv[1];

Dit heb ik ook nog geprobeerd
code:
1
2
int LinesToSkip = 0;
LinesToSkip = (int)*argv[1];

Maar ik krijg het niet voor elkaar. De waarde van het commandline argument komt niet in mijn variabele, maar de pointer of iets dergelijks.
Ik krijg het wel voor elkaar om te casten naar een int * pointer maar dat is niet de bedoeling.
Ik heb op internet gezocht en in mijn C++ boeken, maar ik kan nergens een voorbeeld vinden.

Het programma is en moet overigens gewoon in ANSI C++ stijl blijven dus ik wil geen MFC gaan gebruiken.

Any help is appreciated very much ;)

It’s nice to be important but it’s more important to be nice


  • Marcj
  • Registratie: November 2000
  • Laatst online: 11:41
argv is toch een pointer naar een char? Dan zou dit toch moeten werken??
code:
1
2
int LinesToSkip = 0;
LinesToSkip = (int)*(argv+1);

Edit: maar je moet natuurlijk wel controleren of er überhaupt opties worden meegegeven!

Of kun je ff melden hoe argv precies staat gedeclareerd?

  • pjonk
  • Registratie: November 2000
  • Laatst online: 29-12-2025
Op woensdag 17 juli 2002 10:57 schreef Marcj het volgende:
argv is toch een pointer naar een char? Dan zou dit toch moeten werken??
code:
1
2
int LinesToSkip = 0;
LinesToSkip = (int)*(argv+1)
argv is een pointer naar een array van pointers. Dus gedeclareerd als:
unsigned char **argv

Overigens moet argument 3 converteren naar een int (had ik even achterwege gelaten om het niet te moeilijk te maken)
Argument 1 en Argument 2 zijn een input en output files.

Ik heb geen problemen met argument 1 en 2, want die hoef ik niet te casten omdat ik die als pointers gebruik (zie onderstaande code)
code:
1
2
3
4
5
6
7
8
9
10
11
12
// Open the input file (1st parameter)
if( (InputFile = fopen((const char *)argv[1], "rb")) == NULL)
{
  return;
}

// Open the output file (2nd parameter)
if( (OutputFile = fopen((const char *)argv[2], "w+b")) == NULL)
{
  fclose(InputFile);
  return;
}

It’s nice to be important but it’s more important to be nice


  • KnoppenSpook
  • Registratie: Augustus 2000
  • Laatst online: 04-09-2023
code:
1
2
int LinesToSkip = 0;
LinesToSkip = (int)argv[1];

zit al aardig in de buurt.
probeer dit eens:
code:
1
2
int LinesToSkip = 0;
LinesToSkip = atoi(argv[1]);

argv is een char**
oftewel een array van char arrays.
oftewel een array van strings.

Met het casten (int) van een string, maak je er niet gelijk een int van. Je moet 'm omzetten, dat doe je via atoi (asci to integer)

info over atoi: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore98/HTML/_crt_atof.2c_.atoi.2c_._atoi64.2c_.atol.asp

/me weet geen leuke quote voor in zijn signature


  • Marcj
  • Registratie: November 2000
  • Laatst online: 11:41
atio(*(argv+3)) dan? Wil je van een BYTE een INT maken (a wordt 61 ofzo) of wil je van nummers in een string een INT maken?

  • KnoppenSpook
  • Registratie: Augustus 2000
  • Laatst online: 04-09-2023
Op woensdag 17 juli 2002 11:03 schreef JonkieXL het volgende:

[..]

argv is een pointer naar een array van pointers. Dus gedeclareerd als:
unsigned char **argv
code:
1
2
3
4
5
6
7
8
9
10
11
12
// Open the input file (1st parameter)
if( (InputFile = fopen((const char *)argv[1], "rb")) == NULL)
{
  return;
}

// Open the output file (2nd parameter)
if( (OutputFile = fopen((const char *)argv[2], "w+b")) == NULL)
{
  fclose(InputFile);
  return;
}
Klopt allemaal prima, maar je hoeft die argv[1] en argv[2] niet te casten hoor.

trouwens check je wel ff of die argumenten er zijn allemaal, (argc)?

/me weet geen leuke quote voor in zijn signature


  • PrinsEdje80
  • Registratie: Oktober 2001
  • Laatst online: 01-01 15:26

PrinsEdje80

Holographic, not grated...

Op woensdag 17 juli 2002 10:55 schreef JonkieXL het volgende:
code:
1
2
int LinesToSkip = 0;
LinesToSkip = (int)argv[1];

Dit heb ik ook nog geprobeerd
code:
1
2
int LinesToSkip = 0;
LinesToSkip = (int)*argv[1];
Doe dit:
code:
1
2
int LinesToSkip = 0;
LinesToSkip = atoi(argv[1]);
Het programma is en moet overigens gewoon in ANSI C++ stijl blijven dus ik wil geen MFC gaan gebruiken.
Functie atoi is ANSI C++. Althans ik mocht het gebruiken van de C++ goeroe van het Noorden: Frank Brokken!
Deze zit gewoon in de standaard libs. Onder linux gewoon ff: man atoi

edit:

Darn, wat aan de late kant...

Used to be Down Under... Foto gallery


  • pjonk
  • Registratie: November 2000
  • Laatst online: 29-12-2025
Op woensdag 17 juli 2002 11:05 schreef Marcj het volgende:
atio(*(argv+3)) dan? Wil je van een BYTE een INT maken (a wordt 61 ofzo) of wil je van nummers in een string een INT maken?
De laatste. Ik wil van nummers in een string een INT maken.
Ik heb het getest met atoi en dat lijkt prima te werken :)

Ik check idd ook met argc of alle argumenten meegegeven zijn.

It’s nice to be important but it’s more important to be nice


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 15:34
Op woensdag 17 juli 2002 11:07 schreef PrinsEdje80 het volgende:
Functie atoi is ANSI C++. Althans ik mocht het gebruiken van de C++ goeroe van het Noorden: Frank Brokken!
atoi is een C functie en heeft niets met ANSI C++ te maken. Terecht dat je 'm niet gebruiken mocht!
Deze zit gewoon in de standaard libs. Onder linux gewoon ff: man atoi
Niet in de standaard C++ libraries hoor. (Wel in de standaard C library die meestal ook wordt meegelinked.)

Als het doel is, leren programmeren in C++, kan ik best begrijpen dat je docent er op staat dat je het probleem op een C++-waardige manier oplost. Tip: kijk eens naar de mogelijkheden van streams.

  • igmar
  • Registratie: April 2000
  • Laatst online: 23-08 16:57

igmar

ISO20022

atoi is een C functie en heeft niets met ANSI C++ te maken. Terecht dat je 'm niet gebruiken mocht!
atoi() is een vreselijk lelijke functie, je kan namelijk niet zien of de conversie goed is gegaan.

strtol() is een stuk beter, maar helaas geen ANSI functie.

  • PrinsEdje80
  • Registratie: Oktober 2001
  • Laatst online: 01-01 15:26

PrinsEdje80

Holographic, not grated...

Op woensdag 17 juli 2002 12:10 schreef Soultaker het volgende:

[..]

atoi is een C functie en heeft niets met ANSI C++ te maken. Terecht dat je 'm niet gebruiken mocht!
:? Dan heb je toch iets verkeerd gelezen, want ik MOEST hem zelfs gebruiken!! Maar ik kan idd fout zitten met dat ANSI C++ deel ;)

en strtol() is net zo C als atoi, alleen kun je er net iets meer mee :P

Used to be Down Under... Foto gallery


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 15:34
Op woensdag 17 juli 2002 12:42 schreef PrinsEdje80 het volgende:
:? Dan heb je toch iets verkeerd gelezen, want ik MOEST hem zelfs gebruiken!! Maar ik kan idd fout zitten met dat ANSI C++ deel ;)
Sorry! Inderdaad: ik had verkeerd gelezen. My bad.
en strtol() is net zo C als atoi, alleen kun je er net iets meer mee :P
Yep.

Laat me trouwens niet beginnen over de suggesties met pointer arithmetic die ik hier langs heb zien komen (en niet kloppen, trouwens).

Verwijderd

Nu op de C++ manier:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <fstream>
#include <sstream>

...

// Open the input file (1st parameter)
std::ifstream InputFile(argv[1]);
if (!InputFile) return 1;

// Open the output file (2nd parameter)
std::ofstream OutputFile(argv[2]);
if (!OutputFile) return 1;

int LinesToSkip;
std::istringstream is(argv[3]);
is >> LinesToSkip;
if (is.fail() || is.bad()) // het lezen van de int is mislukt
// fclose niet nodig, gaat automatisch door destructors

  • PrinsEdje80
  • Registratie: Oktober 2001
  • Laatst online: 01-01 15:26

PrinsEdje80

Holographic, not grated...

Op woensdag 17 juli 2002 13:27 schreef John_Smith het volgende:
Nu op de C++ manier:

[knip]
Idd. Zeer netjes gedaan!!! :P

Used to be Down Under... Foto gallery


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
Op woensdag 17 juli 2002 13:27 schreef John_Smith het volgende:
Nu op de C++ manier:
code:
1
2
3
4
5
6
7
8
#include <fstream>
#include <sstream>

...

// Open the input file (1st parameter)
std::ifstream InputFile(argv[1]);
...
Eigenlijk is't netter om het volgende te doen:
code:
1
2
3
std::vector<char const*> Argv( argv,argv+argc );

std::ifstream InputFile( Argv.at(1) );

dan krijg je een nette exception (uit vector::at()) als de gebruiker argument 1 vergeten heeft. argv[1] doet die check niet.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1