Array für String



  • Ich übersetze ein Win Api Programm von Assembler in c++.
    Das Assemblerprogram speichert die Dateinamen wfd.cFileName in einer Art Array.
    Also ein Array etwa so: type langarray[Dateinamen];
    Ich kompiliere dies mit dev-cpp.
    Es scheint, dass kein Array für Strings angelegt werden kann, was ich nicht glauben kann.

    WIN32_FIND_DATA wfd;

    char langarray_filename[50]; // ??;

    string langarray_filename[50]; // ??
    Verursacht beim Kompilieren:
    [Error] 'string' was not declared in this scope

    int counter=0;

    //###################
    File_hnd=FindFirstFile("languages_menu\*",&wfd);
    FindNextFile(File_hnd,&wfd); // .directory
    FindNextFile(File_hnd,&wfd); // .. directory

    strcpy(langarray_filename[counter],wfd.cFileName);
    // Dies verursacht:
    // [Error] invalid conversion from 'char' to 'char*' [-fpermissive]

    while (FindNextFile(File_hnd,&wfd))
    {
    counter++;
    strcpy(langarray_filename[counter],wfd.cFileName);
    }

    FindClose(File_hnd);
    //###################################


  • Mod

    Wirklich C++/CLI? Falls ja: https://www.c-plusplus.net/forum/topic/263084/windows-forms-und-visual-c-macht-keinen-sinn
    Falls nicht: Bescheid sagen, dann verschiebe ich das Thema nach C++. (C, C++, C++/CLI, und C# sind jeweils ganz unterschiedliche Sprachen!)

    Ansonsten: Du kannst kein C++, oder? Da passt derzeit überhaupt nichts zusammen. Daher wird eine Behebung der Syntaxfehler nicht viel bringen, da das Programm logisch noch immer falsch wäre Leider ist es schwer zu erraten, was du überhaupt erreichen möchtest, aber ich vermute ganz stark, dass so ziemlich alle Stringoperationen hier komplett unnötig sind und du wahrscheinlich so etwas in der Art von

    std::vector<std::string> filenames;
    while (FindNextFile(File_hnd,&wfd))
        filenames.push_back(wfd.cFileName);
    

    willst.



  • @clamicun sagte in Array für String:

    Ich übersetze ein Win Api Programm von Assembler in c++.

    Hast du wirklich ein Programm in Assembler?! Dann würde ich immer vorschlagen, möglichst "frei" zu übersetzen. Also erstmal gucken, was überhaupt passieren soll und völlig unabhängig von der Quelle neuen Code schreiben.

    char langarray_filename[50]; // ??;
    string langarray_filename[50]; // ??
    Verursacht beim Kompilieren:
    [Error] 'string' was not declared in this scope

    Dann musst du wohl irgendwie einen Datentyp einbinden, der string heißt. In C++ gibt es std::string aus dem Header <string>. Meinst du den zufällig?

    Und ein char-Array und ein String-Array sind verschiedene Dinge. Was willst du wirklich haben? Oder suchst du ein Array von char*? In C++ würde ich dir aber std::vector<std::string> empfehlen (wobei, vielleicht braucht man für Dateinamen eher einen std::wstring - je nachdem, welche Funktionen du so aufrufst) - ggf. willst du auch einen LPWSTR haben?

    strcpy(langarray_filename[counter],wfd.cFileName);
    // Dies verursacht:
    // [Error] invalid conversion from 'char' to 'char*' [-fpermissive]

    Logisch, du übergibst als Quelle ein Zeichen, gefordert ist aber ein Zeiger auf ein nullterminierten C-String.



  • @SeppJ Ich weiss nicht, was CLI bedeutet. Es sollte in der Abteilung "generelle Fragen" zu c# sein



  • @clamicun sagte in Array für String:

    Es sollte in der Abteilung "generelle Fragen" zu c# sein

    Oben schreibst du noch, dass du in C++ übersetzen möchtest. Nun dreht es sich um C#. Welche Sprache soll's denn sein?



  • @wob Ich habe das so umgangen:
    char langarray_filename[25];
    strcpy(langarray_filename],wfd.cFileName);
    Brauche dann natürlich die entsprechende Anzahl von char vars



  • @wob Suchen Sie eine aus. Mein file heist main.cpp ... Ich denke ,es ist c++



  • @clamicun Welche Literatur oder Sonstiges nutzt du zum C++ lernen?



  • @wob Eine letzte Frage. Auf diesem Site kann man keine file.zip hochladen, um ausführlicheren Quelltext zu zeigen ?



  • @clamicun sagte in Array für String:

    @wob Suchen Sie eine aus. Mein file heist main.cpp ... Ich denke ,es ist c++

    Du solltest dir schon sicher sein, in welcher Sprache du Hilfe benötigst. Andernfalls kann man dir schlecht helfen.

    Die Unterschiede zwischen C#, C++, C sind riesig. Dein Quellcode sieht erstmal nach C aus. Mir stellt sich allerdings die Frage, wenn du ein Projekt portieren sollst, aber nicht genau weißt, in welcher Sprache du dort gerade Quellcode schreibst, ob du schon ausreichend Erfahrung hast, um ein Assembler-Projekt zu portieren.



  • @DirkB Ich will nicht C lernen.
    Ich will auf Bitte eines Enkels einen Assembler-Quelltext in C++ übersetzen.
    Funktioniert perfekt, hat aber einige Schwachstellen, die nicht so elegant wie in Assembler gelöst werden können



  • @It0101 Fragte schon, ob hier file.zip mit Quelltext hochgeladen werden können ... Das file main.cpp hat 47 kb ... Das werde ich hier nicht hinschreiben


  • Mod

    @clamicun sagte in Array für String:

    @It0101 Fragte schon, ob hier file.zip mit Quelltext hochgeladen werden können ... Das file main.cpp hat 47 kb ... Das werde ich hier nicht hinschreiben

    Und was soll das bringen, hier 47kb zu posten? Das liest doch keiner, daher ist das auch keine Option. Die Hauptfrage ist doch immer noch, wieso du nicht einmal weißt, in welcher Sprache zu schreibst, und wie du denkst, diese ominöse Sprache gelernt zu haben. Denn wie ich schon in meiner ersten Antwort schrieb, ist da doch so einiges ganz schlimm falsch (sofern das C++ sein soll). Und zwar so schlimm, dass es halt nicht damit getan wäre, ein paar Zeilen zu ändern, sondern so dass du ganz anders denken musst, wie du ein Programm aufbaust.

    Um dir helfen zu können, musst du erst einmal die Grundlagen deiner Zielsprache lernen.



  • @clamicun sagte in Array für String:

    Funktioniert perfekt, hat aber einige Schwachstellen, die nicht so elegant wie in Assembler gelöst werden können

    Assembler und elegant?! Gut, kann sein. Aber dass es in einer Hochsprache weniger elegant sein soll, ist doch echt fragwürdig. Kurzum: ich glaube dir kein Wort.



  • @SeppJ Und was soll das bringen, hier 47kb zu posten?
    Lesen ist hilfreich.
    Deswegen fragte ich nach Zipfile Upload. Dann kann man es selber kompilieren.
    Das ist die Methode von vielen Foren.


  • Mod

    @clamicun sagte in Array für String:

    @SeppJ Und was soll das bringen, hier 47kb zu posten?
    Lesen ist hilfreich.
    Deswegen fragte ich nach Zipfile Upload. Dann kann man es selber kompilieren.
    Das ist die Methode von vielen Foren.

    In keinem Programmierforum der Welt werden 47kB Code für dich gelesen. Die übliche Methode, wie man Probleme nachvollziehbar macht:
    https://www.c-plusplus.net/forum/topic/200753/du-brauchst-hilfe



  • @SeppJ Lesen !
    Deshalb auxh als Zipfile



  • @wob Ich versuches es noch einmal.
    Dies ist einfacher zu verstehen und kompiliert.

    How to create a sort of stringarray ?
    I would like to store the available wfd.cFileName in an array.
    Later I could address them by their numbers.

    #include <windows.h>
    #include <iostream>
    using namespace std;
    int main() {

    WIN32_FIND_DATA wfd;
    char langarray_filename[200]; // ???;
    int langarray_fileposition[200];
    int counter=1;
    HANDLE File_hnd;
    char buffer[50];

    //###################
    File_hnd=FindFirstFile("languages_menu\*",&wfd);
    // If you compile it, change the path
    FindNextFile(File_hnd,&wfd); // .directory
    FindNextFile(File_hnd,&wfd); // .. directory - not needed

    wsprintf(buffer,"%u %s",counter,wfd.cFileName);
    MessageBox(0,buffer,"pos name",MB_OK);

    //strcpy(langarray_filename[counter],wfd.cFileName); ???
    // This causes:
    // [Error] invalid conversion from 'char' to 'char*' [-fpermissive]

    langarray_fileposition[counter]=counter;

    while (FindNextFile(File_hnd,&wfd))
    {
    counter++;
    wsprintf(buffer,"%u %s",counter,wfd.cFileName);
    MessageBox(0,buffer,"pos name",MB_OK);

    //strcpy(langarray_filename[counter],wfd.cFileName); ???
    // This causes:
    // [Error] invalid conversion from 'char' to 'char*' [-fpermissive]

    langarray_fileposition[counter]=counter;
    }

    FindClose(File_hnd);
    //###################################

    for( int a = 1; a <= counter; a = a + 1) {

    wsprintf(buffer,"%u",langarray_fileposition[a]);
    MessageBox(0,buffer,"pos",MB_OK);
    }

    return 1;
    

    }


  • Mod

    @clamicun sagte in Array für String:

    @SeppJ Lesen !
    Deshalb auxh als Zipfile

    Wird es dadurch kürzer zu lesen?



  • @clamicun sagte in Array für String:

    @wob Ich versuches es noch einmal.

    Das bringt nichts, da du offenbar die Antworten nicht liest.

    Falls das hier dein Problem ist:

    How to create a sort of stringarray ?
    I would like to store the available wfd.cFileName in an array.
    Later I could address them by their numbers.

    Dann hat das @SeppJ oben in der allerersten Antwort schon beantwortet.


Log in to reply