AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

PChar wird einfach verändert!

Ein Thema von Domestos · begonnen am 5. Apr 2006 · letzter Beitrag vom 5. Apr 2006
Antwort Antwort
Benutzerbild von Domestos
Domestos

Registriert seit: 15. Aug 2004
2 Beiträge
 
#1

PChar wird einfach verändert!

  Alt 5. Apr 2006, 11:33
Also das Programm sollte eigentlich zu einer MYSQL Datenbnk verbinden. Deshalb stehen in einer ini-Datei
die Benutzerdaten die der Benutzer angegeben hat. Nun zum Problem:
Er gibt er mir den Fehler aus, dass er nicht zu #6 verbinden kann. Wenn man das Programm dann Schrittweise ausführt sieht man seltsame Dinge, die mit der User-Variablen passieren.^^
Hier die erste für mich unverständliche Änderung:
Delphi-Quellcode:
  ini:=TIniFile.Create(ExtractFilePath(ParamStr(0))+'settings.ini');
  try
    muffel :=PChar(ini.ReadString('MYSQL','Name','Fehler'));
    Passwort :=PChar(ini.ReadString('MYSQL','Passwort','Fehler'));
    Timer :=ini.ReadInteger('Anderes','Zeit',0);
    Pfad :=ini.ReadString('Anderes','Pfad','Fehler');
  finally
    ini.free;
Also in der Variable muffel (hieß vorher user, dachte es könnte daran liegen und hab sie dann umbenannt^^) steht wie es sein sollte "root" darin. Aber ab "ini.free;" wird sie zu "root°" verändert.

Dann beim nächsten ini-Aufruf(in den Einstellungen) wird die Variable weiter über "¬ä¨", "\Š©" zu "#6" verändert.

Ich denk mal es ist ein ganz leicht zu lösender Fehler und hoffe deshalb auf schnele Hilfe.^^
Danke im Vorraus
Domestos
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#2

Re: PChar wird einfach verändert!

  Alt 5. Apr 2006, 11:43
PChar nimmt nur den Pointer zu den Daten, die ihm übergeben wurden und schreibt diesen in die Variable, welcher es zugewiesen wurde,
da du jetzt aber ini.ReadString nicht erst in eine Variable (z.B. String) einließt, nimmt Delphi selber eine Temporäre Variable und übergibt den Wert von ini.ReadString dieser.
Und um effektief zu sein, nimmt Delphi natürlich nicht ständig eine Neue, sonder verwendet immer wieder die Selbe, also sobald das Passwort ausgelesen wird, wird auch der Inhalt dieser temporären Variable verändert und da aber in dein Zeiger (muffel) noch darauf Zeigt, wird natürlich auch dessen Inhalt mit geändert und am Ende auch mit Freigegeben

Du mußt also deine Werter aus der Ini irgendwo abspeichern (in einem eigenständigem Speicherbereich, vorzugsweise eine eigenen Variable) und darauf kannst du dir erst einen Pointer holen, wenn es dann überhaupt noch nötig ist (hast ja dann auch eine echte Variable mit den gewünschten Werten) ^^
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: PChar wird einfach verändert!

  Alt 5. Apr 2006, 11:49
Herzlich willkommen in der Delphi-PRAXiS, Domestos.

Leider hast du ja nicht geschrieben, wie und wo deine Variablen deklariert sind. Du solltest sie auf jeden Fall als String-Variablen deklarieren und auf den gezeigten typecast verzichten. Es reicht, wenn du später PChar(user) verwendest, sobald due es für den Verbindungsaufbau brauchst.

Freundliche Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von Domestos
Domestos

Registriert seit: 15. Aug 2004
2 Beiträge
 
#4

Re: PChar wird einfach verändert!

  Alt 5. Apr 2006, 12:02
Vielen Dank für die schnellen Antworten klappt super.
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#5

Re: PChar wird einfach verändert!

  Alt 5. Apr 2006, 13:20
Ich gehe mal davon aus das muffel und Passwort vom Typ PChar sind. Damit sind sie Zeiger.
Delphi-Quellcode:
    muffel :=PChar(ini.ReadString('MYSQL','Name','Fehler'));
    Passwort :=PChar(ini.ReadString('MYSQL','Passwort','Fehler'));
ini.readString liefert einen string. Dieser ist von Delphi dynamisch in einer anonymen Hilfsvariablen alloziiert. PChar() liefert den Zeiger auf das erste Zeichen diese strings. Nun wird aber der gelieferte string keiner Variable zugewiesen. Delphi geht also davon aus das die anonyme Hilfsvariable nun unbenutzt ist und gibt den Speicher wieder frei. Damit zeigt muffel nun auf freigegebenen Speicher.
Der naechste Aufruf von ini.ReadString alloziiert also wieder eine anonyme Hilfsvariable die mit guter Wahrscheinlichkeit den gerade freigegebenen Speicher recycled oder zumindest fuer die Verwaltung des freien Speichers verwendet.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:36 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz