Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Laufzeitfehler bei der remove Funktion

Empfohlene Antworten

Veröffentlicht

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

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.

  • Autor

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

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

  • Autor

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

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.