Seite 1 von 1

Werte in ein Array schreiben

Verfasst: 15. Mai 2008 14:42
von Qt-nator
Hi,

ich hab folgenden Code der einwandfrei funktioniert und mir das Richtige ausgibt:

Code: Alles auswählen


else if(strLine.startsWith("[binary_section]"))
    {  
      ImportExport::nAnzahl = (ImportExport::nSizeV * ImportExport::nSizeU); 

      ImportExport::fBinaryArray[ImportExport::nAnzahl];

      QDataStream out(&file);

      float hutze;

      while(!file.atEnd())
      {  
        for(int i = 0; i <ImportExport::nAnzahl; i++)
        {
          out >> hutze;   

          qDebug() << QString::number(hutze); 

          qDebug() << i;

          //ImportExport::fBinaryArray[i] = hutze;
        }
      }      
    }

Aber wenn ich diesen Code das Hinzufüge:

Code: Alles auswählen

ImportExport::fBinaryArray[i] = hutze;
Dann stürzt das Programm ab.

Meine Frage jetzt ist das hier sofort ersichtlich oder müsste das so stimmen?

Verfasst: 15. Mai 2008 14:51
von Christian81
Was soll

Code: Alles auswählen

ImportExport::fBinaryArray[ImportExport::nAnzahl]; 
machen?

Wie ist ImportExport::fBinaryArray überhaupt definiert?

Verfasst: 15. Mai 2008 14:51
von PeterLustig
Benutz lieber Vectoren.

Verfasst: 15. Mai 2008 14:53
von Qt-nator
Definiert ist es so:

ImportEport.h

Code: Alles auswählen

  private:  

static float fBinaryArray[];
Und machen soll es:

Mir ein Array mit der Größe ImportExport::Anzahl erstellen.

Ja Vector hätte ich auch lieber genommen ... aber verlangt ist halt Array.

Verfasst: 15. Mai 2008 14:56
von PeterLustig
Du kannst einen statischen Array aber nicht zur Laufzeit die Größe definieren.

Verfasst: 15. Mai 2008 14:57
von RHBaum
Mal ne frage, welche Programmiersprache ist das ? ^^

-- ImportExport::nAnzahl = (ImportExport::nSizeV * ImportExport::nSizeU);
warum die klammern ?

-- ImportExport::fBinaryArray[ImportExport::nAnzahl];
was soll diese anweisung machen ? du referenzierst (wahrscheinlich) die erste adresse nach dem Array und tust damit gar nix ?

-- QDataStream out(&file);
out ? Suggeriert die tatsache, das du ueber diesen datenstrom was ausgeben willst ?

-- while(!file.atEnd())
warum fragst du dann die Position ab ?

-- out >> hutze;
Ahja, es ist nen eingabestrom :-) nenn es lieber in dann !

-- //ImportExport::fBinaryArray = hutze;
wenn das ned funktioniert, wuerd ich mich mal um den status des Arrays kuemmern ... ist das ordnungsgemaes allociert wurden ?
wie wurde das angelegt ? dynamisch / statisch .....

-- ImportExport::
ist das nen namespace, oder versteckst du variablen statisch hinter ner klasse ?

Ciao ....

Verfasst: 15. Mai 2008 14:59
von Qt-nator
Meine Variablen sind static:

ImportExport.h

Code: Alles auswählen


 private:  

    static double dVersion;

    static QString strDescription;

    static QString strUnit;

    static int nSizeU;

    static int nSizeV;

    static double dColorMapLowerLimit;

    static double dColorMapUpperLimit;

    static int nNumberOfPhases;

    static float fBinaryArray[];

    static int nAnzahl;

Code: Alles auswählen

ImportExport::fBinaryArray[ImportExport::nAnzahl];
Soll mir eigentlich das Array so groß machen wie nAnzahl. Du sagst das geht nicht ... da könnte ja dann auch der fehler liegen.

Verfasst: 15. Mai 2008 15:03
von Christian81
Qt-nator hat geschrieben: Soll mir eigentlich das Array so groß machen wie nAnzahl. Du sagst das geht nicht ... da könnte ja dann auch der fehler liegen.
Deshalb mal wieder unser Hinweis - kauf dir ein C -Buch und lerne erstmal die Grundlagen - das ist Basic C...

