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