Array global nutzen
-
Grunert schrieb:
p.s. gibt es eine maximale Befehlslänge?
Im Standard ist so manches gefordert.
— Nesting levels of compound statements, iteration control structures, and selection control structures [256].
— Nesting levels of conditional inclusion [256].
— Number of characters in an internal identifier or macro name [1 024].
— Number of characters in an external identifier [1 024].
— External identifiers in one translation unit [65 536].
— Parameters in one function definition [256].
— Characters in one logical source line [65 536].
Wenn Du tatsächlich gegen diese Grenzen stößt, müssen wir uns vielleicht doch mal über Deinen Programmierstil unterhalten.
-
Grunert schrieb:
Das bringt mich auf eine andere Idee!
Die Daten in einer Datei, z.B. txt Datei zu speichern, wäre doch auch eine Idee?
Oder wie lagert man am besten Daten aus?
Brauche ich nämlich spätestens beim Speichern der Kalibrierungswerte!Ja, du kannst die Werte natürlich auch ausdrucken und dann von Hand wieder eingeben
Aber ansonsten empfehle ich dir doch eher einen Blick in die Containerklassen der STL - für dich könnte da ein vector<vector<double>> oder auch ein vector<double> (mit manueller Koordinaten-Umrechnung) hilfreich sein - zur Not in einer "picture"-Klasse gekapselt, die sich um die Größen-Verwaltung kümmert.
(PS: die von volkard genannten Werte sind nur die untere Grenze - es kann durchaus sein, daß ein Compiler mehr erlaubt)
-
CStoll schrieb:
Grunert schrieb:
Das bringt mich auf eine andere Idee!
Die Daten in einer Datei, z.B. txt Datei zu speichern, wäre doch auch eine Idee?
Oder wie lagert man am besten Daten aus?
Brauche ich nämlich spätestens beim Speichern der Kalibrierungswerte!Ja, du kannst die Werte natürlich auch ausdrucken und dann von Hand wieder eingeben
Aber ansonsten empfehle ich dir doch eher einen Blick in die Containerklassen der STL - für dich könnte da ein vector<vector<double>> oder auch ein vector<double> (mit manueller Koordinaten-Umrechnung) hilfreich sein - zur Not in einer "picture"-Klasse gekapselt, die sich um die Größen-Verwaltung kümmert.
(PS: die von volkard genannten Werte sind nur die untere Grenze - es kann durchaus sein, daß ein Compiler mehr erlaubt)
Ok danke
Gibt also keine Möglichkeit das ganze in irgeneiner anderen Datei auszulagern?
Ich denke da spontan an den Tagestipp, der ja auch aus einer txt seine Werte/sprüche bezieht.Wenn du mir nicht mehr Tipps/Links/Beispielcodes an die Hand gibst, werde ich nach dem Schlaf Spaghetti machen
Grüße
Grunert
-
Wie gesagt, klar geht das. Aber es ist um Längen langsamer als die Übergabe per Array oder vector.
Hmm, ich würde es so lösen (nur grob skizziert):
class Picture { vector<double> werte; unsigned hoehe, breite; public: Picture(unsigned h, unsigned b) : werte(h*b), hoehe(h), breite(b) {} double& operator()(int x, int y) { return werte[x+y*breite]; } unsigned Breite() { return breite; } unsigned Hoehe() { return hoehe; } ... }; Picture cluster(const Picture& src) { Picture res(src.Hoehe()/2,src.Breite()/2); ...//die Punkte des Ziel-Bildes berechnen return res; }
-
Hallo
habe nun versucht das ganze wie gesagt "idiotensicher" mit goto zu machen...
Hat einer vielleicht eine Idee, was da schon wieder schiefgegangen ist?
Wollte heute eigentlich den nächsten Schritt angehen
Vielen vielen Dank schonmal, an den der sich durch meinen Datenmüll kämpft!Kompilieren klappt wunderbar, nur kommt beim Ausführen folgender Error:
"Auto Chrom.exe": "D:\Auto Chrom\Debug\Auto Chrom.exe" geladen, Symbole wurden geladen.
"Auto Chrom.exe": "C:\WINDOWS\system32\ntdll.dll" geladen, Cannot find or open the PDB file
"Auto Chrom.exe": "C:\WINDOWS\system32\kernel32.dll" geladen, Cannot find or open the PDB file
"Auto Chrom.exe": "C:\WINDOWS\system32\msvcp100d.dll" geladen, Symbole wurden geladen.
"Auto Chrom.exe": "C:\WINDOWS\system32\msvcr100d.dll" geladen, Symbole wurden geladen.
Eine Ausnahme (erste Chance) bei 0x00415257 in Auto Chrom.exe: 0xC00000FD: Stack overflow.
Unbehandelte Ausnahme bei 0x00415257 in Auto Chrom.exe: 0xC00000FD: Stack overflow.
Eine Ausnahme (erste Chance) bei 0x00415257 in Auto Chrom.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00030000.
Unbehandelte Ausnahme bei 0x00415257 in Auto Chrom.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x0003000Zum besseren Verständnis meines Programms, habe mir Waypointmarker gesetzt, die wie boolean agieren. Damit ich weiß, von wo ich gekommen bin und was ich ausführen möchte.
#include <iostream> #include <iomanip> #include <math.h> //#include <CImg.h> // #include <cv.h> // #include <cxcore.h> // #include <highgui.h> // #include <cstdlib> // #include <conio.h> using namespace std; int main() { const int xmax=800; const int ymax=600; int xr = 400; int yr = 400; //reale Auflösung int hsv=0; //Schalter, ob HSV-Konvertierung durchgeführt int clust=0; //waypoints für das Auswerten, Kalibrieren.... int wa=0; int wka=0; //aktive waypoints fürs clustern, fehlerpixel und rgb in hsv int awc=0; int awf=0; int awh=0; //initiere alle Speicherarrays double ROT[xmax+1][ymax+1]; double GRUEN[xmax+1][ymax+1]; double BLAU[xmax+1][ymax+1]; double H[xmax+1][ymax+1]; double S[xmax+1][ymax+1]; double V[xmax+1][ymax+1]; double Hs[xmax+1][ymax+1]; double Ss[xmax+1][ymax+1]; double Vs[xmax+1][ymax+1]; double Hm[xmax+1][ymax+1]; double Sm[xmax+1][ymax+1]; double Vm[xmax+1][ymax+1]; /* if (hsv==1) {cout << endl <<"_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _" << endl; cout << endl <<" Bild wurde bereits in HSV-Spektrum umgewandelt " << endl; cout << endl <<"_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _" << endl << endl; return 0; } */ Cluster: if (awc==1) {int f=1; int g=1; //f entspricht x und g entspricht y for (int i=1; i<=ymax-1; i=i+2) {for (int j=1; j<=xmax-1; j=j+2) { Hs[f][g]=(H[j][i]+H[j+1][i]+H[j][i+1]+H[j+1][i+1])/4; Ss[f][g]=(S[j][i]+S[j+1][i]+S[j][i+1]+S[j+1][i+1])/4; Vs[f][g]=(V[j][i]+V[j+1][i]+V[j][i+1]+V[j+1][i+1])/4; H[f][g]=Hs[f][g]; S[f][g]=Ss[f][g]; V[f][g]=Vs[f][g]; f=f+1; } g=g+1; } clust = clust+1; xr = xr/2; yr = yr/2; cout << endl <<"_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _" << endl << endl; cout << endl <<" Bild erfolgreich zum " << clust << "ten mal geclustert " << endl; cout << endl <<" aktuelle Aufloesung: " << xr << " x " << yr << " Pixel" << endl; cout << endl <<"_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _" << endl << endl; awc=0; if (wka==1) {wka=0; goto KalAuswerten;} else if (wa==1) {wa=0; goto Auswerten;} } RGBinHSV: if (awh==1) {double MAX=0; double MIN=0; for (int i=1; i<=ymax; i++) {for (int j=1; j<=xmax; j++) {//setzt R,B,B auf 0=false und 1=MAX 2=MIN int R=0; int G=0; int B=0; if (ROT[j][i]>BLAU[j][i] && ROT[j][i]>GRUEN[j][i]) {MAX=ROT[j][i]; R=1; } if (GRUEN[j][i]>ROT[j][i] && GRUEN[j][i]>BLAU[j][i]) {MAX=GRUEN[j][i]; G=1; } if (BLAU[j][i]>ROT[j][i] && BLAU[j][i]>GRUEN[j][i]) {MAX=BLAU[j][i]; B=1; } if (ROT[j][i]<BLAU[j][i] && ROT[j][i]<GRUEN[j][i]) {MAX=ROT[j][i]; R=2; } if (GRUEN[j][i]<ROT[j][i] && GRUEN[j][i]<BLAU[j][i]) {MAX=GRUEN[j][i]; G=2; } if (BLAU[j][i]<ROT[j][i] && BLAU[j][i]<GRUEN[j][i]) {MAX=BLAU[j][i]; B=2; } if (MIN=MAX) {H[j][i]=0; } else if(R=1) {H[j][i]=60*(0+(GRUEN[j][i]-BLAU[j][i])/(MAX-MIN)); } else if(G=1) {H[j][i]=60*(2+(BLAU[j][i]-ROT[j][i])/(MAX-MIN)); } else //(B=1) {H[j][i]=60*(4+(ROT[j][i]-GRUEN[j][i])/(MAX-MIN)); } S[j][i]=(MAX-MIN)/MAX; V[j][i]=MAX/255; cout << endl <<"_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _" << endl; cout << endl <<" Bild erfolgreich in HSV-Spektrum umgewandelt " << endl; cout << endl <<"_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _" << endl << endl; hsv=1; } } awh=0; if (wka==1) {wka=0; goto KalAuswerten;} else if (wa==1) {wa=0; goto Auswerten;} } Fehler: if (awf==1) {int t=10; cout << endl <<"Bitte Abweichungstoleranz in Prozent eingeben:" << endl; cin >> t; t=1+t/10; int fehl=0; for (int i=2; i<=ymax-1; i++) {for (int j=2; j<=xmax-1; j++) { Hm[j][i]=(H[j-1][i-1]+H[j][i-1]+H[j+1][i-1]+H[j-1][i]+H[j+1][i]+H[j-1][i+1]+H[j][i+1]+H[j+1][i+1])/8; Sm[j][i]=(S[j-1][i-1]+S[j][i-1]+S[j+1][i-1]+S[j-1][i]+S[j+1][i]+S[j-1][i+1]+S[j][i+1]+S[j+1][i+1])/8; Vm[j][i]=(V[j-1][i-1]+V[j][i-1]+V[j+1][i-1]+V[j-1][i]+V[j+1][i]+V[j-1][i+1]+V[j][i+1]+V[j+1][i+1])/8;; if (H[j][i] >= Hm[j][i]*t) {H[j][i] = Hm[j][i]; } if (S[j][i] >= Sm[j][i]*t) {S[j][i] = Sm[j][i]; } if (V[j][i] >= Vm[j][i]*t) {V[j][i] = Vm[j][i]; fehl=fehl+1; } } } cout << endl <<"_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _" << endl << endl; cout << endl <<" Fehlerpixel erfolgreich entfernt " << endl; cout << endl <<" " << fehl << " Fehlerpixel " << endl; cout << endl <<" aktuelle Aufloesung: " << xr << " x " << yr << " Pixel" << endl; cout << endl <<"_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _" << endl << endl; awf=0; if (wka==1) {wka=0; goto KalAuswerten;} else if (wa==1) {wa=0; goto Auswerten;} } //------------------------------------------- //HIER BEGINNT DAS EIGENTLICHE PROGRAMM: //------------------------------------------- int pause; Hauptmenue: cout << endl <<"_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _" << endl << endl; //Trennstrich cout << " [ Hauptmenue ] " << endl << endl; cout << "(1) Kalibrierung durchfuehren" << endl; cout << "(2) Bild auswerten" << endl; cout << "(3) Beenden" << endl << endl; char a; char b; char c; cin >> a; cout << endl <<"_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _" << endl << endl; //Trennstrich if (a == '1') {Kalibrieren: cout << endl << " [ Kalibriere ] " << endl << endl; cout << "(1) neues Bild hinzufuegen" << endl; cout << "(2) Daten anzeigen" << endl; cout << "(3) Daten loeschen" << endl; cout << "(4) zurueck zum Hauptmenue" << endl << endl; cin >> b; if (b == '1') {cout << endl << "Bitte die Temperatur in °C eingeben:" << endl << endl; double bildtemp; cin >> bildtemp; cout << endl << "Bitte den Namen des Bildes eingeben:" << endl << endl; //std::string bildname; //cin >> bildname; hsv=0; wka=1; wa=0; awh=1; goto RGBinHSV; KalAuswerten: cout << "(1) Kalibrierung durchführen" << endl; cout << "(2) Bildpunkte clustern" << endl; cout << "(3) Fehlerpixel entfernen" << endl; cout << "(4) zurück zum vorherigen Menue" << endl; cout << "(5) zurueck zum Hauptmenue" << endl << endl; cin >> c; if (c == '1') {//Auswerten(); } else if (c == '2') {awc=1; goto Cluster; } else if (c == '3') {awf=1; goto Fehler; } else if (c == '4') {goto Kalibrieren; } else {goto Hauptmenue; } } else if (b == '2') {cout << endl << " [ Kalibrierungsdaten ] " << endl << endl; //cout DATEN cout << "(1) Daten ausdrucken" << endl; cout << "(2) zurueck zum Hauptmenue" << endl << endl; cin >> c; if (c == '1') { } else {goto Hauptmenue; } } else if (b == '3') { } else {goto Hauptmenue; } } else if (a == '2') {cout << endl << " [ Bilderauswertung ] " << endl << endl; cout << endl << "Bitte Name des Bildes eingeben:" << endl << endl; //std::string bildname; //cin >> bildname; hsv=0; if (hsv==0) {awh=1; wa=1; wka=0; goto RGBinHSV; } Auswerten: cout << "(1) auswerten" << endl; cout << "(2) Bildpunkte clustern" << endl; cout << "(3) Fehlerpixel entfernen" << endl; cout << "(4) zurueck zum Hauptmenue" << endl << endl; cin >> b; if (b == '1') {//Auswerten(); } else if (b == '2') {awc=1; goto Cluster; } else if (b == '3') {awf=1; goto Fehler; } else {goto Hauptmenue; } } else {cout << endl << "Programm wird beendet, weiter mit beliebiger Taste" << endl << endl; cin >> pause; return 0; } cout << endl << "Programm wird beendet, weiter mit beliebiger Taste" << endl << endl; cin >> pause; return 0; }
-
Steht doch schon in der Ausgabe des Compilers
Eine Ausnahme (erste Chance) bei 0x00415257 in Auto Chrom.exe: 0xC00000FD: Stack overflow.
Also du hast die größe des Stack überschritten, denn dieser ist glaub ich im Normalfall auf 1 MB eingestellt. und wenn ich mich nicht verrechnet habe verbrauchen deine 12 Arrays die du auf den Stack erzeugst so 5,4 MB. Ergo solltest du die Arrays nicht auf dem Stack erstellen sondern mit new reservieren.
-
Vielen vielen Dank!
Was würde ich nur ohne deine Antworten machen? ^^Habe die Felder nun einfach vor dem Stack initiert und noch einige kleinere Fehler bereinigt.
-
Scheint nun richtig gut zu laufen, leider tritt beim Clustern noch ein Problem samt Absturz auf:
"Auto Chrom.exe": "D:\Auto Chrom\Debug\Auto Chrom.exe" geladen, Symbole wurden geladen.
"Auto Chrom.exe": "C:\WINDOWS\system32\ntdll.dll" geladen, Cannot find or open the PDB file
"Auto Chrom.exe": "C:\WINDOWS\system32\kernel32.dll" geladen, Cannot find or open the PDB file
"Auto Chrom.exe": "C:\WINDOWS\system32\msvcp100d.dll" geladen, Symbole wurden geladen.
"Auto Chrom.exe": "C:\WINDOWS\system32\msvcr100d.dll" geladen, Symbole wurden geladen.
Eine Ausnahme (erste Chance) bei 0x0041165b in Auto Chrom.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0x015c8a98.
Unbehandelte Ausnahme bei 0x0041165b in Auto Chrom.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0x015c8a98.
Das Programm "[552] Auto Chrom.exe: Systemeigen" wurde mit Code 0 (0x0) beendet.Irgendeine Lösungsidee?
Selbst mit 2x zwei forschleifen tritt das Problem auf.
(in einer wird der Mittelwert berechnet, und ganz danach erst der Mittelwert in das alte Feld geschrieben.)
-
Na sagt doch schon die Fehlermeldung, du schreibst über den reservierten Speicher hinaus, oder zumindest auf eine Adresse die du nicht Reserviert hast. Also wirst du schauen müssen an welcher Stelle du eine Speicherüberschreitung hast, sollte dir aber der Compiler anzeigen wo das Problem auftritt.
-
Sooo, habe die GoTos über den Haufen geschmissen.
Leider immernoch den Fehler.Konnte den Fehler jetzt auf dieses Programmstück zurückverfolgen:
Wobei Yreal=Xreal=400 (zwar etwas anders als davor ist, aber gleicher Fehler/Absturz)
Und die Arrays jeweeils [401][401] groß sind, also 400 Speicherplätze ab 1 haben.Selbst wenn ich die Forschleifen nur bis 200 laufen lassen stürzt es ab
Läuft beim addieren der Felder was falsch? oOint f=1; int g=1; //f entspricht x und g entspricht y for (int i=1; i<Yreal[0]; i=i+2) {for (int j=1; j<Xreal[0]; j=j+2) { Hs[f][g]=(H[j][i]+H[j+1][i]+H[j][i+1]+H[j+1][i+1])/4; Ss[f][g]=(S[j][i]+S[j+1][i]+S[j][i+1]+S[j+1][i+1])/4; Vs[f][g]=(V[j][i]+V[j+1][i]+V[j][i+1]+V[j+1][i+1])/4; f=f+1; } g=g+1; }
-
Du hast vergessen, f wieder zurückzusetzen, da stehen die Chancen gut, daß es im Laufe der Berechnungen über die Array-Größe hinausläuft (dürfte am Ende bei ca. 160000 ankommen).
PS: Sind Xreal und Yreal jetzt die Größenwerte oder sind das Arrays?
-
CStoll schrieb:
Du hast vergessen, f wieder zurückzusetzen, da stehen die Chancen gut, daß es im Laufe der Berechnungen über die Array-Größe hinausläuft (dürfte am Ende bei ca. 160000 ankommen).
PS: Sind Xreal und Yreal jetzt die Größenwerte oder sind das Arrays?
Ohje
DANKE!
Sind Arrays