[ MirzaSila @ 07.11.2006. 10:10 ] @
imam problem koji me jako muci.imam ovak code :

using namespace std;
wchar_t* Overwrite,*ProviderName,*ConnectionProperties,*Classes,*SdfFileName;
long int k;

int main(int argc, char*argv[])
{

ProviderName=argv[1];
ConnectionProperties=argv[2];
Classes=argv[3];
SdfFileName=argv[4];
Overwrite=argv[6];
cout<<"argument 1: "<<ProviderName<< endl;
cout<<"argument 2: "<<ConnectionProperties<< endl;
cout<<"argument 3: "<<Classes<< endl;
cout<<"argument 4: "<<SdfFileName<< endl;
cout<<"argument 5: "<< Overwrite<< endl;

i sad kad kompajliram javi mi gresku
error C2440: '=' : cannot convert from 'char *' to 'unsigned short *'

kako da rijesim ovaj problem zna li neko
[ X Files @ 07.11.2006. 11:09 ] @
Iako u konkretnom primeru treba da razmisliš još jednom o samom dizajnu programa,
jer si bespotrebno upao u probleme sa cast-ingom, evo kako bi to moglo da se prepravi
tek da proradi:

// netestrirano

Citat:

ProviderName=argv[1];

Code:

ProviderName = (wchar_t*)argv[1];

itd...
Citat:

cout<<"argument 1: "<<ProviderName<< endl;

Code:

// ovo nisam testirao, ali mislim da ćeš morati i ovde da cast-uješ,
// jer ćeš inače dobiti vrednost adrese
cout<<"argument 1: "<<(char*)ProviderName<< endl;

Ovde imaš grešku:
Citat:

Overwrite=argv[6];

...treba 5, što govori da bi trebao da uvedeš i neku vrstu provere, koja treba
da bude i dobra programerska praksa, na primer:
Code:

if ( argc > NEŠTO)
{
   // ... kod ...
}


[ MirzaSila @ 07.11.2006. 12:28 ] @
hvala na odgovoru.rijesio sam onako kako si ti rekaO.E sad me zanima kako da argv[5] pretvorim u bool jer mi to treba.
[ Dragi Tata @ 07.11.2006. 12:54 ] @
Ovo je školski primer kako ne treba koristiti castovanje. Čim naletiš na neku operaciju koja zaista očekuje wchar_t* sleduje ti karambas.

Jednostavno promeni deklaraciju sa wchar_t na char i to će lepo da radi.
[ MirzaSila @ 07.11.2006. 12:56 ] @
problem je u tome sto imam externu funkciju koja koristi kao ulazne parametre wchar_t.mozda ima neki nacin da pretvorim char u wchar_t.
[ kiklop74 @ 07.11.2006. 13:21 ] @
Zasto koristis wchar_t* ?

1. S obzirom da vec upotrebljavas standardnu biblioteku koristi onda std::wstring.
2. Ne mogu se ispisivati unicode stringovi koristeci cout. Za njih se koristi wcout.
3. Ne moze se kastovanjem konvertovati obican string u unicode string, za to treba da se napise funkcija.

dakle nesto kao ovo:

Code:
#include <cstdlib>
#include <string>
#include <iostream>
#include <vector>

std::wstring string2wstring (const std::string& str) {
  std::wstring result;
  if (!str.empty()) {
    std::vector<wchar_t> buffer(str.size());
    std::size_t res = std::mbstowcs(&buffer[0],str.c_str(),str.size());
    if (res > 0) {
     result.assign(buffer.begin(),buffer.end());
    }
  }
  return result;
}


Onda bi tvoj dalji kod izgledao malo drugacije:

Code:
 int main(int argc, char* argv[])
{
 if (argc < 7) {
   std::cerr << "Greška" << std::endl;
 }

 for (int pos=1; pos < argc; ++pos) {
   std::wcout <<  L"Argument " << pos << L": "
              <<string2wstring(argv[pos]) << std::endl;
 }

 return EXIT_SUCCESS;
}


I da bi dobio wchar_t* od std::wstring dovoljno je da koristis c_str() dakle nesto kao ovo:

Code:
void nekafunkcija (wchar_t *param);

std::wstring w(L"aa");
nekafunkcija(w.c_str());