Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » HILFE !!!

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
22.02.2007, 14:13 Uhr
~Antonio
Gast


Hallo zusammen, ich hab n Programm gechrieben, das Dateien öffnet und liest, dabei unersucht die Datei, die Datei besteht aus 3 Spalten getrennt durch n Tab. s1 ist die Zeiz unwichtig, s2 ist die Spannung und s3 ist der Strom.
Das Programm soll dann s3 überprüfen und soalnge s3 < 5 soll s2 überprüft werden
z.b. s2 = 100 wenn s2 grösser wird z.b. 150 soll ein Zähler hochgezählt.
Am Ende soll das Resulatat in ein txt Datei geschrieben.
Mein Programm sieht so aus aber jedes mal wenn ich das Programm durchführe bekommen eine Meldung dass x und s1,s2,s3 nicht dklariert sind auch die Zähler:

C++:
#include <fstream>
#include<iostream>
#include<string>
using namespace std;

int main ()
{
  char * buffer;
  long size;
  float s1,s2,s3;    // Spalte 1,2,3.
  float x;            // Zahl s2 weitergeben an x
  int Zähler_N;        // Zähler_N: Normaler Puls "N",
  int Zähler_L;        // Zähler_L: Leerlauf Puls "L",
  int Zähler_K;        // Zähler_K: Kurzschluss Puls "K".
  int Zähler_S;        // Zähler_S: für Stromfunk, jedes mal wenn es Strom gibt,
                    //           Zähler wird hoch gezählt
  int Zähler_P;        // Zählt die Pausen

  std::ifstream in;
  float s1, s2, s3; // mit s1..s3 als float/double deklariert

  
  //__________________________ in Datei lesen __________________________

  ifstream infile ("Test_Signal.txt",ifstream::binary);//,ifstream::binary); // Datei öffnen und lesen

  while (!infile.eof())
  {
  //Zeilen lesen
  infile >> s1 >> s2 >> s3;  // infile.seekg(0); // mehrere Zeilen mit Werten gelesen werden

  //Schleife - Funktion
  if (s3<3)                        // Strom kleiner als 3 --> kein Stromfunk !
  {
    do
        {
            s2 = x;                        // Wert von s2 wird an x weitergegeben
            s2 = s2 + 3;                    // Pausen level wird festgelegt
            infile >> s1 >> s2 >> s3;           // wird weiter gelesen
            if (x>s2)
                {
                    Zähler_P = Zähler_P+1;    // Pausen werden gezählt
                }
            switch(Zähler_P)
            {
                case 1:
                    // cout << "Kurzschluss";
                    Zähler_K = Zähler_K + 1;
                    break;

                case 2:
                    // cout << "Normal";
                    Zähler_N = Zähler_N +1;
                    break;

                case >2:
                    // cout << "Leerlauf";
                    Zähler_L = Zähler_L + 1;
                    break;
            }
        }
    while ( x < s2 & s3 < 3);
    
    if (s3 > 3){ Zähler_S = Zähler_S+1;    }    // Stromfunken werden gezählt
    
    Zähler_K = Zähler_K + 1;
    Zähler_N = Zähler_N +1;
    Zähler_L = Zähler_L + 1;

  }

  infile.close();

  ofstream outfile ("new_Ergebnisse.txt",ofstream::binary);/
  outfile << Zähler_K <<"\n" << Zähler_N << "\n" << Zähler_L <<endl;
  outfile.close();
}



kann mir jemand helfen ?
Danke im Voraus


Bearbeitung von 0xdeadbeef:

CPP-Tags eingefügt. Nächstes mal selbst machen. Oh, und am Ende die fehlende Klammer eingefügt, sonst kompiliert das bestimmt nicht.


Dieser Post wurde am 22.02.2007 um 14:15 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
22.02.2007, 14:16 Uhr
0xdeadbeef
Gott
(Operator)


Du kannst in Variablennamen keine Umlaute benutzen. Außerdem wird

C++:
case >2:


nicht hinhauen. Außerdem fehlt dir noch irgendwo ne Klammer, ich vermute, vor infile.close();.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 22.02.2007 um 14:20 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
22.02.2007, 14:19 Uhr
~Antonio
Gast


das stimmt, das habe ich schon geändert aber trozdem bekomme ich die selbe Meldung ...
woran liegt es denn? musste inplizite deklariert ?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
22.02.2007, 14:38 Uhr
0xdeadbeef
Gott
(Operator)


ich hab den Kram mal durch indent gejagt ein paar eigene Kommentare rangeschrieben:

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

using namespace std;

int main()
{
    char *buffer;
    long size;
    float s1, s2, s3;
    float x;
    int Zaehler_N;
    int Zaehler_L;
    int Zaehler_K;
    int Zaehler_S;
    int Zaehler_P;

    // s1, s2 und s3 waren hier doppelt deklariert

    ifstream infile("Test_Signal.txt", ifstream::binary);

    while (!infile.eof()) {
        infile >> s1 >> s2 >> s3;

        if (s3 < 3) {
            do {
                s2 = x; // Wert von x wird an s2 weitergegeben. Wenn x
                        // den Wert von s2 haben soll, schreib x = s2;
                s2 = s2 + 3;
                infile >> s1 >> s2 >> s3; // Warum s2 verändern, wenn dus eh
                                          // gleich wieder überschreibst?
                if (x > s2) { // Da x immer noch uninitialisiert ist, macht das hier wenig Sinn
                    Zaehler_P = Zaehler_P + 1;
                }
                switch (Zaehler_P) {
                case 1:
                    Zaehler_K = Zaehler_K + 1;
                    break;

                case 2:
                    Zaehler_N = Zaehler_N + 1;
                    break;

                default: // quasi wie else. switch funktioniert anders als if, da wird in labels
                         // gesprungen. Deswegen funktioniert das auch nur mit integralen Typen
                    Zaehler_L = Zaehler_L + 1;
                    break;
                }
            } while (x < s2 & s3 < 3); // x ist immer noch uninitialisiert. Davon ab bin ich
                                       // mir grad unsicher, ob & stärker bindet als <, also
                                       // willst du hier wahrscheinlich ein logisches und (&&)

            if (s3 > 3) {
                Zaehler_S = Zaehler_S + 1;
            }

            Zaehler_K = Zaehler_K + 1;
            Zaehler_N = Zaehler_N + 1;
            Zaehler_L = Zaehler_L + 1;
        }

        infile.close();

        ofstream outfile("new_Ergebnisse.txt", ofstream::binary);
        outfile << Zae hler_K << "\n" << Zaehler_N << "\n" << Zaehler_L <<
            endl;
        outfile.close();
    }
// Und hier ist dir irgendwo ne Klammer verloren gegangen.


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 22.02.2007 um 14:41 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
22.02.2007, 14:49 Uhr
~Antonio
Gast


infile >> s1 >> s2 >> s3; // Warum s2 verändern, wenn dus eh
// gleich wieder überschreibst?
if (x > s2) { // Da x immer noch uninitialisiert ist, macht das hier wenig Sinn

hier sollte die 2-te Zeile gelesen und deshalb dann infile >>s1>>s2>>s3, werden und vergleichen quasi s2>x dann zählen ..

die Datei die ich beabreite enhält viele Zeilen, sind 3 Spalten getrennt durch n Tab ...
ich will eigentlich erstmal die erste Zeile lesen parameter festlegen, und dann weiter lesen.
s2 wird untersucht solange s3 < 3 ist, z.b. wenn s2 = 10 die aber in Zeile 7 grösser wird z.b. 15 indem Fall zähler inkrementieren... bis s3 > 3 ist (hier kommt n andere Zähler im Spiel der auch inkrementiert wird)

Danke für eure Hilfe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
22.02.2007, 15:45 Uhr
0xdeadbeef
Gott
(Operator)


Zunächst mal, du scheinst davon auszugehen, dass

C++:
int Zaehler_P;


Zaehler_P einen Wert zuweist (Analog für die anderen Variablen). Das ist aber nicht der Fall, x enthält hier das, was an der Stelle zufällig grad im Speicher steht. Bevor du die Variable also ausliest und ihren Wert benutzt, musst du ihr einen zuweisen. Am einfachsten, um hier zumindest definiertes Verhalten zu erzeugen,

C++:
int Zaehler_P = 0;


Ansonsten,

C++:
s2 = x;


bewirkt, dass s2 den Wert von x annimmt. x wird nicht verändert, und auch nicht irgendwie magisch mit s2 verknüpft, spätere Änderungen wie

C++:
s2 = s2 + 3; // am Rande: s2 += 3;


verändern x nicht. Und da du s2 danach mit einem Wert aus der Datei überschreibst, machen diese beiden Zeilen im Endeffekt so, wie sie dastehen, nichts, und das ziemlich langsam.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
22.02.2007, 20:45 Uhr
~Antonio
Gast


mein Programm sieht dann so aus:

C++:
#include <fstream>
#include<iostream>
#include<string>
using namespace std;

int main ()
{
  
  int Zaehler_N = 0;        // Zaehler_N: Normaler Puls "N",
  int Zaehler_L = 0;        // Zaehler_L: Leerlauf Puls "L",
  int Zaehler_K = 0;        // Zaehler_K: Kurzschluss Puls "K".
  int Zaehler_S = 0;        // Zaehler_S: für Stromfunk, jedes mal wenn es Strom gibt, Zaehler wird hoch gezaehlt
  int Zaehler_P = 0;        // Zaehlt die Pausen

  std::ifstream in;
  float s1, s2, s3;        // Spalten s1:Zeit, s2: Spannung, s3:Strom
// float x;                // Zahl s2 weitergeben an x
  
  //__________________________ in Datei lesen __________________________

  
  ifstream infile ("Test_Signal.txt",ifstream::binary);//,ifstream::binary); // Datei öffnen und lesen

  while (!infile.eof())
  {

  //Zeilen lesen
  infile >> s1 >> s2 >> s3;  // infile.seekg(0); // mehrere Zeilen mit Werten gelesen werden

  //Schleife - Funktion
  if (s3<3)                        // Strom kleiner als 3 --> kein Stromfunk !
  { float x;
    do
        {
            
            x = s2;                        // Wert von s2 wird an x weitergegeben
            s2 += 3;                    // Pausen level wird festgelegt
            infile >> s1 >> s2 >> s3;        // wird weiter gelesen
            //int Zaehler_P =0;
            if (s2 < x)
                {
                    Zaehler_P = Zaehler_P+1;    // Pausen werden gezaehlt
                }
            switch(Zaehler_P)
            {
                case 1:
                    // cout << "Kurzschluss";
                    Zaehler_K ++ ;// = Zaehler_K + 1;
                    break;

                case 2:
                    // cout << "Normal";
                    Zaehler_N = Zaehler_N +1;
                    break;

                case 3:
                    // cout << "Normal";
                    Zaehler_L = Zaehler_L + 1;
                    break;
                default: return 0;


                /*default:
                    // cout << "Leerlauf";
                    Zaehler_L = Zaehler_L + 1; */

            }
        }
        
    while ( s2 < x && s3 < 1);

    //int Zaehler_S =0;
    if (s3 > 3){ Zaehler_S ++;    }    // Stromfunken werden gezaehlt
    
    Zaehler_K = Zaehler_K + 1;
    Zaehler_N = Zaehler_N + 1;
    Zaehler_L = Zaehler_L + 1;

  }
  }

  infile.close();

  ofstream outfile ("Ergebnisse.txt",ios::out);//,ofstream::binary);//,ofstream::binary); // in Datei schreiben bzw. ausgeben
  outfile << "Kurzschluss"<<"  "<< "Normal"<<"  "<< "Leerlauf   " <<endl
          << Zaehler_K <<"  "<< Zaehler_N << "  " << Zaehler_L <<endl;
  outfile.close();
}


_______________________________________________________

es hat irgendwie nicht ganz geklappt, eine Datei Ergebnisse wurde kreiiert allerdings sah dann so aus:

Ergebnisse
Kurzschluss Normal Leerlauf 20 20 18

mag sein dass die Schleife nicht richtig läuft aber jetzt wenn ich mein Programm ausführe die Datei Ergebnisse wird garnich kreiirt und das iritiert mich ...
die Datei zum einselen (is n Beipsiel Datei) sieht dan so aus :

Test_Signal
1 0 0
2 0 0
3 0 0
4 0 0
5 5 1
6 0 0
7 0 0
8 0 0
9 0 0
10 0 0
11 5 0
12 5 0
13 5 0
14 5 0
15 5 1
16 0 0
17 0 0
18 0 0
19 0 0
20 0 0
21 5 0
22 5 0
23 5 0
24 5 0
25 5 0
26 10 0
27 10 0
28 10 0
29 10 0
30 10 0
31 20 0
32 20 0
33 20 0
34 20 0
35 20 1

meine Datei sehen allerdings anderes aus aber so ähnlich musste mein Programm die Datei lesen und bearbeiten... bin jetzt durcheinander ...
Hilfe !

Bearbeitung von 0xdeadbeef:

Benutz die verdammten cpp-tags in Zukunft selbst, oder ich fang hier noch an, Beiträge zu löschen.


Dieser Post wurde am 22.02.2007 um 22:30 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
22.02.2007, 20:49 Uhr
~Antonio
Gast


Die Test_signal Datei sieht dann so aus (die Tabs habe ich nur hier mit unterstriche versehen um die zu trenen, die unterstriche gibt es eigentlich nicht!)

s1_s2_s3
1 _0_ 0
2 _0_ 0
3 _0_ 0
4 _0_ 0
5 _5_ 1
6 _0_ 0
7 _0_ 0
8 _0_ 0
9 _0_ 0
10 _0_ 0
11 _5_0
12 _5_ 0
13 _5_ 0
14 _5_ 0
15 _5_ 1
16 _0_ 0
17 _0_ 0
18 _0_ 0
19 _0_ 0
20 _0_ 0
21 _5_ 0
22 _5_ 0
23 _5_ 0
24 _5_ 0
25 _5_ 0
26 _10_ 0
27 _10_ 0
28 _10_ 0
29 _10_ 0
30 _10_ 0
31_ 20_ 0
32_ 20_ 0
33_ 20_ 0
34_ 20_ 0
35_ 20_ 1
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
22.02.2007, 22:35 Uhr
0xdeadbeef
Gott
(Operator)


Joa, das sieht so aus als täte er, was du ihm sagst. Mir ist jetzt nicht ganz klar, was das Programm eigentlich machen soll.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
22.02.2007, 22:56 Uhr
~Antonio
Gast


Das Programm sollte der Unterschied zwischen 3 verschieden Pulsarten erkennen und die ausgeben.
Z.B:
Kurzschluss Puls --> der hat nur einmal den Wert 5 verläuft von 0 bis 5 (Spalte s1 Zeit)
Normal Puls --> der hat 5-mal den Wert 5 verläuft von 10 bis 25 (Spalte s1 Zeit)
Leerlauf puls --> der hat 5-mal den Wert 10 und 5-mal den Wert 20

Wenn man die Signal auf XY-Achse (Zeit- Spannung- und Strom -Achse) betrachtet dann sieht man wie der Signal aussieht.

Die Wert sind nur nen Beispiel, die gemessenen Werten sind allerdings Wilkürlich ...

Irgendwie muss das Programm den Anzahl der Pausen erkennen, die Pause ist wenn der Verlauf unverändert verläuft (hier Zählt der Zähler) sobald die Pause grösser wird z.b. Leerlauf von 10 auf 20, sollte der Zähler die Pause = 2 ausgeben hirdurch erkenne ich um welchen Puls es sich handelt.
Ich hoffe ich hab´s erklährt.

so Sieht mein Programm aus:
er Zählt nur die Stromfunken richtig aber Pulse erkennt nur einmal d.h. alle 3 Pulsen sind nur einmal vorhanden, die eigentlich 2-mal vorhanden sind !


C++:
#include <fstream>
#include<iostream>
#include<string>
using namespace std;

int main ()
{
  
  int Zaehler_N = 0;        // Zaehler_N: Normaler Puls "N",
  int Zaehler_L = 0;        // Zaehler_L: Leerlauf Puls "L",
  int Zaehler_K = 0;        // Zaehler_K: Kurzschluss Puls "K".
  int Zaehler_S = 0;        // Zaehler_S: für Stromfunk, jedes mal wenn es Strom gibt, Zaehler wird hoch gezaehlt
  int Zaehler_P = 0;        // Zaehlt die Pausen


  float s1, s2, s3;        // Spalten s1:Zeit, s2: Spannung, s3:Strom
  
  //__________________________ in Datei lesen __________________________

  
  ifstream infile ("Test_Signal.txt",ifstream::binary);//,ifstream::binary); // Datei öffnen und lesen

  while (!infile.eof())
  {

  //Zeilen lesen
  infile >> s1 >> s2 >> s3;    

  //Schleife - Funktion
  if (s3<3)                        // Strom kleiner als 3 --> kein Stromfunk !
  { float x;
    do
        {
            
            x = s2;                            // Wert von s2 wird an x weitergegeben
            x += 20;                        // Pausen level wird festgelegt
            infile >> s1 >> s2 >> s3;        // wird weiter gelesen
            
            if (s2 > x && s3 >=1)
                {
                    Zaehler_P += 1;    // Pausen werden gezaehlt
                }
                    switch(Zaehler_P)
                    {
                        case 1: // Kurzschluss
                        Zaehler_K += 1;
                        break;

                        case 2: // Normal;
                        Zaehler_N += 1;
                        break;

                        case 3: // Normal
                        Zaehler_L += 1;
                        break;
                    }
                
        }
        
    while ( s2 < x && s3 <= 1);

    //int Zaehler_S =0;
    if (s3 >=1){ Zaehler_S += 1;    }    // Stromfunken werden gezaehlt
    
    Zaehler_K = Zaehler_K + 1;
    Zaehler_N = Zaehler_N + 1;
    Zaehler_L = Zaehler_L + 1;

  }
  }

  infile.close();

    //__________________________ in Datei schreiben __________________________


  ofstream outfile ("Ergebnisse.txt",ios::out);//,ofstream::binary);//,ofstream::binary); // in Datei schreiben bzw. ausgeben
  outfile << "Kurzschluss"<<" "<< Zaehler_K << endl
          << "Normal"<< " "<<Zaehler_N << endl
          << "Leerlauf"<<" " << Zaehler_L<<endl
          << "Stromfunk"<<" "<<Zaehler_S<<endl;
          
  outfile.close();
}


_________________________________________________________

Danke für die Hilfe


Bearbeitung von 0xdeadbeef:

LETZE VERDAMMTE WARNUNG: Schreib um den Code cpp-tags. Auf der linken Seite ist sogar ein Link dafür, das ist nun wirklich nicht so schwer. Ohne die Tags kann keine Sau den Code lesen, und ich hab keine Lust, das jedes mal von Hand für dich zu machen.


Dieser Post wurde am 23.02.2007 um 00:19 Uhr von 0xdeadbeef editiert.
 
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: