![]() |
strtoint gibt 0 zurück
Hätte nicht gedacht, dass mir folgendes solche Probleme macht:
Code:
Das Ergebnis von ein_integer ist 0 und nicht 42. Nur wieso?
ein_string:='42';
ein_integer:=strtoint(ein_string); |
Re: strtoint gibt 0 zurück
Evtl. "Anti-Fans" von Anhalter bei Borland!? :duck:
|
Re: strtoint gibt 0 zurück
Hallo,
welche Delphi Version nutzt Du? Was für ein Typ ist ein_string? (AnsiString, String, WideString)? Grüße Klaus |
Re: strtoint gibt 0 zurück
Delphi 7 Prof und es geht ohne Probs:
Delphi-Quellcode:
Ausgabe ist '42'...
var
ein_string: string; ein_integer: integer; begin ein_string:='42'; ein_integer:=strtoint(ein_string); ShowMessageFmt('%d', [ein_integer]); end; |
Re: strtoint gibt 0 zurück
Hast du "ein_integer" auch nach der Zuweisung verwendet?
(also nicht nur genau diesen Code und dann versucht es im Debugger auszulesen |
Re: strtoint gibt 0 zurück
Hier der Originalcode:
Code:
Ich öffne eine Exceltabelle und lese eine Zelle aus, in der ein Datum steht. Dieses Datum möchte ich mit einer anderen Zeit im Unix-Format vergleichen, muss aber den Umweg über einen integer gehen (lassen wir das mal so dahingestellt). Ich nehme mir also das erste und zweite Zeichen und mache daraus einen integer-Wert, den ich danach umrechne nach Unixtime. Aber es kommt immer 0 raus... die Werte davor sind aber ok.
var zeile,i: integer;
tag,monat,jahr: integer; temp,temptag: string; temp:=Excel.Cells[zeile,1].value; temptag:=temp[1]+temp[2]; tag:=strtoint(temptag); |
Re: strtoint gibt 0 zurück
Bei D2005 ergibt sich auch 42.
Gruß Wolfgang |
Re: strtoint gibt 0 zurück
wie gesagt, wenn du Tag nicht verwendest, wird es von Compiler, im Zuge der Codeoptimierung, schnell mal entfernt
und da es dann diese Variable nicht mehr gibt, zeigt der Debugger "Mißt" an. |
Re: strtoint gibt 0 zurück
Wie "siehst" du denn, dass da Müll drinnen steht?
Nur über den Debugger? Teste doch mal sowas aus...
Delphi-Quellcode:
Wie himitsu schon sagte macht Delphi die "witzigsten" Sachen im Hintergrund.
MessageDlg(temptag, mtWarning, [mbOK], 0);
oder Caption := temptag oder ... |
Re: strtoint gibt 0 zurück
Hallo,
Zitat:
Ich würde das per Copy machen
Delphi-Quellcode:
Ausserdem würde ich Präfixe verwenden:
temptag:= Copy(temp, 1, 2);
Delphi-Quellcode:
Solltest du weiter mit EnodeDate arbeiten,
var
iRow: iXXX: integer; iTag,iMonat,iJahr: integer; sTemp,sTempTag: string; sind das keine Integer, sondern Word.
Delphi-Quellcode:
wTag,wMonat,wJahr: Word;
Heiko |
Re: strtoint gibt 0 zurück
Delphi-Quellcode:
oder was ich immer mach .. einfach die variable verwenden, wenn auch nicht ganz so sinnvoll :nerd:
tag:=strtoint(temptag);
if tag = 0 then ; (vor dem IF ist sie nun verwendet und danach gibt's wieder das selbe Problem) |
Re: strtoint gibt 0 zurück
@hoika: Die ungarische Notation ist mittlerweile überholt und bei typensicheren Sprachen auch überflüssig. Sie macht Variablennamen eigentlich nur unlesbarer. Hinzukommt, wenn ich den Datentyp ändere, muss ich auch die Variablennamen ändern. Und außerdem zeigen einem moderne IDs auch den Datentyp an.
|
Re: strtoint gibt 0 zurück
Hallo,
Einsoruch ;) Bsp tag Es gibt ein property Tag. Vielleicht wird das hier gerade "benutzt". Und gerade ebend bei den Datenbanken.
Delphi-Quellcode:
Wer den Fehler findet, bekommt ein Bonbon ;)
var
Name: String; begin Name:= 'Meier'; with Query do begin SQL.Text:= 'Select * From Personal Where Name=:Name'; ParamByName('Name').AsString:= Name; Open; try finally Close; end; end; end; Mache ich statt Name ein sName, habe ich kein Problem. OK, ohne das with gibt es auch keines ;) Heiko |
Re: strtoint gibt 0 zurück
Hatten wir genau dieses Phänomen nicht erst am Wochenende? :mrgreen:
|
Re: strtoint gibt 0 zurück
Zitat:
![]() |
Re: strtoint gibt 0 zurück
Ich hab "tag" einfach mal in "tagx" umbenannt, bekomme aber wieder nur eine 0. Die sehe ich über den Debugger, habe eine Zeile nach dem strtoint einen Haltepunkt eingefügt. Im String davor steht eindeutig eine '17'.
|
Re: strtoint gibt 0 zurück
Hmmm jetzt begreife ich gar nichts mehr, denn mit einem eingefügten showmessage klappt es...
a) ohne showmessage, einen Haltepunkt in der Programmzeile NACH dem strtoint, Debugger sagt bei der Variable tag "0" b) kein Haltepunkt, aber ein showmessage in der Zeile nach dem strtoint, Debugger und das showmessage geben korrekt die "17" aus Hmmmmm... |
Re: strtoint gibt 0 zurück
Vielleicht ist die Zeile wegen anschließender Nichtbenutzung wegoptimiert worden.
|
Re: strtoint gibt 0 zurück
sagte ich doch
und nicht nur vielleicht alles was in ein Register paßt wird wegoptiomiert, wenn es nicht zufällig irgendwo auf'm Stack liegt nur Strings, dynamische Arrays und Interfaces werden nicht wegoptiomier, da dort beim END; erst aufgeräumt wird |
Re: strtoint gibt 0 zurück
Das hab ich glatt überlesen (sogar 2 mal :shock:)
|
Re: strtoint gibt 0 zurück
Hallo,
befindet sich die Routine in einem Formular? Dann könnte folgende Überlegung eventuell weiterhelfen. Du hast eine lokale Variabel tag. Das Formular hat ein Attribut Tag. Der Compiler erkennt die Variabel tag und Du kannst sie benutzen und im Debugger "begutachten". Die gilt auch für das Attribut Tag. Der Compiler geht nun her und wirft Variabeln zu dem Zeitpunkt weg, bei dem er der Meinung ist, das die Variabel nicht mehr benötigt wird. Das Problem, das hier nun auftritt ist: Der Compiler ist einer anderen Meinung als Du, was die Lebensdauer der Variabel tag angeht. Zu dem Zeitpunkt, an dem Du auf die Variabel tag zugreifst, ist der Compiler der Meinung, dass die Variabel tag nicht mehr benötigt wird, er ist der Ansicht, dass Du auf das Attribut Tag zugreifen möchtest und liefert es Dir. Und nun beweise Du mal dem Compiler, dass er Unrecht hat :wink: Problemlösungsmöglichkeit: Konsequent keine Variabelnnamen nutzen, die auch als Attribute (anderer Klassen) vorkommen (könnten). Also alles weglassen, was Attribut des Formulars ist, wie z. B.: Name, Enabled, Visible, Tag, Height, Align, Width... . Deshalb ist hier die ungarische Notation durchaus hilfreich. Du muss sie ja nicht konsequent in vollem Umfang umsetzten, aber nimm sie als Richtschnur, Hilfestellung... für eine konsequente eigene Vergabe von Variabelnnamen. Schlimmstenfalls setze vor alle eigenen Variablemnamen ein my (für: Die Variabel ist mirzu oder meineseine;-)) oder loc (für lokale Variabel). Bei solchen Problemen suchst Du die in großen Projekten 'nen Wolf und das ist durch Namenskonventionen vermeidbar. |
Re: strtoint gibt 0 zurück
Zitat:
Aber nicht die Lösung von diesem Problem. ;) (siehe u.a. #16) Wie himitsu schon (mehrfach ^^) schrieb würde auch ein iTag (vTag, ...) "weg-optimiert" werden. Einfach das Tag-Dings iwo (nochmal (?)) verwenden und gut isses (oder sollte es zumindest sein ^^) |
Re: strtoint gibt 0 zurück
Klappt ja jetzt ;-) Danke Euch allen... eine Frage habe ich aber noch... *WindowsAPI-Forum*
|
Re: strtoint gibt 0 zurück
Hallo,
Zitat:
|
Re: strtoint gibt 0 zurück
Ja bitte
Gruß Wolfgang |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:43 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz