Problem mit array in printf befehl
-
Hi, ich bins wieder!
Hab mal wieder ein Problem.Ich habe mehreren O's auf mehreren Feldern eine zufällige Farbe über ein Array zugewiesen.
Das Array:
ifeld[ifelder]
Die Anzahl der Farben, die Hoehe und die Breite des Spielfelds wurden von mir vorher festgelegt.
Die Farbzuweisung mit printf:for(ihoehe=0; ihoehe<ihoehe1; ihoehe++) { for(ilaenge=0; ilaenge<=ilaenge1-1; ilaenge++) { ifeld[ifelder]=rand()%ifarben+1; SetConsoleTextAttribute(htextfarbe, ifeld[ifelder]); printf("O"); } printf("\n"); }
Nochmal der ganze Code vom Programm:
#include <cstdlib> #include <iostream> #include <conio.h> #include <windows.h> // GLOBALES HANDLE htextfarbe; COORD pos; unsigned int ipos; int ieingabe; int ibeenden; int ilaenge,ihoehe,ilaenge1,ilaenge2,ihoehe1,ifarben,ifelder; int ianzahl,ianzahl2; int iposition1,iposition2; // GLOBALES void spielfeld() { printf("Wie lang soll das Spielfeld sein?"); scanf("%i",&ilaenge); printf("Wie hoch soll das Spielfeld sein?"); scanf("%i",&ihoehe); printf("Wieviele Farben sollen benutzt werden?"); scanf("%i",&ifarben); ihoehe1=ihoehe; ilaenge1=ilaenge; ilaenge2=ilaenge1+1; system("cls"); ifelder = ihoehe*ilaenge; int ifeld[ifelder]; system("cls"); for(ihoehe=0; ihoehe<ihoehe1; ihoehe++) { for(ilaenge=0; ilaenge<=ilaenge1-1; ilaenge++) { ifeld[ifelder]=rand()%ifarben+1; SetConsoleTextAttribute(htextfarbe, ifeld[ifelder]); printf("O"); } printf("\n"); } pos.X=0; pos.Y=0; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); ipos = getch(); do //SCHLEIFE { ipos = getch(); switch(ipos) { case 72: if(pos.Y>=1) { pos.X = pos.X; // x-Position pos.Y = pos.Y-1; // y-Position SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); } else { 1; } break; case 75: if(pos.X>=1) { pos.X = pos.X-1; // x-Position pos.Y = pos.Y; // y-Position SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); } else { 1; } break; case 80: if(pos.Y<=ihoehe-2) { pos.X = pos.X; // x-Position pos.Y = pos.Y+1; // y-Position SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); } else { 1; } break; case 77: if(pos.X<=ilaenge-2) { pos.X = pos.X+1; // x-Position pos.Y = pos.Y; // y-Position SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); } else { 1; } break; case 13: int istelle,istelle1; istelle = ilaenge*pos.Y+pos.X+1; printf("%i",ifeld[istelle]); ////++++++++++++++++++ } }while(1); // SCHLEIFE } void hauptmenue() { htextfarbe = GetStdHandle(STD_OUTPUT_HANDLE); do { SetConsoleTextAttribute(htextfarbe, 14); printf("Hauptmenue:\n\n\n"); printf("Waehlen Sie aus, was Sie tun moechten:\n\n"); printf("1 - Neues Spiel \n"); printf("2 - Spiel laden\n"); printf("3 - Beenden\n\n"); printf("Was moechten Sie tun?: "); scanf("%i",&ieingabe); switch(ieingabe) { case 1: spielfeld(); break; case 2: printf("\nSpiel laden."); //Wird noch gemacht getch(); break; } getch(); system("cls"); SetConsoleTextAttribute(htextfarbe, 15); }while(1); }
Problemstelle mit //+++++++++++++++++++++++ markiert. Jetzt habe ich das Problem, dass jede Farbe ja eine zufällige Zahl hat. Die will ich mit dem printf-Befehl anzeigen lassen.
=> Die Stelle, an dem sich der Cursor befindet, soll auf Druck von Enter die Zahl der Farbe annehmen, die hier ist/war.
Die Stelle, an dem sich der Cursor befindet, kann ich erfolgreich abrufen, aber sobald ich die Stelle dann in das Array mit den Farben einfüge, dann krieg ich nur nen ziemlichen Humbug raus.
Hier nochmal ein Video, was ich für euch extra gemacht habe, um es ein wenig deutlicher zu machen:
http://www.youtube.com/watch?v=DPOnW1KeKDY
Am besten 1080p und Vollbild, dann erkennt mans am besten...
Danke für eure Hilfe
MfG
-
xkeks93x schrieb:
Das Array:
ifeld[ifelder]
Die Anzahl der Farben, die Hoehe und die Breite des Spielfelds wurden von mir vorher festgelegt.
Die Farbzuweisung mit printf:for(ihoehe=0; ihoehe<ihoehe1; ihoehe++) { for(ilaenge=0; ilaenge<=ilaenge1-1; ilaenge++) { ifeld[ifelder]=rand()%ifarben+1; SetConsoleTextAttribute(htextfarbe, ifeld[ifelder]); printf("O"); } printf("\n"); }
Dein Array ifeld wird in dieser Schleife nicht gefüllt. Mal angenommen, ifelder hat den Wert 20. Dann ist Dein Array ifeld[20], hat also die Indizes 0 bis 19. Du beschreibst in der Schleife aber immer dasselber Array-Element ifeld[ifelder], also ifeld[20], welches aber schon gar nicht mehr zum Array gehört. Die Elemente 0 bis 19 dagegen werden überhaupt nicht gefüllt.
-
Belli schrieb:
Dein Array ifeld wird in dieser Schleife nicht gefüllt. Mal angenommen, ifelder hat den Wert 20. Dann ist Dein Array ifeld[20], hat also die Indizes 0 bis 19. Du beschreibst in der Schleife aber immer dasselber Array-Element ifeld[ifelder], also ifeld[20], welches aber schon gar nicht mehr zum Array gehört. Die Elemente 0 bis 19 dagegen werden überhaupt nicht gefüllt.
Ja doch eigentlich schon, weil sonst würde es ja die O's gar nicht färben oder nicht?
Und falls ich falsch liege: Wie löst man das Problem bitte?
Ich dachte das wäre richtig, wenn das Array an jeder Stelle mit einer zufälligen Zahl aus ifarben gefüllt wird.
-
xkeks93x schrieb:
Belli schrieb:
Dein Array ifeld wird in dieser Schleife nicht gefüllt. Mal angenommen, ifelder hat den Wert 20. Dann ist Dein Array ifeld[20], hat also die Indizes 0 bis 19. Du beschreibst in der Schleife aber immer dasselber Array-Element ifeld[ifelder], also ifeld[20], welches aber schon gar nicht mehr zum Array gehört. Die Elemente 0 bis 19 dagegen werden überhaupt nicht gefüllt.
Ja doch eigentlich schon, weil sonst würde es ja die O's gar nicht färben oder nicht?
In der Schleife steht noch der richtige Wert an der Stelle (auch wenn du damit vermutlich eine andere Variable kaputt machst), aber am Ende der Schleife sind die Werte weg.
Und falls ich falsch liege: Wie löst man das Problem bitte?
Du mußt den Array-Index in der Schleife ermitteln aus ihoehe und ilaenge (wie genau hängt davon ab, in welcher Reihenfolge du die Spielfeld-Zeilen speichern willst).
-
xkeks93x schrieb:
Ich dachte das wäre richtig, wenn das Array an jeder Stelle mit einer zufälligen Zahl aus ifarben gefüllt wird.
Keine Ahnung, hängt vom weiteren Programm ab, aber vermutlich wäre es richtig, zumindest würde es Sinn machen. Aber: das machst Du ja nicht!
ifeld[ifelder]=rand()%ifarben+1;
schreibt doch immer an dieselbe Stelle im Array, weil der Wert von ifelder nie geändert wird. Und genaugenommen schreibt dieser Befehl nicht mal IN Dein Array, sondern ein Element dahinter, weil Dein Array ja mit
ifeld[ifelder]
definiert ist, und der Wert von ifelder sich seitdem nicht geändert hat.
Nochmal kurz zu Arrays:
Wenn Du ein Array
int arr[20];
hast, dann hat es die 20 Elemente arr[0] bis arr[19], arr[20] ist nicht mehr Bestandteil dieses Arrays.
Aber genau da liegt Dein Fehler, Du gibst ifelder irgendeinen Wert, legst Dein Array mit
ifeld[ifelder] an, und schreibst in der Schleife immer an die Stelle ifeld[ifelder], wobei der Wert von ifelder immer derselbe ist.Besser:
for(ihoehe=0; ihoehe<ihoehe1; ihoehe++) { for(ilaenge=0; ilaenge<=ilaenge1-1; ilaenge++) { ifeld[ihoehe * ilaenge1 + ilaenge]=rand()%ifarben+1; SetConsoleTextAttribute(htextfarbe, ifeld[ihoehe * ilaenge1 + ilaenge]); printf("O"); } printf("\n"); }
-
Habs jetzt so geändert, aber es kommt immernoch das gleiche raus
for(ihoehe=0; ihoehe<ihoehe1; ihoehe++) { for(ilaenge=0; ilaenge<=ilaenge1-1; ilaenge++) { for(ifelder=0;ifelder<=ifelder1;ifelder++) { ifeld[ifelder]=rand()%ifarben+1; SetConsoleTextAttribute(htextfarbe, ifeld[ifelder]); printf("O"); } } printf("\n"); }
Ich glaub ich mache irgendwas ganz simples falsch und ich komm nich drauf
//edit: ich werde mal deinen vorschlag testen, habe ihn eben gesehen
//edit2: Er bringt mir jetzt nur noch zufällige zahlen von 1-ifarben. Es soll ja so sein, dass die Farben nur einmal durch zufall ausgeteilt werden und ab dann beibehalten werden, aber so wies aussieht, werden sie immer wieder zufällig durchgemixt bzw. die Zahlen für (htextfarbe, ifeld[...]); werden gemixt.
-
xkeks93x schrieb:
Habs jetzt so geändert, aber es kommt immernoch das gleiche raus
[b]ifelder = 0;[/b] for(ihoehe=0; ihoehe<ihoehe1; ihoehe++) { for(ilaenge=0; ilaenge<=ilaenge1-1; ilaenge++) { ifeld[ifelder]=rand()%ifarben+1; SetConsoleTextAttribute(htextfarbe, ifeld[[b]ifelder++[/b]]); printf("O"); } printf("\n"); }
Das könntest Du mal so - fette Felder beachten - versuchen.
-
xkeks93x schrieb:
//edit2: Er bringt mir jetzt nur noch zufällige zahlen von 1-ifarben. Es soll ja so sein, dass die Farben nur einmal durch zufall ausgeteilt werden und ab dann beibehalten werden, aber so wies aussieht, werden sie immer wieder zufällig durchgemixt bzw. die Zahlen für (htextfarbe, ifeld[...]); werden gemixt.
Also so werden sie auf jeden Fall doch erst mal korrekt ins Array geschrieben, oder nicht? Was danach damit geschieht, ist ja wieder eine andere Sache und hat hiermit erst mal nix zu tun ...
-
Schon wieder fehlanzeige
Will doch nur, dass die Zahl, die im Normalfall SetConsoleTextAttribute(htextfarbe, HIER); drinsteht, im printf angezeigt wird
Kann es an dem rand()-Befehl liegen? Die Schleife läuft ja jedes mal neu runter, also dass das Array jedes mal neu mit zufälligen Zahlen gefüllt wird
-
Häh? Die Schleife wird doch nur ein einziges Mal ausgeführt ... oder übersehe ich da was?
Es wird eher an Deinen Positionsberechnungen liegen, zB
istelle = ilaenge*pos.Y+pos.X+1; beim Auslesen des Arrays
entspricht ja nicht der Berechnung
ifeld[ihoehe * ilaenge1 + ilaenge]=rand()%ifarben+1;
beim Beschreiben des Arrays.Um damit nicht durcheinanderzukommen, könntest Du zB die Cursorposition direkt auslesen mit
GetConsoleScreenBufferInfo
und die Farbe an der Stelle direkt mit
ReadConsoleOutputAttribute
aus der Konsole lesen ...Sonst probier beim Auslesen mal:
istelle = ilaenge1 * pos.Y + pos.X;
-
Belli schrieb:
Sonst probier beim Auslesen mal:
istelle = ilaenge1 * pos.Y + pos.X;Genau das geht! Danke vielmals
-
Weil ich grad Langeweile hatte:
#include <windows.h> #include <time.h> #include <stdlib.h> unsigned char GetFarbe(int x, int y) { WORD Attribut; DWORD dummy; COORD pos; pos.X = x; pos.Y = y; ReadConsoleOutputAttribute(GetStdHandle(STD_OUTPUT_HANDLE), &Attribut, 1, pos, &dummy); return Attribut & 0x0F; } void SetCursorPosition(int x, int y) { COORD pos; pos.X = x; pos.Y = y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); } void SetCursorVisible(BOOL v) { CONSOLE_CURSOR_INFO ci; GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &ci); ci.bVisible = v; SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &ci); } void DruckSimpleText(int x, int y, char const *text) { COORD target; DWORD written; target.X = x; target.Y = y; WriteConsoleOutputCharacter(GetStdHandle(STD_OUTPUT_HANDLE), text, strlen(text), target, &written); } void DruckSimpleChar(int x, int y, char c) { char text[2]; text[0] = c; text[1] = 0; DruckSimpleText(x, y, text); } void ClearScreen(void) { CONSOLE_SCREEN_BUFFER_INFO csbi; COORD target; DWORD written; target.X = 0; target.Y = 0; GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi); FillConsoleOutputCharacter(GetStdHandle(STD_OUTPUT_HANDLE), ' ', csbi.dwSize.X * csbi.dwSize.Y, target, &written); FillConsoleOutputAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7, csbi.dwSize.X * csbi.dwSize.Y, target, &written); } int getInput() { INPUT_RECORD ir; DWORD dummy; do { ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE), &ir, 1, &dummy); }while(ir.EventType != KEY_EVENT || ir.Event.KeyEvent.bKeyDown); return ir.Event.KeyEvent.uChar.AsciiChar; } void SetWindowExt(int x, int y) { SMALL_RECT sr_window; COORD extension; sr_window.Left = 0; sr_window.Top = 0; sr_window.Right = x - 1; sr_window.Bottom = y - 1; extension.X = x; extension.Y = y; SetConsoleWindowInfo (GetStdHandle(STD_OUTPUT_HANDLE), TRUE, &sr_window); SetConsoleScreenBufferSize (GetStdHandle(STD_OUTPUT_HANDLE), extension); } void buildSpielFeld(int left, int top, int right, int bottom) { int len, i, i1; char *zeile; WORD *attrib; char color; COORD pos; DWORD dummy; len = right - left + 2; zeile = malloc(len); attrib = malloc(len * sizeof(WORD)); for(i = 0; i < len; ++i) zeile[i] = 'O'; zeile[len - 1] = 0; for(i = 0; i < len; ++i) { color = rand() % 15; if(color == 7) color = 15; attrib[i] = color | 0x70; } pos.X = left; for(i = top; i <= bottom; ++i) { for(i1 = 0; i1 < len; ++i1) { color = rand() % 15; if(color == 7) color = 15; attrib[i1] = color | 0x70; } DruckSimpleText(left, i, zeile); pos.Y = i; WriteConsoleOutputAttribute(GetStdHandle(STD_OUTPUT_HANDLE), attrib, right - left + 1, pos, &dummy); } free(zeile); free(attrib); } void workSpielFeld(int left, int top, int right, int bottom) { char in; COORD csrPos; int farbNr; char farbTxt[3]; SetCursorPosition(left, top); csrPos.X = left; csrPos.Y = top; do { switch(in = getInput()) { case 72: csrPos.Y--; if(csrPos.Y < top) csrPos.Y = bottom; SetCursorPosition(csrPos.X, csrPos.Y); break; case 75: csrPos.X--; if(csrPos.X < left) csrPos.X = right; SetCursorPosition(csrPos.X, csrPos.Y); break; case 80: csrPos.Y++; if(csrPos.Y > bottom) csrPos.Y = top; SetCursorPosition(csrPos.X, csrPos.Y); break; case 77: csrPos.X++; if(csrPos.X > right) csrPos.X = left; SetCursorPosition(csrPos.X, csrPos.Y); break; case 13: farbNr = GetFarbe(csrPos.X, csrPos.Y); itoa(farbNr, farbTxt, 10); DruckSimpleText(3, 35, "Farbe an Cursorposition:"); DruckSimpleText(28, 35, " "); DruckSimpleText(28, 35, farbTxt); break; } } while(in != 'x'); } int main() { int i; int f; char buf[4]; srand(time(0)); SetWindowExt(40, 40); ClearScreen(); buildSpielFeld(13, 13, 27, 27); workSpielFeld(13, 13, 27, 27); //ClearScreen(); }
-
Danke, werds mir mal anschauen.
//edit:
zeile = malloc(len); attrib = malloc(len * sizeof(WORD));
131: invalid conversion from `void*' to `char*'
132: invalid conversion from `void*' to `WORD*'Und nebenbei:
for(istelle;istelle<=inaechstehoehe;istelle++) { if(ifeld[istelle]==ifeld[istelle1]) { izaehler++; } else { goto abbruch; } } abbruch:; printf("%i",izaehler);
Gibts ne Möglichkeit das goto zu umgehen?
-
Kann es sein, dass Du einen c++ - Compiler benutzt? Dann musst Du den Rückgabewert von malloc natürlich in den gewünschten Typ casten - allerdings ist das ganze C - Code (weil Dein geposteter Code auch C - Code ist/war) und ein C-Compiler sollte das wie gepostet übersetzen.
In C++ hätte man möglicherweise einiges anders gemacht, auf jeden Fall hätte man malloc gar nicht benutzt.
Ansonsten:for(istelle;istelle<=inaechstehoehe;istelle++) { if(ifeld[istelle]==ifeld[istelle1]) { izaehler++; } else { break; } } printf("%i",izaehler);
-
Problem gelöst, allerdings musste ich ein neues Programm anfangen