Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » läft unter Windows aber nicht unter Linux

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
09.12.2003, 14:01 Uhr
~revolutz
Gast


Tachchen Allerseits !!!

Ich hab ein kleines Programm geschrieben, welches eine Textdatei zeilenweise einließt, die Zeilen von Ascii nach Float wandelt um sie dann als Float-Werte in ein dynamisch angelegtes Array zu schreiben. Das klappte nach einiger Hilfe von euch auch sehr gut. Unter Windows !!!
Jetzt möchte ich es unter Linux laufen lassen (benutze Kdevelop) und nichts funktioniert.
die Funktion size_t(...) läuft nicht (Programm wird abgebrochen)

und die Zeile: while(infile.getline(buffer,512) != NULL)

scheit auch irgendwie nicht OK zu sein.

Der Witz ist aber, daß es keine Fehlermeldungen vom Compiler gibt.

hier der Quelltext:



C++:
#include <iostream>                                    
#include <fstream>  
#include <iomanip>
#include <stdlib.h>                                  


;using namespace std;

void main(int argc, char *argv[])
{
    
// Variablen initialisieren

    int linecount = 0;
    char buffer[512];
    int line_count = 0;

// Abfrage ob Eingabe richtig

    if (argc != 3)
    {
        cerr << "\nFalsche Parameterzahl\n";
            exit(1);
    }

// Einlesen der Eingabedatei in String: "infile"

    ifstream infile(argv[1], ios::in);
    line_count = size_t(argv[1]);

    if(!infile)
    {
        cerr << "\nDatei konnnte nicht geladen werden.\n";
        exit(2);
    }

// dynamisches Array anlegen

    float *invalue = new float[line_count];
    
// Zeilenweise auslesen, in Float umwandeln und in Array schreiben

    while(infile.getline(buffer,512) != NULL)
    {
        linecount++;
        invalue[linecount] = atof(buffer);
        cout << invalue[linecount] << endl;
    }





Bearbeitung von loddab:
cpp-Tags gesetzt

Dieser Post wurde am 09.12.2003 um 14:07 Uhr von Loddab editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
09.12.2003, 20:34 Uhr
kronos
Quotenfisch
(Operator)


wie kompilierst du's denn?
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
09.12.2003, 21:29 Uhr
Pablo
Supertux
(Operator)


Und was genau läuft nicht? Außerdem hast du ein Semikolon vor using namepsace std;
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
09.12.2003, 23:36 Uhr
virtual
Sexiest Bit alive
(Operator)


size_t ist ein Typ, folglich ist

C++:
size_t(argv[1]);


Nicht etwa ein Funktionsaufruf, sondern ein Typcast übelster Sorte. (Was willst Du andieser Stelle eigentlich machen?) Vermutlich wirst Du unter linux mit Out Of memory Problemen zu tun haben... In argv[1] Steht normalerweise ein Zeiger auf einen Text. Unter UNIX liegt dieser Zeiger im Stack und hast damit einen recht großen Wert. Diesen Wert wandelst Du also nun in ein size_t (dh. einen Integer), und versuchst ganz dolle viel Speicher zu bekommen.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
10.12.2003, 10:47 Uhr
~revolutz
Gast


Also:

mit size_t(arg[1]) will ich die Zeilenanzahl der Textdatei auslesen. Ich hab diese Idee auch nur ausm Netz und verstehe sie nicht wirklich, da bei meinen kurzen Nachforschungen über size_t nicht zu ermitteln war, daß man damit irgendelche Zeilenanzahlen herausfinden kann. Es hat aber unter Windows funktioniert. Warum auch immer.
An genau dieser Stelle bricht das (ohne Fehlermeldungen oder Warnings) mit g++ kompilierte Programm ab (bzw wird beendet).
Wenn ich das Problem, die Zeilenanzahl herauszufinden anders löse oder auskommentiere und eine feste Zeilenanzahl vorgebe, bricht das (wiederum Fehlerfrei kompilierte) Programm an der Stelle:

while(infile.getline(buffer,512) != NULL)
{
linecount++;
invalue[linecount] = atof(buffer);
cout << invalue[linecount] << endl;
}

ab. Und zwar, nachdem es die Schleife einmal durchlaufen ist. Hab gerade erfahren, daß Linux die Abfrage: "alles NULL oder nicht" anders handelt, doch wie, daß hat man mir nicht gesagt.

Schöne Grüße,

revolutz
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
10.12.2003, 11:02 Uhr
(un)wissender
Niveauwart


Halt dich nicht an dem Namen size_t fest. Mit hoher Wahrscheinlichkeit ist size_t ein typedef für unsigned int.

C++:
size_t(arg[1]);
//ist wahrscheinlich das gleiche wie...
unsigned int(char *);



Ich glaube nicht, das du das willst, vor allem nicht, um dann Speicher zu allokieren.

Um die Zeilenanzahl zu bekommen, musst du die Linebreaks zählen, z.B. "\n";
512 Byte reichen ev. nicht aus, was ist denn, wenn in der Datei eine Zeile a 800 Zeichen steht?
Du zählst dann 2 Zeilen, ist aber nur eine.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
10.12.2003, 11:12 Uhr
(un)wissender
Niveauwart


Mir sind noch einige Sachen aufgefallen:
- bei mir läuft es auch nicht unter Windows (wie auch)
- du gibst den Speicher nicht wieder frei(bekommst ihn aber auch nie )
- du nimmst line_count als Index, allerdings ohne line_count vorher wieder auf 0 zu setzten, damit greifst du immer auf Speicher zurück, der dir nicht gehört, selbst wenn deine Allokation klappen sollte.

Schreib das ganz nochmal und zähle die Zeilenumbrüche.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
10.12.2003, 11:17 Uhr
(un)wissender
Niveauwart


Nachtrag:

Den Speicher bekomme ich schon (habe mich da geirrt, ist aber abhängig von der Adresse von arg[1], man kann sich also auf nichts verlassen.)

Es heißt nicht void main, sondern int main.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
10.12.2003, 11:36 Uhr
~revolutz
Gast


OK, ich habe "delete invalue" vergessen hinzuschreiben.
Den Zeilenzähler gib es allerdings zweimal: einmal linecount und einmal line_count. daher muß ich ihn nicht nochmal null setzen. Sind ja zwei verschiedene zähler. wär aber sicher eleganter nur einen zu nehmen und den auf Null zu setzen.

In meinen Zeilen stehen nie mehr als 30 Zeichen, daher ist der Buffer mit 512 eher überdimensioniert (kannste ja nich wissn).

Ach ja unter Windows hab ichs mit dem Visual Studio 6 kompiliert. Habe es gerade nochmal ausprobiert. mit genau diesem Quelltext:

C++:
#include <iostream>                                    
#include <fstream>  
                                

using namespace std;

void main(int argc, char *argv[])
{
    
// Variablen initialisieren

    int linecount = 0;
    char buffer[512];
    int line_count;

    

// Abfrage ob Eingabe richtig

    if (argc != 2)
    {
        cerr << "\nFalsche Parameterzahl\n";
            exit(1);
    }

// Einlesen der Eingabedatei in String: "infile"

    ifstream infile(argv[1], ios::in);
    line_count = size_t(argv[1]);

    if(!infile)
    {
        cerr << "\nDatei konnnte nicht geladen werden.\n";
        exit(2);
    }

// dynamisches Array anlegen

    float *invalue = new float[line_count];
    
// Zeilenweise auslesen, in Float umwandeln und in Array schreiben

    while(infile.getline(buffer,512) != NULL)
    {
        linecount++;
        invalue[linecount] = atof(buffer);
        cout << invalue[linecount] << endl;
    }

    delete invalue;

    return;

}


Funktioniert astrein (unter Windows). und gibt mir aus jeder Zeile die Zahl, die am Anfang steht auf dem Bildschirm aus und ignoriert den Rest jeder Zeile.
Die Textdatei sieht übriges prinzipiell so aus:

2.45 Zahl1
4.78 Zahl2
.
.
.


Kann mir Jemand was zu der Geschichte mit der NULL unter Linux sagen ??


Bearbeitung von loddab:
cpp-Tags gesetzt

Dieser Post wurde am 10.12.2003 um 12:35 Uhr von Loddab editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
10.12.2003, 12:37 Uhr
typecast
aka loddab
(Operator)


@revolutz: Benutz bitte mal die cpp-Tags
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: