Eleu Geschrieben 20. Juli 2010 Teilen Geschrieben 20. Juli 2010 Hallo zusammen, ich möchte mit der Funktion remove eine Datei löschen. Pfadangabe und Dateiname ergeben sich hierbei aus einer zusammengesetzten Zeichenkette (Char) Nach dem Löschen steht in der Variablen ("File_Wert_A") der nächste neue Dateiname der gelöscht werden soll. In der Schaltfläche "Datei löschen" habe ich hierfür nachfolgenden Quellcode programmiert: ------------------------------------------------------- #include "apdefap.h" void OnClick(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName) { char* Name = "C:\\Temp\\PPS_Files\\"; char* Name2 = GetTagChar("File_Wert_A"); char* Name3 = strncat(Name, Name2, '\31'); remove(Name3); printf(Name3); } ---------------------------------------------------------------------------------------------- Das Löschen der Datei funktioniert damit auch soweit. Nach dem Löschen betätige ich im Bild die Schaltflächen "Textfile Text.txt mit Dateinamen als Inhalt erzeugen" und dann "Daten aus Text.txt auslesen und in E/A Felder anzeigen" Diese Funktionen sollen ebenfalls hinterher in der Schaltfläche Datei löschen integriert werden. Für die Fehlersuche habe ich es aber erst mal getrennt. Wenn ich nun die Schaltfläche "Datei löschen" ein zweites mal drücke, erfolgt ein Laufzeitfehler. (Siehe Bild im Anhang mit dem Control der Global Skript Diagnose) Es funktioniert nur ein weiteres Mal, wenn ich das Bild über die Schaltfläche "zurück" verlasse und danach wieder neu aufrufe. Das ist aber nicht Sinn der Sache. Hat jemand eine Ahnung, warum der Laufzeitfehler auftritt und wie ich ihn verhindern kann ? Gruß Eleu Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 20. Juli 2010 Teilen Geschrieben 20. Juli 2010 char* Name = "C:\\Temp\\PPS_Files\\"; Name verweist auf ein Stringliteral. Schreibzugriffe auf Stringliterale sind nicht erlaubt. Selbst wenn du ein Literal verändern dürftest, dürftest du nichts hinten anhängen, denn dafür wird kein Speicher reserviert. Du musst ein char-Array anlegen, und du musst dafür sorgen, dass es für den ganzen String groß genug ist. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Eleu Geschrieben 20. Juli 2010 Autor Teilen Geschrieben 20. Juli 2010 Hallo Klotzkopp, mein Code sieht jetzt so aus: ------------------------------------ #include "apdefap.h" void OnClick(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName) { char Name[22] = "C:\\Temp\\PPS_Files\\"; char Name2[26] = GetTagChar("File_Wert_A"); char Name3[48] = strncat(Name, Name2, '\31'); printf(Name3); remove(Name3); } ------------------------------------------------- Jetzt habe ich zwar keinen Laufzeitfehler mehr, aber mit printf wird mir nur ein einzelnes Zeichen ausgegeben, obwohl ich Name, Name 2 und Name 3 als char array mit fester Länge angelegt habe. Ich bekomme beim Übersetzen des Quellcodes die Warnung: "different levels of indirection" Die Variable (File_Wert_A) habe ich als 8-Bit Textvariable in WinCC angelegt. Was mache ich falsch ? Gruß Eleu Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 20. Juli 2010 Teilen Geschrieben 20. Juli 2010 Ganz allgemein kannst du char-Arrays nicht mit Rückgabewerten von irgendwelchen Funktionen initialisieren. char Name2[26] = GetTagChar("File_Wert_A"); Welchen Typ gibt GetTagChar denn zurück? char Name3[48] = strncat(Name, Name2, '\31');Den Rückgabewert von strcat (und verwandten Funktionen) braucht man üblicherweise nur, wenn man mehrere Aufrufe verketten will. Dieser Aufruf hängt Name2 an Name an, hier besteht keine Notwendigkeit, das noch einer weiteren Variablen zuzuweisen. str(n)cat gibt immer den ersten Parameter zurück. Damit könntest du einen Zeiger initialisieren (dann würde dieser Name3-Zeiger auf Name zeigen), aber kein Array. printf(Name3);Das ist unsicher. Wenn in diesem String irgendwann mal ein Prozentzeichen auftaucht, bekommst du Probleme. Mach's so: printf("%s", Name3); Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Eleu Geschrieben 20. Juli 2010 Autor Teilen Geschrieben 20. Juli 2010 Hallo Klotzkopp, hiermit funktioniert es: ----------------------------------------- #include "apdefap.h" void OnClick(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName) { char *var="C:\\Temp\\PPS_Files\\"; char name[255]; char *endung= GetTagChar("File_Wert_A"); //variablen verketten..... strcpy(name, var); strncat(name, endung,'\31'); remove(name); printf("%s\n",name); } --------------------------------------------------- Man muss erst den Pfad in name kopieren. Dann den Dateinamen aus "File_Wert_A" mit strncat anhängen. Gruß Eleu Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.