Zum Inhalt springen

Laufzeitfehler bei der remove Funktion


Eleu

Empfohlene Beiträge

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

post-58959-14430448754832_thumb.jpg

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

post-58959-1443044875542_thumb.jpg

Link zu diesem Kommentar
Auf anderen Seiten teilen

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);

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...