btw: Ich hätte ne QList<> benutzt

Verfasst: 15. Mai 2008 15:06
von Qt-nator
Ich hätte auch was anders benutzt wenn ich könnte...

Aber ich brauch nunmal ein Array.

Muss doch auch mit dem Array umzusetzen sein.

wenn ich mir ein Neues Array erstelle

Code: Alles auswählen

      int Anzahl = (ImportExport::nSizeV * ImportExport::nSizeU);

      float fArray[Anzahl];
krieg ich fehlermeldungen...

ImportExport.cpp(115): error C2057: Konstanter Ausdruck erwartet

ImportExport.cpp(115): error C2466: Reservierung eines Arrays der konstanten Größe 0 nicht möglich

ImportExport.cpp(115): error C2133: 'fArray': Unbekannte Größe

Bei meinem static Array aber nicht woran liegt das???

Verfasst: 15. Mai 2008 15:07
von PeterLustig
Qt-nator hat geschrieben:

Code: Alles auswählen

ImportExport::fBinaryArray[ImportExport::nAnzahl];
Soll mir eigentlich das Array so groß machen wie nAnzahl. Du sagst das geht nicht ... da könnte ja dann auch der fehler liegen.
Das geht aber nicht zur Laufzeit.. Und weil du es eben nicht vorher definierst, ist die Größe 0. Und wenn du dann etwas versuchst hinzuzufügen an einer nicht existierenden Stelle, dann raucht es ab weil du auf fremden Speicher schreiben willst.

Ich stimme Christian zu, kauf dir ein C-Buch (besser C++, da du ja offensichtlich C++ benutzen willst). Und warum darfst du keinen Vector benutzen? Du benutzt C++, darfst aber nicht die STL benutzen? Das ist eine ziemlich dämliche Beschränkung.


Edit:
Bei deinem Static-Array kommt as nicht, weil du keine Größe definierst. Da du es aber zur Compile-Zeit nicht füllst, ist die Größe des Arrays eben 0. Das kannst du zur Laufzeit auch nicht mehr ändern.

Verfasst: 15. Mai 2008 15:12
von RHBaum
warum sind die ganzen dinger static ?
Soll mir eigentlich das Array so groß machen wie nAnzahl. Du sagst das geht nicht ... da könnte ja dann auch der fehler liegen.
tuerlich geht das, nur ned so :-)

der C weg:

int size = 256;
float * myArray = malloc(size * sizeof(float));

// und freigeben nie vergessen !
free(myArray);

Nun koennte man davon ableiten, das der c++ weg folgender waere

int size = 256;
float * myArray = new float[size];
// und freigeben ned vergessen
delete[] nyArray;

Aber versuch es gar ned erst.
C++ ist :

int size = 256;
std::vector<float> myArray(size,0.0); // und gleich mit der richtigen groesse allocieren und alle elemente mit 0.0 belegen

// freigeben tut der zum glueck allein ^^

Unter qt gibts noch QVector, ich wuerd aber std::verctor empfehlen ...

Klassendesign ???
Also irgendwas ist da noch recht merkwuerdig :-)
Wenn du eh ne klasse hasst, solltest du sowieso ned auf die members direkt zugreifen lassen, sondern kapseln. Sowei man alle initialisierungen im konstruktor gemacht werden koennten ....

weiterhin bezweifle ich das die sache mit den static elementen da son sein sollte ....

Ciao ...

Verfasst: 15. Mai 2008 15:24
von Qt-nator
Ich habs jetzt so gemacht:

Code: Alles auswählen


 else if(strLine.startsWith("[binary_section]"))
    {  
   
      QDataStream out(&file);

      float hutze;

      int size = (ImportExport::nSizeV * ImportExport::nSizeU);
      
      std::vector<float> myArray(size,0.0); 

      while(!file.atEnd())
      {  
        for(int i = 0; i < size; i++)
        {
          out >> hutze;   

          myArray[i] = hutze;
        }
      }      
    }

so funkts auch... Aber ist das mit einem Array nicht zu Lösen?? ist ja jetzt ein Vector???

so gehts ^^

Code: Alles auswählen


float *Array = new float[size];