Problem mit array in printf befehl



  • 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 🙄


Anmelden zum Antworten