Array global nutzen
-
Danke!
Wenn ich das nun richtig verstanden habe, müsste das so klappen???? :double Cluster (double H[][], double S[][],double V[][], double Hs[][], double Ss[][],double Vs[][], double xmax, double ymax, double clust) {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; xmax = xmax/2; ymax = ymax/2; cout << endl <<"_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _" << endl << endl; cout << endl <<" Bild erfolgreich zum " << clust << "ten mal geclustert " << endl; cout << endl <<" aktuelle Aufloesung: " << xmax << " x " << ymax << " Pixel" << endl; cout << endl <<"_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _" << endl << endl; return xmax, ymax, clust; }
-
von der rechnerischen Seite kann ich nichts sagen, aber abgesehen davon, daß du bei mehrdimensionalen Arrays die inneren Größen fest vorgeben mußt (ala double H[800][]), sieht es in Ordnung aus.
PS: Sorgen bereiten mir jetzt noch die drei skalaren Parameter (double xmax, double ymax, double clust) und die Rückgabe:
* für Index-Werte solltest du lieber einen ganzzahligen Datentyp verwenden (int oder unsigned)
* skalare Werte werden kopiert, also sieht der Aufrufer nichts von den Berechnungen in Zeile 18-20. Die Lösung dafür lautet Übergabe per Referenz (d.h.int& xmax
)
* eine Funktion kann nur einen einzelnen Wert zurückgeben - und das ist bei dem in Zeile 27 verwendeten Komma-Operator der letzte Wert in der Reihe.
-
Da denkt man der Lösung einen schritt näher zu sein...
Was hälst du von meiner neusten Idee, das ganze geschickt in den Haupttext (in irgendeiner if-Schleife) einzubauen und mit "goto" Sprungmarken zu arbeiten, so dass ich gar keine Funktionen und Gültigkeitsbereiche brauche???
-
Wart du doch auch - wenn du die Größen erst zur Laufzeit wissen wilst, solltest du dich eventuell mit STL-Containern beschäftigen.
PS: von if-Schleifen und goto-Sprungmarken halte ich herzlich wenig, genauso wie von der Idee, alles in eine riesige Spagetti-Code-Funktion reinzupacken.
-
CStoll schrieb:
Wart du doch auch - wenn du die Größen erst zur Laufzeit wissen wilst, solltest du dich eventuell mit STL-Containern beschäftigen.
PS: von if-Schleifen und goto-Sprungmarken halte ich herzlich wenig, genauso wie von der Idee, alles in eine riesige Spagetti-Code-Funktion reinzupacken.
Ich bin auch kein Fan von riesigen Codeblöcken, aber wie gesagt die eiegtnliche Arbeit kommt noch...
Und auf die einfachste Lösung, das ganze zu verschachteln, bin ich vorher nicht gekommen ^^Soweit für die Nacht.
Morgen kommen dann sicher neue Fragen zu den anderen Problemen.
Vielen vielen Dank nochmal
Gute Nacht, bis morgen!p.s. gibt es eine maximale Befehlslänge?
In Visual Basic, hat nämlich eine riesenspaghetti schonmal alles gesprengt ^^
Dort konnte ich es aber einfach zerteilen und die Werte wurden in Zellen oder Felder gespeichert, so dass es keine Gültigkeitsprobleme gab.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!
-
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