Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » invalid conversion

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
11.08.2008, 02:43 Uhr
Ander



hallo,

ich bin c++ anfaenger und komme nicht auf die loesung meines problems. mein ziel ist es, einen eingegebenen string um x zeichen zu erweitern, was einer tatsaechlichen verschluesselung aehneln soll und dann nur die relevanten zeichen aus einem string wieder auszulesen, was einer entschluesselung nahe kommt.

der compiler im bloodshed dev-c++ (glaube mingw?) gibt mir folgende fehlermeldung:

invalid conversion from `char' to `const char*'
initializing argument 1 of `std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::append(const _CharT*) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]'

bei

Code:
cryptString.append(addchar);


Code:
cryptString.append(rndchar);

und den entsprechenden sachen bei der entschluesselung

hier der code im ganzen:

Code:
#include <iostream>
#include <string>
#include <cmath> //fuer zufallszahlen
#include <conio.h>

using namespace std;

/* ===========================================
   ENCRYPT
   =========================================== */
  
string encrypt(string originalString)
{
    string cryptString = "";
    
    int mloop, loop; //mainloop + subloop
    char rndchar; //cryptchar
    char addchar; //eigentlicher char
    
    srand (time(NULL)); //rnd enable
    
    for(mloop = 0; mloop < originalString.length(); mloop++) //crypt handle
    {
        addchar = originalString.at(mloop);
        cryptString.append(addchar); // -- hier kommt die fehlermeldung
        for(loop = 1; loop<=10 ; loop++) //add crypt (random chars)
        {
            rndchar = rand()%94;
            rndchar = rndchar + 33;
            cryptString.append(rndchar); // -- hier ebenfalls fehlermeldung
        }//add crypt end
    }//crypt handle end
    
    return cryptString;
}

/* ===========================================
   DECRYPT
   =========================================== */
  
string decrypt(string originalString)
{
    string decryptString = "";
    
    int mloop, DChandle; //mainloop + decrypt position
    
    char addchar; //eigentlicher char
    
    for(mloop = 0; mloop < originalString.length(); mloop++) //decrypt handle
    {
        DChandle = mloop * 10;
        addchar = originalString.at(DChandle);
        decryptString.append(addchar); // -- fehlermeldung
    }//decrypt handle end
    
    return decryptString;
}

int main()
{
    cout << "Test" << endl;
    string inputString;
    string outputString;
    
    cin >> inputString;
    
    outputString = encrypt(inputString);
    cout << outputString << endl;
    
    outputString = decrypt(outputString);
    cout << outputString << endl;
    
    getch();
    
    return 0;
} //ende main




warum die verwendeten chars konstanten sind, will mir nicht einleuchten, muss man dafuer nicht "const char" schreiben?

ich bin hier relativ hilflos, wuerde mich also wirklich sehr ueber etwaige hilfe freuen

Dieser Post wurde am 11.08.2008 um 02:47 Uhr von Ander editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
11.08.2008, 02:51 Uhr
Lensflare



die Funktion append erwartet eine Zeichenkette, kein einzelnes Zeichen.

C++:
char *a = "a"; //Zeichenkette
char b = 'b'; //ein Zeichen



Das const beim Parameter bedeutet nur, dass dieser innerhalb der Funktion nicht geändert werden kann.
Das kannst du an dieser Stelle erst mal ignorieren.


EDIT:

Was du willst ist wahrscheinlich diese Version von append:

C++:
cryptString.append(1, addchar);



Die 1 steht für:
"1 Mal das Zeichen einfügen"
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)

Dieser Post wurde am 11.08.2008 um 03:08 Uhr von Lensflare editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
11.08.2008, 03:04 Uhr
Ander



vielen dank erstmal fuer die schnelle antwort.

ich habe nun vor alle addchar und rndchar jetzt ein * gesetzt, jedoch bekomme ich immer noch die selbe fehlermeldung.
mein versuch, das nur bei der initialisierung zu machen, brachte mir nur die fehlermeldung invalid conversion 'char' to 'char*'.

kann ich noch irgendwas dabei falsch gemacht haben?^^
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
11.08.2008, 03:08 Uhr
Lensflare



siehe editierter Post oben

und man kann ein Zeichen (leider) nicht in eine Zeichenkette umwandeln, indem man das * benutzt
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)

Dieser Post wurde am 11.08.2008 um 03:10 Uhr von Lensflare editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
11.08.2008, 03:17 Uhr
Ander



super, jetzt scheint es soweit zu funktionieren. vielen dank

allerdings bekomme ich jetzt beim ausfuehren nach der ausgabe des 'verschluesselten' in der konsole die meldung
"This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information."

hast du vielleicht dafuer noch einen tip? ich sehe irgendwie nicht wo das programm anders beendet wird als mit return 0;
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
11.08.2008, 03:26 Uhr
Lensflare



getch()
ist für C.

Du programmierst in C++, daher solltest du stattdessen lieber
cin.ignore()
verwenden.

Ich weiss nicht ob es daran liegt, aber das würde ich so oder so noch ändern.
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
11.08.2008, 03:32 Uhr
Ander



wenngleich lehrreich, hat das mein letztes problem nicht geloest.

ich danke fuer deine spaete und wiederholte hilfe, ohne dich wuerde ich jetzt mit viel schlimmeren kopfschmerzen ins bett gehen.


vielleicht hat ja jemand noch ne idee woran das liegen koennte (evtl wegen vista?)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
11.08.2008, 05:48 Uhr
CppProgrammer



Der Wurm ist in deiner decrypt() Funktion drin.
Du versuchst dort in originalString auf Zeichenpositionen zuzugreifen, die es garnicht gibt.


C++:
// Hier liegt der FEHLER
DChandle = mloop * 10;
addchar = originalString.at(DChandle);



Wenn originalString beispielsweise 4 Zeichen lang ist, so ist DChandle bereits beim zweiten Schleifendurchgang um 6 größer, als der gesamte originalString überhaupt lang ist.

Das führt zwingerweise natürlich auch dazu, dass dir das Programm abschmiert, sobald du auf diese Position im String zugreifen willst, die garnicht existiert.

Dieser Post wurde am 11.08.2008 um 05:48 Uhr von CppProgrammer editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
11.08.2008, 16:54 Uhr
Ander



nein, daran kann es unmoeglich liegen, da der "originalString" in diesem fall die mit zeichen*10 erweiterte fassung ist, die ich aus der encrypt() erhalte.
ich greife also sehr wohl auf eine position zu, die existiert. (ich habe es auch mit deiner vorgeschlagenen aenderung probiert, was zur selben meldung fuehrte)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
11.08.2008, 16:59 Uhr
CppProgrammer



Hm eine Änderung hab ich nicht vorgeschlagen.
Das Stück Code was ich dir gezeigt hab, war direkt aus deinem Code rauskopiert und sollte dir nur zeigen, an welcher Stelle das Programm abstürtzt.

Du wirst feststellen, dass wenn du genau diese zwei Zeilen auskommentierst/löschst wird das Programm nicht mehr abstürzen.

Muss also folglich an diesen zwei Zeilen liegen!

EDIT:

Ich hab das Programm jetz mal ein wenig abgeändert, sodass es schwarz auf weiß ausgibt was ich schon vermutet hatte:


C++:
#include <iostream>
#include <string>
#include <cmath> //fuer zufallszahlen
#include <conio.h>
#include <time.h>

using namespace std;

/* ===========================================
   ENCRYPT
   =========================================== */

  
string encrypt(string originalString)
{
    string cryptString = "";
    
    int mloop, loop; //mainloop + subloop
    char rndchar; //cryptchar
    char addchar; //eigentlicher char
    
    srand (time(NULL)); //rnd enable
    
    for(mloop = 0; mloop < originalString.length(); mloop++) //crypt handle
    {
        addchar = originalString.at(mloop);
        cryptString.append("" + addchar); // -- hier kommt die fehlermeldung
        for(loop = 1; loop<=10 ; loop++) //add crypt (random chars)
        {
            rndchar = rand()%94;
            rndchar = rndchar + 33;
            cryptString.append("" + rndchar); // -- hier ebenfalls fehlermeldung
        }//add crypt end
    }//crypt handle end
    
    return cryptString;
}

/* ===========================================
   DECRYPT
   =========================================== */

  
string decrypt(string originalString)
{
    string decryptString = "";
    
    int mloop, DChandle; //mainloop + decrypt position
    
    char addchar; //eigentlicher char
    
    for(mloop = 0; mloop < originalString.length(); mloop++) //decrypt handle
    {
        DChandle = mloop * 10;
        //addchar = originalString.at(DChandle);
        //decryptString.append("" + addchar); // -- fehlermeldung
        cout << "Loop:                     " << mloop << endl;
        cout << "Length of originalString: " << originalString.length() << endl;
        cout << "Size of DChandle:         " << DChandle << endl << endl;
    }//decrypt handle end
    
    return decryptString;
}

int main()
{
    cout << "Test" << endl;
    string inputString;
    string outputString;
    
    cin >> inputString;
    cout << endl;
    
    outputString = encrypt(inputString);
    //cout << outputString << endl;
    
    outputString = decrypt(outputString);
    //cout << outputString << endl;
    
    //getch();
    
    return 0;
} //ende main



Du wirst festellen, dass DChandle fast immer (außer ein paar Durchgänge am Anfang der Schleife) größer als die Gesamtlänge von originalString ist.

Dieser Post wurde am 11.08.2008 um 17:07 Uhr von CppProgrammer editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: