Anfängerfrage: Funktion mit 2 Rückgabewerten (2.Versuch)



  • Hallo,

    Ich versuche seit 5 Tagen mich in C++ einzuarbeiten. Bisher habe ich hauptsächlich Perl / TK gemacht.
    Allerdings muss ich feststellen, dass offenbar auch die einfachsten Dinge in C++ offenbar 1.000 Zeilen Code erfordern.

    Mein Problem ist ganz einfach:
    1. Ich will eine Funktion, welche mir diese Daten zurückliefert:
    - Anzahl der Verwendeten Laufwerke im System (z.B: C:\ D:\ A:\ X:\ liefert 4)
    - Ein Array, das diese Laufwerksbuchstaben enthält (z.B: A, C, D, 😵
    - Ein Array, das die Laufwerkstypen enthält (z.B: 2, 3, 3, 5) wobei (3 = HDD und 5 = CD ist)
    Mein Denkansatz sah so aus:

    result[0][0] = C;
     result[0][1] = 3;
     result[1][0] = D;
     result[1][1] = 3;
    

    2. Diese Funktion soll zusammen mit anderen Funktionen in eine Datei ausgelagert werden.

    Ich habe aus einem Buch folgendes abgeschrieben:
    run.cpp:

    #include "extern_test.h"
    int *a;
    int *b;
    int i = 20;
    int j = 30;
    a = &i;
    b = &j;
    
    Test(a, b);
    cout << i;
    cout << "\n";
    cout << j;
    

    extern_text.cpp:

    void Test(int* a, int* b)
    {
        *a = 5;
        *b = 10;
    }
    

    Ausgabe: i hat den Wert 5 und j hat den Wert 10

    Sieht meines erachtens nach ganz einfach aus.

    Es ändert sich der Wert, auf den der Pointer a und b zeigt.

    Mir ist nur nicht klar, wie man das jetzt mit einem Array macht.

    ----

    Ich habe diese Frage hier schon einmal gestellt, aber keine brauchbaren Antworten erhalten.
    Ich mache C++ jetzt seit 5 Tagen.
    Wenn ich dann Antworten kriege wie:

    ... Die Alternative ist, der Funktion Referenzen auf die Container zu übergeben die mit den gewünschten Daten gefüllt werden...

    Referenzen? Container?
    Alternative? - wozu?
    Entsteht bei mir ein XXL - ?

    In der Perl-Welt kannte ich kein stuct, static, vector oder typedef.
    Ich suche eine Erklärung wie man das macht. Mit warum und wieso.
    Keine Antwort nach dem Motto "Ist doch ganz einfach:[CODE]" 😮 😕

    mfg
    trequ



  • So, schluss mit lustig!!!

    ich hab jetzt mal schnell was getippelt und KOMPLETT auf meiner Domain hochge-
    laden.

    http://www.klose2you.de/Laufwerke.rar

    Alle Funktionen die du benötigst, stehen in der externefunktionen.h, die ich
    in dem Projekt included und benutzt habe, damit du weisst wie du was aufrufst.
    Ich hoffe, dass jetzt dein prob gelöst ist !?
    Sag mir bitte bescheid, wenn du es runtergeladen hast, damit ichs wieder löschen
    kann (du weisst ja, der teure Traffic)

    vlg, Marco!



  • Hallo,

    ich habe die Datei runtergeladen, kann vom Server gelöscht werden.

    Ich habe versucht, das ganze in meine Anwendung zu integrieren.
    Siehe: http://www.pctex.de/driveletter.zip

    Ein Problem taucht noch auf, dann sollte es funktionieren:
    Das Struct ist im main unsichtbar, obwohl es vom VisualStudio unter Global aufgeführt ist. (Siehe Zeile 51 der Datei DriveLetter.cpp in meinem Projekt)
    Es ist, wie wenn pos[30] in der main unsichtbar ist.
    Was mache ich da falsch?

    Eine Frage noch:
    Wenn ich in drive.cpp ncoh weitere Funktionen einbinde, können die dann auch in den / die / das struct DriveInformations schreiben?

    Danke für die Geduld, ich glaube ich habe es (fast) verstanden. 🙄

    mfg
    trequ



  • zu 1: du hast ne win32-konsolenanwendung (versuche nen string anstelle des CStrings herzunehmen) -> selber suchen wie man das macht, gibt es zig einträge
    zu 2: du müsstest andere funktionen auch auf dieses struct zugreifen lassen können, aber warum, du rufst es doch sowieso immer über die main auf

    also, hau rein und sag bescheid wenn dus hinbekommen hast



  • kannst ja mal versuchen:
    in das struct ne int einzubauen und im main nur auf dieses int zuzugreifen.
    da kannst du schauen, ob das mit dem struct funktioniert...



  • Bummsfallera schrieb:

    zu 1: du hast ne win32-konsolenanwendung (versuche nen string anstelle des CStrings herzunehmen) -> selber suchen wie man das macht, gibt es zig einträge

    Also:
    1. Habe ich das gelesen: http://www.josuttis.com/cppbuch/allg/string1.cpp.html
    2. Hab ich es noch mal gelesen.
    3. Hatte ich ein riesen ?
    4. Musste ich an Perl denken: Ein String ist ein String und für die gibt es nur einen Typ. 😮
    5. Hab ich es eingebaut.
    6. Habe ich versucht rauszufinden, warum cout jetzt Fehler produziert.
    7. Habe ich auf std::cout umgestellt.
    8. Funktioniert es immer noch nicht.
    Ich habe immer noch nicht verstanden, warum C++ so viele Datentypen für Strings braucht. "abc" ist und bleibt ein String. Egal ob ich jetzt CString, char oder std::string verwende. 😕 😞 😕 😞 😕

    Bummsfallera schrieb:

    zu 2: du müsstest andere funktionen auch auf dieses struct zugreifen lassen können, aber warum, du rufst es doch sowieso immer über die main auf

    ??? Wieso? Ich will ja noch mehr Infos sammeln, die ich dann alle in das Struct reinschreiben kann.
    Hintergrund: Das ganze soll ein Programm werden, welches zu einem Kartenleser die Laufwerke zuordnet.
    Wenn man einen USB Kartenleser anschließt, hat man z.B. 4 Laufwerke, welche alle "Wechseldatenträger" heißen.
    Welcher ist jetzt CompactFlash? Genau: Try and Error.
    Daher baue ich mein Programm in 3 Teile auf:
    1. Lese alle Laufwerke und ihren Typ.
    2. Lese die UniqueID für alle Laufwerke aus der Registry.
    3. Lese zu dieser UniqueID die Hardware aus.
    Demnach ist jeder Schritt eine Funktion, und jede Funktion schreibt in das struct.
    Dann lese in in der Main die Werte aus.

    Bummsfallera schrieb:

    kannst ja mal versuchen:
    in das struct ne int einzubauen und im main nur auf dieses int zuzugreifen.
    da kannst du schauen, ob das mit dem struct funktioniert...

    Hab folgendes probiert:
    1. int i; im struct eingebaut;
    2. in der Funktion auf 20 gesetzt.
    3. in der main ausgegeben
    Fehler:
    <PFAD>\DriveLetter.cpp(52) : error C2065: 'drive_info' : undeclared identifier
    <PFAD>\DriveLetter.cpp(52) : error C2109: subscript requires array or pointer type
    <PFAD>\DriveLetter.cpp(52) : error C2228: left of '.i' must have class/struct/union type
    (Ich habe pos[30] in drive_info[30] umbenannt, um die lesbarkeit zu erhöhen. Der Fehler tritt aber auch bei pos[30] auf.)

    mfg

    trequ



  • kannste vielleidcht nochmal die aktuelle version hochladen`?
    warum muss es denn ne konsolenanwendung sein und kein mfc (da hätteste wenigstens
    ne grafische oberfläche und das Ganze wäre auch einfacher zu handlen)?



  • so, ich hab nochmal nachgeschaut:
    er findet das struct schon, aber wenn du hdd_typ anstatt des declariten hdd_type
    schreibst, dann hat er einfach keine chance.
    den anderen fehler bringt er weil er in ner win32 diverse funktionen nicht
    finden kann.
    Ich bin davon ausgegangen dass du ne mfc schreibst und hatte dir auch in der
    richtung schon die komplettlösung präsentiert.

    was du jetzt machen kannst:
    a) du schreibst ein mfc-prog und kannst mein zeug schon-
    mal verwenden.
    b) du sagst: NEEEEE, ich will unbedingt ne win32 haben und ziehst mit deinem
    Thread AUS dem MFC-Forum IN das DOS und Win32-Konsole-Forum, da man dir
    dort bestimmt besser helfen kann.

    ich persönlich würde es als mfc-anwendung machen, da du da schon mehr funcs zur
    auswahl hast und es auch schicker aussieht 😉 .



  • Hallo,

    Bummsfallera schrieb:

    so, ich hab nochmal nachgeschaut:
    er findet das struct schon, aber wenn du hdd_typ anstatt des declariten hdd_type
    schreibst, dann hat er einfach keine chance.

    Ups... Das hab ich ganz schnell mal geändert.

    Bummsfallera schrieb:

    den anderen fehler bringt er weil er in ner win32 diverse funktionen nicht
    finden kann.
    Ich bin davon ausgegangen dass du ne mfc schreibst und hatte dir auch in der
    richtung schon die komplettlösung präsentiert.

    Ich bin eigentlich auch davon ausgegangen:
    http://www.pctex.de/1.jpg
    In der main wird ja auch irgendwas mit MFC auf Erfolg geprüft...

    Ich hab das ganze nochmal neu gepackt und online gestellt:
    http://www.pctex.de/driveletter.zip

    Die Fehler sind in der Main auskommentiert.
    Ich denke eben wegen der Meldung
    DriveLetter.cpp(49) : error C2065: 'drive_info' : undeclared identifier
    dass er das drive_info nicht finden kann, weil es in der anderen Datei ist... 🙄 😕

    mfg
    trequ



  • ich schaus mir mal an.
    warum unbedingt ne konsolenanwendung?



  • Bummsfallera schrieb:

    kannste vielleidcht nochmal die aktuelle version hochladen`?
    warum muss es denn ne konsolenanwendung sein und kein mfc (da hätteste wenigstens
    ne grafische oberfläche und das Ganze wäre auch einfacher zu handlen)?

    Konsole ist Kundenvorgabe...

    Das Program soll eben alle Laufwerke und speziell Wecheldatenträger ermitteln und in eine Datei schreiben.
    Das Prog wird beim Autostart eines Kiosk-Systems aufgerufen und prüft, ob der Kartenleser gefunden wurde und ob im Gerätemanager Treiberkonflikte bestehen.
    Die Kiosk-Software liest diese Infos beim Start aus.
    Wenn der Kartenleser nicht funktioniert, wird ein Neustart eingeleitet.
    Geht er dann immer noch nicht, wird der Support alamiert.

    Warum das jetzt Konsole sein muss, ist mir auch nicht klar.
    Aber wenn eine Firma mit ? (vielen) Programmieren sagt, dass es Konsole sein muss, werden die sich hoffentlich dabei was denken...

    Wo wir gerade beim Thema sind:
    Gibt es in C++ die Möglichkeit den Gerätemanager auszulesen?
    Ich kenne da die Devcon.exe von Microsoft, aber die schreibt in eine Datei.
    Gibt es sowas direkt für C++?
    Man kann mit C++ ja direkt auf z.B. die Registry zugreifen. Vieleicht auch auf den Gerätemanager?

    mfg
    trequ



  • ich hab das ganze mal in ein header-file gepackt -> geht!
    check it out:

    http://www.klose2you.de/driveletter.rar

    wie immer bescheid sagen plz!



  • du kannst mit c++ Reg-Einträge lesen und auch schreiben.
    mit gerätemanager-zugriff weiss ich leider nicht.



  • is das drive immer am gleichen anschluss?



  • Bummsfallera schrieb:

    is das drive immer am gleichen anschluss?

    soweit ich weiß ja...



  • also auch immer gleicher driveletter...... 🙄



  • Hallo,

    also:
    1. Sind es immer 4 Driveletter, welche überwacht werden.
    2. Wird auch noch Bluetooth und IrDA überwacht. (Haben ja keine Laufwerksbuchstaben)
    3. Läuft da XP, wodurch Laufwerksbuchstaben geändert werden können.
    4. Haben wir bereits beobachtet, dass Windows die Laufwerke verschiebt. (so nach 2000 Neustarts)
    Warum konnte uns M$ auch nicht sagen, die haben das da jetzt als SQ-123456 ...

    Ich hab die neue Datei getestet.
    Warum das in die .h datei muss -> ???

    Hab an dem Beispiel nur das Ausgabelayout geändert, aber die Ausgabe ist im Hex-Format:
    http://www.pctex.de/3.jpg -> ???

    im Debug:
    http://www.pctex.de/2.jpg

    Das mit der Registry sollte ich hinkriegen. Hab ich bereits in Perl gemacht, und die Syntax und Befehle sind die selben...

    Danke für die Hilfe

    mfg
    trequ



  • hier, für reg-keys zu schreiben/löschen

    bool EnableAutostart(bool bEnable)
    {
    	  HKEY hKey;
        if (RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, (bEnable ? KEY_SET_VALUE : KEY_ALL_ACCESS), &hKey) == ERROR_SUCCESS)
        {
            if(bEnable == true)
            {
                char cPath[200];
                GetModuleFileName(AfxGetApp()->m_hInstance, cPath, sizeof(cPath));
    
                if(RegSetValueEx(hKey, "RegistryTest", 0, REG_SZ, (unsigned char*)&cPath, sizeof(cPath)) == ERROR_SUCCESS)
                {
                    RegCloseKey(hKey);
                    return true;
                }
            }
            else
            {
                if(RegDeleteValue(hKey, "RegistryTest") == ERROR_SUCCESS)
                {
                    RegCloseKey(hKey);
                    return true;
                }
            }
    
            RegCloseKey(hKey);
        }
        return false;
    }
    

Anmelden zum Antworten