Forum: PC-Programmierung Problem mit Eclipse CDT mit Schreibzugriff auf .exe-Datei


von R. F. (inet_surfer88)


Lesenswert?

Hallo,

nachdem ich schon länger mit C Controller programmiere möchte ich jetzt 
endlich mal C richtig lernen und ein Buch durcharbeiten. Hierzu habe ich 
Eclipse mit MinGw installiert, was auch ein paar Tage problemlos lief.

Seit 2 Tagen habe ich folgendes Problem: Ich schreibe ein Programm und 
klicke auf den RUN-Button. Das Programm wird ohne Probleme ausgeführt. 
Dann ändere ich eine kleinigkeit (es reicht schon, wenn ich z.B. beim 
String "Hello World" nur einen Buchstaben ändere. Wenn ich dann auf RUN 
klicke, bricht Eclipse ab und bringt im PROBLEMS-Fenster folgenden 
Fehler:

"cannot open output file test.exe: Permission denied test
C/C++ Problem"

Ich muss nach jeder Änderung Elipse beenden und neu starten, dann kann 
ich wieder eine Änderung vornehmen, bevor ich wiederum neu starten muss.

Wie bereits geschrieben, am Anfang trat das Problem nicht auf. Auch das 
Anlegen eines neuen Projektes brachte keine Besserung.

Hat jemand eine Idee?

System:
Eclipse IDE for C/C++ Developers
Version: Kepler Service Release 2
Build id: 20140224-0627

Win7 64 Bit Home Premium

Avira Antivirus Pro (Hat am Anfang auch Probleme bereitet, als die 
"Cloud-Sicherheit" aktiv war)

von Bastler (Gast)


Lesenswert?

Und das zu testende Programm war wie beendet? Windows ist da eigen. 
Aktives Exe, also wenn das Programm gerade läuft, kann man nicht einfach 
überschreiben. Bei Unix sind Datei und Name zwei verschiedene Dinge. Die 
Datei kann weiter existieren, wenn man den Namen entfernt hat und man 
kann diesen auch für eine andere Datei wiederverwenden. Die alte Version 
kann aber weiter in einen Prozess gemapped sein, z.b. zum Ausführen.
Eclipse hat einen roten Button um einen laufenden Prozess zu stoppen. 
Mit den grauen "x" sollte er komplett abgeräumt sein, so daß die Exe neu 
geschrieben werden kann.

von R. F. (inet_surfer88)


Lesenswert?

Hallo,

vielen Dank für den Beitrag. Der Hinweis mit dem Roten Stop-Button war 
die Lösung. Wenn ich auf den klicke kann ich die Datei neu 
überschreiben.

von Oliver S. (oliverso)


Lesenswert?

R. F. schrieb:
> Der Hinweis mit dem Roten Stop-Button war
> die Lösung. Wenn ich auf den klicke kann ich die Datei neu
> überschreiben.

Das braucht man aber nur, wenn sich das Programm nicht selber 
ordnungsgemäß beendet. Ergo hast du in deinem Programm einen Fehler...

Oliver

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Eventuell ist das Beispiel auch nur so geschrieben das es auf den 
"ANY-KEY" wartet ;-)

von R. F. (inet_surfer88)


Lesenswert?

Oliver S. schrieb:
> Das braucht man aber nur, wenn sich das Programm nicht selber
> ordnungsgemäß beendet. Ergo hast du in deinem Programm einen Fehler...

Jain, ich habe jetzt mal folgendes Beispiel eingegeben, nur zum Testen, 
also keinen tieferen Sinn in dem Programm suchen:

1
int main (void)
2
{
3
   int i;
4
5
   printf("Zahl eingeben:");
6
   scanf("%d",&i);
7
   printf("Zahl: %d\n",i);
8
   return 0;
9
}


Wenn ich die .exe in der Eingabeaufforderung starte, wird das Programm 
korrekt ausgeführt. Es erscheint der Text "Zahl eingeben:", ich gebe 
eine Zahl ein und drücke enter, es erscheint der Text "Zahl: 6"

In der Konsole von Eclipse erscheint zunächst nichts, und das Programm 
wird auch nicht beendet. In dem einfachen Beispiel kann ich durch 
drücken einer Zahl und Enter das Programm dann doch beenden, und der 
Text wird dann doch noch ausgegeben.

In der Win-Eingabeaufforderung sieht das Programm so aus:
Zahl eingeben:6
Zahl: 6

Bei Eclipse:
6
Zahl eingeben:Zahl: 6

Wenn mehrere scanf-Zeilen zum Einsatz kommen, funktioniert aber auch das 
nicht mehr. Dann kann ich das Programm nur noch mit dem "roten Button" 
beenden und muss das Programm in der Eingabeaufforderung testen.

von Kindergärtner (Gast)


Lesenswert?

R. F. schrieb:
> Wenn mehrere scanf-Zeilen zum Einsatz kommen, funktioniert aber auch das
> nicht mehr.
Mach nach das printf und vor das scanf ein fflush(stdout); .

von R. F. (inet_surfer88)


Lesenswert?

Kindergärtner schrieb:
> Mach nach das printf und vor das scanf ein fflush(stdout); .

Danke. Funktioniert.
Allerdings verstehe ich noch nicht ganz, warum. Wird das Programm nicht 
Zeile für Zeile abgearbeitet? Wieso hat das Einfügen des Befehles dann 
Auswirkungen auf den Befehl davor?

von Kindergärtner (Gast)


Lesenswert?

R. F. schrieb:
> Wird das Programm nicht
> Zeile für Zeile abgearbeitet?
Ja.

R. F. schrieb:
> Wieso hat das Einfügen des Befehles dann
> Auswirkungen auf den Befehl davor?
Weil das printf() in einen Puffer schreibt, der nicht notwendigerweise 
sofort auf dem Bildschirm ausgegeben wird. Erst bei Ausgabe eines 
newline (\n) oder bei Aufruf von fflush wird der Text tatsächlich 
ausgegeben. Siehe zB hier:
http://stackoverflow.com/questions/1716296/

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.