Visual Studio C

Gast #7138353
Lesenswert?

Guten Morgen ich habe eine C Konsolenanwendung in Visual Studio mit 
dieser
soll eine sehr große Datei (~8MByte) eingelesen werden. Für das Einlsen 
nutze ich die Funktion fopen.
1
   filePointer = fopen("LogFile.log", "r");
2
    fseek(filePointer, 0, SEEK_END);
3
    uint32_t fileLen = ftell(filePointer);
4

5
    buffer = (char*)malloc(fileLen + 1); /* Speicher reservieren */
6
    if (!buffer)
7
    {
8
        fprintf(stderr, "Memory error!");
9
        fclose(filePointer);
10
        return;
11
    }
12
  
13
    fread(buffer, fileLen, 1, filePointer); /* Datei lesen und in Puffer ablegen */
14
    fclose(filePointer);

Wenn ich die Konsolenanwendung in der Cmd Box ausführe erscheint diese 
Fehlermeldung: sie Bild im Dateianhang
Angehängte Dateien:
Gast #7138410
Lesenswert?

Das geht so nicht.

Ist in VB genau das selbe da geht es auch nicht.

Du musst in den Projekteigenschaften und Debugging in 
Befehlszeilenargument die Datei angeben.

Den Dateinamen erhälts du dann via Environment Befehlsfunktion.
Gast #7138463
Lesenswert?

Hab noch eine Frage bezüglich Präprozessoranweisungen.
Ich benötige quasi einen Softwareschalter. Leider weiß ich nicht warum 
dies so nicht funktioniert.
1
#define FALSE = 0
2
#define TRUE = !FALSE
3

4

5
#define TEST FALSE  
6

7
int main()
8
{
9
#ifdef TEST == TRUE
10

11
#endif
12
}
Gast #7138495
Lesenswert?

Jo schrieb:
> buffer = (char*)malloc(fileLen + 1); /* Speicher reservieren */

Wenn deine Datei genau 4 GB groß ist, dann läuft diese Berechnung über 
und zu alloziierst 0 Bytes. In weiteren Verlauf schreibst du dann deine 
4 GB in den nicht ganz so großen Puffer.
Gast #7138502
Lesenswert?

Dirk B. schrieb:
> Einfacher ist es, TEST nur für den Testfall zu definieren.
> Im normalfall gibt es das nicht.

Man deklariert TEST as Boolean wenn man am Entwicklen ist.

Das setzt man in der Start-Routine auf TRUE und gut ist.

Ich benutze das z.b. wenn ein Prg. zwingend eingaben des Users erwartet 
und ich zu Faul bin die jedes mal einzugeben.

Also wird beim Klick auf den Button folgendes gemacht.

If Test = true then
  hp_e_eingabe1.text = "fdsfs"
  hp_l_liste.selectedindex = 3
end if

Danach die User-Fehler-Behandlung die er ja jetzt erfolgreich besteht.

und dann die Programmausführung.

So eine Vorgehensweise spart ein Stunden an Arbeit.

Man darf nur nicht vergessen das hinterher TEST auf FALSE zu setzen.

Hinweis : Ist zwar Basic-Code geht aber in JEDER Programmiersprache. 
!!!!
Beitrag #7138529 wurde von einem Moderator gelöscht.
#7138531
Lesenswert?

Schlaumaier schrieb:
> Man deklariert TEST as Boolean wenn man am Entwicklen ist.
>
> Das setzt man in der Start-Routine auf TRUE und gut ist.
>
> Ich benutze das z.b. wenn ein Prg. zwingend eingaben des Users erwartet
> und ich zu Faul bin die jedes mal einzugeben.
>
> Also wird beim Klick auf den Button folgendes gemacht.
>
> If Test = true then
>   hp_e_eingabe1.text = "fdsfs"
>   hp_l_liste.selectedindex = 3
> end if

Da wird es erst zur Runtime entschieden.

Bei der bedingten Compilierung mit Makros passiert das aber schon zur 
Buildtime.

Daher ist das nicht vergleichbar.
#7138534
Lesenswert?

höre nicht auf das Geschrei vom Schlaumeier, der kennt offensichtlich 
den Unterschied zwischen bedingter Komplierung und Laufzeitabfragen 
nicht.
Den Debug Müll möchte man im Release nicht drin haben und dafür ist die 
bedingte Kompilierung schon richtig. Es gibt üblicherweise fertige 
Makros für Ausgaben im Debug Build oder Assert Makros die einen 
Laufzeitfehler erzeugen wenn eine Bedingung nicht erfüllt ist.
Lies dir lieber die Beiträge von Ernst B. nochmal durch.
#7138543
Lesenswert?

J. S. schrieb:
> höre nicht auf das Geschrei vom Schlaumeier, der kennt offensichtlich
> den Unterschied zwischen bedingter Komplierung und Laufzeitabfragen
> nicht.

Der kennt ja auch nur Basic.

Allerdings schmeißt jeder anständige C-Compiler bei eingeschalteter 
Optimierung den Debug-Code auch schon zur Compilezeit raus. Der 
Unterschied zum define ist da eher theoretisch.

Oliver
Gast #7138638
Lesenswert?

Walter T. schrieb:
> Bist Du sicher, dass fread() chars einliest?

nö. Aber wozu auch?
1
       size_t fread(void *restrict ptr, size_t size, size_t nmemb,
2
                    FILE *restrict stream);
3

4
       The  function  fread() reads nmemb items of data, each size bytes long,
5
       from the stream pointed to by stream,  storing  them  at  the  location
6
       given by ptr.
#7139743
Lesenswert?

Jo schrieb:
> Leider weiß ich nicht warum dies so nicht funktioniert.

#define macht eine Textersetzung. Späteres Auftreten des Makro-Namens 
wird durch das, was beim #define dahinter stand, ersetzt. Also:

> #define FALSE = 0

Jedes 'FALSE' wird durch '= 0' ersetzt.

> #define TRUE = !FALSE

Jedes 'TRUE' wird durch '= !FALSE' und das wiederum durch '= !0' 
ersetzt.

> #define TEST FALSE

Jedes 'TEST' wird durch '= 0' ersetzt.

> int main()
> {
> #ifdef TEST == TRUE

Hier kommt also raus:
1
#ifdef = 0 == = !0

Es sollte nicht verwundern, dass das nicht funktioniert.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren