Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

18.06.2008, 21:19

int in char array konvertieren und andersherum

hi!

ich habe folgendes problem:

ich habe eine funktion, die ein stringarray als parameter bekommt und davon 2 benutzen in int werte umwandeln soll. danach werden die beiden werte addiert und wieder in ein chararray konvertiert und sollen ausgegeben werden. Das ganze soll eine funktion für einen scriptspracheninterpreter werden, deshalb so umständlich :) Hier ist mal die funktion:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
void Addition(string *Parameters)
{
    const char *zahl1 = Parameters[0].c_str();
    const char *zahl2 = Parameters[1].c_str();
    int izahl1, izahl2;
    izahl1 = strtol(zahl1, (char)0, 10);
    izahl2 = strtol(zahl2, (char)0, 10);
    izahl1 += izahl2;
    char* test;
    sprintf(test, "%d", izahl1);
    MessageBox(0, test, "Additionsergebnis", MB_OK);
}


alle funktionen funktionieren bis jetzt ausser diese :( sie ist aber auch die erste funktion, die eine zahl einlesen und ausgeben soll. Fällt

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

18.06.2008, 22:03

Wenn du schon C++ programmierst, darfst du auch die Features nutzen, die es dir bietet. Darunter:
- std::vector
- std::cout
- std::ifstream

Vor allem ist das unsicher, wenn du jetzt kein Array übergibst, dass >2 Einträge hat. Dann wird es einen Absturz geben.

Dann solltest du uns noch sagen, WAS genau da nicht funktioniert. Was du für Ergebnisse bekommst und was du erwarten würdest.

3

18.06.2008, 22:14

hm naja ich was genau da nicht funktioniert hat weiß ich ehrlich gesagt auch nicht. Naja, ich hab's jetz doch iwie geschafft. Das Problem war, dass ich bei strtol den 2. Parameter falsch übergeben habe und statt char *test habe ich test[10] benutzt, da hatte sich der debugger aufgehängt und ich habe das eben so probiert. Natürlich gibts bessere varianten aber bis jetzt bin ich auch noch in der Phase, in der ich einfach mal einige funktionen schreibe und teste, ob mein interpreter die neuen befehle einsetzen kann. Die Funktion habe ich benutzt um zu testen, wie ich zahlen verwenden kann Aber danke trotzdem :)

4

18.06.2008, 22:15

auch stringstreams kænnten interessant sein.
Lieber dumm fragen, als dumm bleiben!

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

18.06.2008, 22:23

Zitat von »"drakon"«

Wenn du schon C++ programmierst, darfst du auch die Features nutzen, die es dir bietet.


Alles was Mr. Data verwendet ist auch Teil von C++... Ich finde diese "nur neue C++ Mittel verwenden" Diskussion sowas von nervtötend... Manche Dinge lassen sich einfach schöner und eleganter mit C Mitteln lösen, genau wie es teilweise Probleme gibt bei der vector & Co super Dienste leisten. Aber dieses strikte "C++, niemals C Funktionalität" verwenden ist sowas schwachsinniges...
@D13_Dreinig

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

6

18.06.2008, 22:25

Zitat von »"Mr. Data"«

hm naja ich was genau da nicht funktioniert hat weiß ich ehrlich gesagt auch nicht. Naja, ich hab's jetz doch iwie geschafft. Das Problem war, dass ich bei strtol den 2. Parameter falsch übergeben habe und statt char *test habe ich test[10] benutzt, da hatte sich der debugger aufgehängt und ich habe das eben so probiert. Natürlich gibts bessere varianten aber bis jetzt bin ich auch noch in der Phase, in der ich einfach mal einige funktionen schreibe und teste, ob mein interpreter die neuen befehle einsetzen kann. Die Funktion habe ich benutzt um zu testen, wie ich zahlen verwenden kann Aber danke trotzdem :)


EDIT: (Um ewigen Diskussionen vorzubeugen)
[Meine Meinung]Du solltest dennoch nicht auf die genannen Features verzichten. Die können dir viel Arbeit abnehmen und sind um einiges sicherer, einfacher und vielfälltiger. [Meine Meinung]

7

18.06.2008, 22:41

Hier mal ein Lösungsvorschlag mit C++-Mitteln:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <vector>
#include <sstream>
#include <string>

int convert(std::string const&);
int add(std::vector<std::string> const&);

int main()
    {
        std::vector<std::string> literals;
        literals.push_back(std::string("1234"));
        literals.push_back(std::string("-234"));
        literals.push_back(std::string("111"));
        
        std::cout << add(literals) << std::endl;
    }

int convert(std::string const& str)
    {
        std::stringstream ss(str);
        int value;
        ss >> value;
        return value;
    }

int add(std::vector<std::string> const& strs)
    {
        int value = 0;
        std::vector<std::string>::const_iterator iter = strs.begin();
        for(; iter != strs.end(); ++iter) {
            value += convert(*iter);
        }
        return value;
    }


Sicher kann man das noch effektiver gestalten. Dieses Beispiel dient lediglich der Demonstration von drakons Hinweisen.

Grüße... Heiko

xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

8

18.06.2008, 23:00

Oder man macht template draus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
template<typename A, typename T> inline const A lexical_cast(const T& source) 
{ 
    std::stringstream s; 
    A destination; 
 
    if(!(s << source) || !(s >> destination)) 
        throw bad_lexical_cast(); 
 
    return destination; 
}

C-/C++-Quelltext

1
int test = lexical_cast<int>("23123");

Oder man nimmt die etwas ordentlichere Implementierung aus boost:
http://www.boost.org/doc/libs/1_35_0/boost/lexical_cast.hpp

Aber sonst kann ich mich den Vorrednern nur anschließen...
Die STL ist nicht nur schön anzusehen, man kann sie auch benutzen.

9

20.06.2008, 16:22

xD ich dachte mir doch dass muss zu irgendwas gut sein das teil...

So, jetz ma im ernst:

Aaaaaalso, ich hab jetzt tatsächlich meine Klassen etwas umgschrieben und wollte für die befehle statt einem array eine map benutzen. Doch siehe da: ein fehler. Meine Klasse für Befehle heiß CCommand. und die Map und der iterator ließen sich auch ohne weiteres deklarieren. Aber jetzt kommt das etwas seltsame: mein pair will CCommand annehmen.
Hier ist mal meine Klassendefinition:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
//CScript.h

//Deklaration der Script-Klasse

#ifndef CSCRIPT__H
#define CSCRIPT__H

//Hauptheader einbinden

#include "Script.h"

//Script-Klasse

//

class CScript
{
//Öffentliche Attribute und Methoden

public:

    //Attribute

    //


    //Map für Befehle

    map<string, class CCommand> m_mCommandList;
    map<string, class CCommand>::iterator i;
    pair<string, class CCommand> m_mpNewCommand;

    //String für den Namen des Aktuellen Befehls

    string m_sActualCommand;

    //Datei mit dem Scriptinhalt

    ifstream m_fScriptFile;

    //Variablen für Zeilenanzahl und Aktuelle Zeile

    int m_iNumRows;

    //Methoden

    //


    //Methode zum Laden einer Datei

    void Load(string NewScript);

    //Methode zum schließen der Datei

    void Unload();

    //Methode zum ausgeben einer Fehlermeldung, wenn der Befehl nicht gefunden wurde

    void ErrorMessage();

    //Methode zum finden des Aktuellen Befehls

    bool FindCommand();

    //Methode zum Hinzufügen eines Befehls

    void AddCommand(CCommand NewCommand);

    //Methode zum Ausführen des Scripts

    void Run();

    //Konstruktoren und Destruktor

    //


    //Standardkonstruktor

    CScript();

    //Destruktor

    ~CScript();
};

#endif


sooo, jetzt versuch ich, das zu kompilieren (natürlich sind alle anderen Dateien fertig und jetzt auch Fehlerfrei), aber bei der deklaration des pairs kommt ein etwas seltsamer Fehler:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
1>------ Rebuild All started: Project: EvilScript, Configuration: Debug Win32 ------
1>Deleting intermediate and output files for project 'EvilScript', configuration 'Debug|Win32'
1>Compiling...
1>CCommand.cpp
1>c:\program files\microsoft visual studio 9.0\vc\include\utility(62) : error C2079: 'std::pair<_Ty1,_Ty2>::second' uses undefined class 'CCommand'
1>        with
1>        [
1>            _Ty1=std::string,
1>            _Ty2=CCommand
1>        ]
1>        c:\users\felix\documents\visual studio 2008\projects\evilscript\evilscript\cscript.h(22) : see reference to class template instantiation 'std::pair<_Ty1,_Ty2>' being compiled
1>        with
1>        [
1>            _Ty1=std::string,
1>            _Ty2=CCommand
1>        ]
1>c:\users\felix\documents\visual studio 2008\projects\evilscript\evilscript\ccommand.cpp(48) : warning C4244: '=' : conversion from 'double' to 'float', possible loss of data
1>CScript.cpp
1>EvilScript.cpp
1>Generating Code...
1>Build log was saved at "file://c:\Users\Felix\Documents\Visual Studio 2008\Projects\EvilScript\EvilScript\Debug\BuildLog.htm"
1>EvilScript - 1 error(s), 1 warning(s)
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========


Soo hoffe jemand, der mehr ahnung von der STL hat als ich, weiß, was ich anders machen muss (und bevor jemand fragt: die klassendefinition bei der map, dem iterator und dem pair müssen dahin sonst gibts auch wieder fehler)

Ba'el

Alter Hase

Beiträge: 409

Wohnort: Erfurt

Beruf: Student (6 FS angew. Info. - Richtung Medieninformatik)

  • Private Nachricht senden

10

20.06.2008, 16:25

uses undefined class 'CCommand'

du musst natürlich auch die Klasse includen ;)

edit: und nich' Script.h, denn das is' ja dein aktueller Header, oder...
aktuelle Projekte:
Ruby on Rails
XNA &amp; Touchless
Progr. mobiler Endgeräte (GPS Trekking)

Werbeanzeige