PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ von Windows zu Linux



TestLinux
11-10-2005, 14:26
Hallo alle zusammen,

ich hab da ein Problem mit einem C-Programm das unter Windows funktioniert, jedoch unter Linux Probleme macht :
Das Programm ist dazu gedacht xml-Dateien zu erzeugen. Dazu werden einige Begriffe (ANSI- oder UTF8-Format) mit einer mysql-Datenbank(Daten in UTF8-Format) abgeglichen, daher die Notwendigkeit der Zeichenumwandlung.

Hier die Fehlermeldungen
diss_to_xml.cpp: In function `int main(int, char**)':
diss_to_xml.cpp:79: error: invalid conversion from `char*' to `unsigned char*'
diss_to_xml.cpp: In function `int fakultaet_aus_Mysql(char*, char*)':
diss_to_xml.cpp:112: error: `CP_UTF8' undeclared (first use this function)
diss_to_xml.cpp:112: error: (Each undeclared identifier is reported only once for each function it appears in.)
diss_to_xml.cpp:112: error: `WCHAR' undeclared (first use this function)
diss_to_xml.cpp:112: error: `MultiByteToWideChar' undeclared (first use this function)
diss_to_xml.cpp:113: error: `CP_ACP' undeclared (first use this function)
diss_to_xml.cpp:113: error: `WideCharToMultiByte' undeclared (first use this function)
diss_to_xml.cpp: In function `int fach_aus_Mysql(char*, char*, char*)':
diss_to_xml.cpp:147: error: `MultiByteToWideChar' undeclared (first use this function)
diss_to_xml.cpp:148: error: `WideCharToMultiByte' undeclared (first use this function)

und der entsprechende Soure-code :
/*#include <WINDOWS.H>
#include <winnls.h>*/ --> erstmal auskommentiert da es so viele Fehler erzeugt
#include <time.h>
#include <stdio.h>
#include <mysql/mysql.h>
#include <stdlib.h>
#include <string.h>


typedef struct
{
char * feld[18];
} DISS;

#include "diss_to_xml.h"

static char fakultaet_rohling[256];
static char fach_rohling[256];
static char character_set[8];

MYSQL *mConnection, mDB;

int CheckUTF8(unsigned char * buf)
{
strcpy(character_set,"ansi");
if (buf[0]!=0xef)
return(0);
if (buf[1]!=0xbb)
return(0);
if (buf[2]!=0xbf)
return(0);
strcpy(character_set,"utf8");
return(1);
}

int _chkstk()
{
return(0);
}

/* ************************************************** ******************* */
int main(int argc, char * argv[])
{
DISS feldname;
DISS diss;
char buf0[32000];
char buf[64000];

mysql_init(&mDB);
mConnection = mysql_real_connect(&mDB,"test","test","","test",0,0,0);
if (mConnection == NULL)
{
printf("Es konnte keine Verbindung zur Datenbank hergestellt werden: %s\n",mysql_error(&mDB));
return 1;
}
strcpy(fakultaet_rohling,"select ID ********************** by ID");
strcpy(fach_rohling,"select ID ******************** by ID");
fread(buf,1,3,stdin);
if (CheckUTF8(buf)==0)
{
fseek(stdin,0,0);
}
gets(buf0);

XmlDateiErzeugen(&feldname,buf0);

while (gets(buf)!=NULL)
{
XmlDateiErzeugen(&diss,buf);
PrintDiss(&feldname,&diss);
}
mysql_close(mConnection);
return(0);
} /* int main */

int fakultaet_aus_Mysql(char * text,char * ID_fakultaet)
{
MYSQL_RES *mysql_res;
MYSQL_ROW row;
char query_string[256];
char uni_text[512];
char ansi_text[512];
int zaehler;
if (strcmp(character_set,"utf8")==0)
{
MultiByteToWideChar(CP_UTF8, 0, text, -1, uni_text, sizeof(uni_text) / sizeof(WCHAR));
WideCharToMultiByte(CP_ACP, 0, uni_text, -1, ansi_text, sizeof(ansi_text), 0, 0);
sprintf(query_string,fakultaet_rohling,ansi_text);
}
else
sprintf(query_string,fakultaet_rohling,text);
mysql_query(&mDB,query_string);
mysql_res = mysql_store_result(&mDB);
zaehler = 0;
if (mysql_res!=NULL)
{
while ((row = mysql_fetch_row (mysql_res)) != NULL)
{
strcpy(ID_fakultaet,row[0]);
zaehler++;
}
}
if (zaehler!=1)
{
fprintf(stderr,"Fakultaet: %s nicht oder nicht eindeutig vorhanden (%d)\n",text,zaehler);
strcpy(ID_fakultaet,"0");
}
return(0);
}

int fach_aus_Mysql(char * text,char * ID_fakultaet,char * ID_fach)
{
MYSQL_RES *mysql_res;
MYSQL_ROW row;
char uni_text[512];
char ansi_text[512];
char query_string[256];
int zaehler;
if (strcmp(character_set,"utf8")==0)
{
MultiByteToWideChar(CP_UTF8, 0, text, -1, uni_text, sizeof(uni_text) / sizeof(WCHAR));
WideCharToMultiByte(CP_ACP, 0, uni_text, -1, ansi_text, sizeof(ansi_text), 0, 0);
sprintf(query_string,fach_rohling,ID_fakultaet,ans i_text);
}
else
sprintf(query_string,fach_rohling,ID_fakultaet,tex t);
mysql_query(&mDB,query_string);
mysql_res = mysql_store_result(&mDB);
zaehler = 0;
if (mysql_res!=NULL)
{
while ((row = mysql_fetch_row (mysql_res)) != NULL)
{
strcpy(ID_fach,row[0]);
zaehler++;
}
}
if (zaehler!=1)
{
fprintf(stderr,"Fach: %s nicht oder nicht eindeutig vorhanden (%d) Faultaet=%s\n",text,zaehler,ID_fakultaet);
strcpy(ID_fach,"0");
}
return(0);
}

locus vivendi
11-10-2005, 14:59
Das zu portieren sieht mir eigentlich relativ geradlinig aus. Du musst nur evtl. Äquivalente zu den Zeichen-Konvertierungsfunktionen finden (auf die Schnelle fällt mir da nur Qt ein, aber man findet garantiert auch anderes). Und du musst vernünftig zwischen "unsigned char*" und "char*" konvertieren. Wie du vielleicht weißt, sind das zwei unterschiedliche Typen die nicht implizit ineinander gecastet werden können (d.h. möglicherweise mit deinem Windows-Compiler schon...). Entweder du benutzt da explizite Casts als "Lösung", aber das ist, glaube ich, nicht wirklich erlaubt, oder du führst eine richtige Konvertierung durch. Dann sollte es laufen.

P.S.: Sag mal, hast du den Quelltext etwa abgetippt? Da steht einmal "ansi_text" und einmal "ans i_text" !?!

Christoph
12-10-2005, 08:40
Abgesehen von dem leicht zu behebenden Cast-Fehler, scheint es mir so, dass Du Win32-Api Funktionen (MultiByteToWideChar?) und Datentypen (WCHAR?) benutzt. Wenn Du die vermeidest bzw. auf beiden Plattformen verfügbare Bibliotheksfunktionen dafür verwendest, sollte es kein Problem sein.

TestLinux
12-10-2005, 11:00
Das das ganze mit den Win32-Api Funktionen (MultiByteToWideChar) nicht geht hab ich mittlerweile auch gemerkt.
Jedoch habe ich noch nicht die entsprechende Funktion unter Linux für g++ gefunden.
Also wer kennt ne Funktion die UTF-8 in UniCode in Ansi
bzw. UTF-8 direct in ANSI umwandelt ??? :confused:

anda_skoa
12-10-2005, 13:22
Ich hab dazu als Qt Programmierer logischerweise immer Qt verwendet, aber ich denke es sollte auch mit iconv gehen.
man 3 iconv_open
man 3 iconv
man 3 iconv_close

Ciao,
_