kostenloser Webspace werbefrei: lima-city


Finde den Fehler einfach nicht..

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    m***s

    Hi,

    w?r toll wenn mir jemand helfen k?nnte, Hier erst mal der Code:


    String Mein_String ;
    int Mein_Int[6]
    Mein_String = Edit->Text;
    for(int nCount = 0; nCount < 5; nCount++)
    {
    Mein_Int[nCount] = StrToInt(Mein_String[nCount]); /*Hier Kriege ich ne Fehlermeldung vonwegen Access Violation */
    }


    Wie zu erkennen sein sollte geht es darum die einzelnen Zeichen des Strings (der eine 6-stellige Zahl enth?lt) in einzelne Integer umzuwandeln (um sp?ter davon ne Pr?fsumme bilden zuk?nnen). In meinen AUgen ist alles richtig, aber irgendwo muss ein Fehler sein, wenn ihn jemand sieht bitte posten.

    Mfg,
    M43kS
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. 0******a

    Was ist denn "String" (Klasse oder Struktur)? Mit welchem Compiler arbeitest du? F?r mich sieht das nach Borland C++ Builder aus, aber weiss man ja nicht. String-Klassen/-Strukturen gibt es haufenweise und schlauerweise heissen sie auch alle "String", nur funktionieren alle bisschen anders und haben daher auch verschiedene T?cken. Daher meine Frage.
    Auf den ersten Blick w?rde ich ohne Gew?hr allerdings sagen, das anscheined String[] nur einen Char zur?ckliefert und keinen String, wie es wohl StrToInt() verlangt. StrToInt() sucht dann wahrscheinlich das Ende des vermeintlichen Strings, den es (nicht) ?bergeben bekommen hat und grieft dann irgendwann auf gesperrte Speicherbereicht zu wegen des fehlenden 0-Bytes zum Abschluss des Strings.
    Solltest du also mal ohne das StrToInt() so ausprobieren:
    String Mein_String ;
    int Mein_Int[6]
    Mein_String = Edit->Text;
    for(int nCount = 0; nCount < 5; nCount++)
    {
    Mein_Int[nCount] = int (Mein_String[nCount]);
    }

    Wenn es dann klappt, hab ich mit meiner Vermutung recht, ansonsten beantworte meine Fragen zu Anfang dieses Postings.
  4. Autor dieses Themas

    m***s

    Erst mal danke f?r die Anwort. Dein Vorschlag funzt leider nicht. Ich verwende tats?chlich Borland C++ Builder, String ist wenn ich es richtig gesehen habe ein Ansistring und damit eine Klasse.
  5. 0******a

    Was geht an meinem Vorschlag nicht? Falls du meinst, es kommen dann im Array Mein_Int, nicht die richtigen Zahlen an: Einfach 48 substrahieren:
    Mein_Int[nCount] = int (Mein_String[nCount]) - 48;

    Sollte das auch nicht funktionieren, schreib halt mal, was da "nicht geht". Ansonsten w?re es auch sehr hilfreich, wenn du mal ?berpr?fst, ob die Klasse String (oder ANSIString) den Operator [] ?berhaupt ?berladen hat. Ich habe selbst leider gerade keine aktuelle Borland Doku zur Hand.
  6. e*****r

    Es w?re ziemlich hilfreich zu wissen welcher Art der Fehler ist! Meckert der Compiler? Gib es einen BufferOverflow (das Programm st?rzt mit ner gemeinen Fehlermeldung ab?!) oder gar ein Zugriff auf gesch?tzten Speicher (Bluescreen) (sollte aber nicht passieren). Ohne Fehlerbeschreibung kann man recht lange suchen ;o).


    Elandir


    P.S. meine konkrete Idee w?re jetzt.. wenn String eine Klasse ist.. wo ist die initialisierung der selben? Sprich etwas wie


    Mein_String = new String();


    Beitrag ge?ndert am 25.01 14:45 von elandir

    Beitrag ge?ndert am 25.01 14:46 von elandir

    Beitrag ge?ndert am 25.01 14:47 von elandir

    Beitrag ge?ndert am 25.01 14:48 von elandir
  7. Autor dieses Themas

    m***s

    Eine Fehlerquelle habe ich schon mal gefunden, ich darf f?r nCount nich 0 verwenden, hab in nem anderen kleinem proggi ausprobiert:

    String TestString = Edit1->Text;
    Edit1->Text = TestString[1];

    funzte wunderbar

    die meldung die ich kriege ist Access violation at address 40009720 in module 'rtl60.bpl'. read of address 87782603

    Edit: 'Was nich geht' immer noch die selbe fehlermeldung

    Beitrag ge?ndert am 25.01 14:52 von m43ks
  8. e*****r

    Das ist ein klassischer Speicherzugriffsfehler. Wenn du mich fragst liegt das an der Zeile

    [qoute]
    Mein_String = Edit->Text;
    [/qoute]

    Du packst hier den String des Textfeldes munter in eine Variable die eigentlich keine ist! Wenn String wirklich eine Klasse ist, hast du hier nur eine Instanz f?r die du aber noch garkein Speicher allokiert hast! Du musst also zuerst mal den Konstruktor f?r String aufrufen! Eventuell sogar mit dem vordefinierten wert. Das w?re dann vielleicht soetwas wie


    Mein_String = new String(Edit->Text);


    H?ngt aber ganz vom Konstruktor der Klasse ab.. was er erlaubt bzw erwartet! Schau da einfach mal in die Dokumentation! Die ist bei Borland im Regelfall sehr ausf?hrlich!

    Elandir
  9. Autor dieses Themas

    m***s


    String TestString = Edit1->Text;
    Edit1->Text = TestString[1];

    Hier mach ich ja genau das selbe, und da funzt es...
    Und ich hab in der referenz nachgesehen, den operator [] gibt es

    Beitrag ge?ndert am 25.01 16:01 von m43ks
  10. 0******a

    @elandir:
    Ich weiss nicht, was du mit Deinem new hast... Wozu das new? Der Konstruktor wird auch ohne new aufgerufen. Der Speicher, den die Klasse String f?r die Speicherung der Zeichenkette ben?tigt, wird innerhalb der Klasse selbst allokiert.


    @m43ks:
    Schau mal in der Doku zu deinem Compiler unter der Beschreibung der Klasse String nach dem Operator []. Ich sch?tze, da liegt das Problem. Falls du da kein Problem entdecken solltest, kopier mal den Text aus der Doku zu dem Operator raus.
  11. Autor dieses Themas

    m***s

    also ich glaube ich wei? worans liegt:

    returns the character at a specified index in the string.

    char& __fastcall operator [](const int idx);

    Description

    This operator returns the byte in the string at index value idx. The [] operator assumes a base index of 1.

    Note: If the string contains multi-byte characters, the [] operator may return a byte value that represents the wrong character and/or a partial character. For character-level access, use the SubString method.

    Returns a specified substring of the AnsiString.

    AnsiString __fastcall SubString(int index, int count) const;

    Description

    SubString returns a new AnsiString that is a substring of this AnsiString. The substring contains count characters beginning at index.

    mit substring sollte es jetzt gehen, danke ann alle die mir geholfen haben

    edi: es funzt wirklich

    Beitrag ge?ndert am 25.01 16:20 von m43ks
  12. 0******a

    Performanter als mit SubStr() und StrToInt() ist es so:
    String Mein_String ;
    int Mein_Int[6]
    Mein_String = Edit->Text;
    for(int nCount = 0; nCount < 5; nCount++)
    {
    Mein_Int[nCount] = int (Mein_String[nCount + 1]) - 48;
    }


    Das Fette ist neu. Die - 48 brauchst du nur, wenn eine '0' unbedingt in eine 0 verwandeln willst. Ansonsten w?re '0' ja 48 (Stichwort ASCII-Code).

    Deswegen hatte ich nach dem Operator [] gefragt, n?chstes Mal solltest Du bei ?berladenen Operatoren erst die Doku lesen. Ich habe auch schon String-Klassen gesehen, die beim ?berladenen + Operator ganz merkw?rdige Sachen machen.

    Noch ein Tip: Du solltest vor der for-Schleife unbedingt die L?nge von Mein_String ?berpr?fen.
  13. Autor dieses Themas

    m***s


    n?chstes Mal solltest Du bei ?berladenen Operatoren erst die Doku lesen. Ich habe auch schon String-Klassen gesehen, die beim ?berladenen + Operator ganz merkw?rdige Sachen machen.

    Werd ich machen. :stupid:


    Noch ein Tip: Du solltest vor der for-Schleife unbedingt die L?nge von Mein_String ?berpr?fen.

    Schon klar, ich wollte nur erst mal dasn eigentliche Programm ans Laufen kriegen, aber trotzdem danke.
  14. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!