Problem mit array in printf befehl
-
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