Anzeige:
Ergebnis 1 bis 5 von 5

Thema: C++ von Windows zu Linux

  1. #1
    TestLinux
    Gast

    C++ von Windows zu Linux

    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);
    }

  2. #2
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    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" !?!

  3. #3
    Registrierter Benutzer
    Registriert seit
    21.06.1999
    Beiträge
    677
    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.

  4. #4
    TestLinux
    Gast

    C++ von Windows zu Linux

    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 ???

  5. #5
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    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,
    _
    Qt/KDE Entwickler
    Debian Benutzer

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •