ein (normales) Quadrat erstellen

Hallo,

wenn du das Macro auskommentierst mit "//" dann ist natürlich MAX nicht mehr definiert und wird im Precompiler nicht mehr durch den Wert 5 ersetzt.

In deinem Fall bedeutet dass, dass du die MAX durch deine Variable "max" ersetzen musst. Ausserdem musst du auf die Schreibweise achten. Du deklarierst die Variable als "int max;" und greifst eine Zeile später in der scanf Methode auf die Variable "Max"(mit großem M) zu, die es nicht gibt.

Die "]" "[" in deinem obigen Beispiel, sind die erst hier im Forum dazu gekommen oder stehen die tatsächlich in deinem Source Code (wo sie nichts zu suche haben)?

Gruß

Edit: Mist, habe zu lange zum tippen gebraucht. ;)
 
ich möchte mich nochmals für die Hilfe bedanken!

HTML:
#include <stdio.h>
//#include <windows.h>
#include <time.h>
//#define MAX
 
void main()
{	int  max;
	scanf("%d",&max);
    int feld[max][max]={0};
    int k,i,j,a;
	  
    srand(time(0));
 
        k=1;
        for(i=0;i<max;i++)
        {
            for(j=0;j<max;j++)
            {
                feld[i][j]=rand() % 1000 + 0;
               
                printf("Nr.%2i:\t%2i\n",k,feld[i][j]);
 
                k++;
            }
        }
}


ich habe aber Compilerfehler, außerdem versuch ich %1000 durch max*max zu ersetzen ( also wenn max=5, dann Zufallszahlen in der Größe 5x5=25 verwenden); ich spürs jucken nur ich sehs einfach nicht


edit:
[markus@markus ~]$ gcc -W test.c
test.c: In Funktion »main«:
test.c:9:5: Fehler: Objekt variabler Größe darf nicht initialisiert werden
test.c:9:5: Warnung: Elementüberschreitung in Feldinitialisierung [standardmäßig aktiviert]
test.c:9:5: Warnung: (nahe der Initialisierung für »feld[0]«) [standardmäßig aktiviert]
test.c:9:5: Warnung: Elementüberschreitung in Feldinitialisierung [standardmäßig aktiviert]
test.c:9:5: Warnung: (nahe der Initialisierung für »feld«) [standardmäßig aktiviert]
[markus@markus ~]$
 
Du brauchst ganz wirklich malloc und free...

Sonst:
Das ={0} in der Fehlerzeile kann/muss weg.

Und beim 1000 ist das +0 dahinter sinnlos.
Und wo ist das Problem, 1000 durch max*max zu ersetzen?
 
Du brauchst ganz wirklich malloc und free...
dass kann ich noch nicht anwenden, muss jetzt erstmal danach googeln.
Imho wird vermutlich int feld durch malloc ersetzt.

[Danach werde ich versuchen die Zeilen und Spaltensumme jeweils zu bilden und zu vergleichen.]
danke für die Tipps, ich bekomme ganz langsam eine Gefühl dafür wie es weitergehen kann.
 
Hallo,

auch in Anlehnung an deinen anderen Foren-Thread hier einmal eine grundsätzliche Idee, wie dein Quadrat befüllt werden kann. Diese Weise ist in keinster Weise optimal, aber an Backtracking angelehnt, was du erwähnt hast.

Du hast in dem Quadrat n*n mögliche Zahlen, wobei jede Zahl nur einmal vorkommen darf. Meine Idee wäre hier. Leg ein Array der Größe n*n an (Datentyp egal, aber bool am sinnvollsten ; mit malloc)
Dann fängst du oben links in deinem Quadrat an die Zahlen einzusetzen 1 -> 2 -> 3-> ... -> n*n
bis unten rechts. Natürlich werden durch dieses Einsetzen die Regeln verletzt. Jedes mal wenn eine Regel verletzt wurde, gehst du einen Schritt zurück und änderst die Zahl. Z.B wenn die 2 falsch war, in 3 ändern usw. (dies ist am besten Rekursiv zu lösen, was Backtracking ausmacht.)

Das zuvor angelegt bool-Array kann dazu genutzt werden sich zu merken, welche Zahl bereits benutzt wurde. Benutzt => true and Stelle Array[zahl-1]. Dabei nicht vergessen nach jedem einsetzen bzw. heraussetzen das Array upzudaten.

Dieses Verfahren sollte recht simpel umzusetzen zu sein und bei nicht allzu großen n auch schnell zu einem sinnvollen Ergebnis führen.

Viele Grüße und Erfolg dabei,
Jennesta
 
ich schreib mal ganz frech:

Code:
#include <stdio.h>
#include <time.h>
 
void main()
{	int  max;
	printf("Bitte geben Sie die Groesse ein:");
	scanf("%d",&max);
	

int **cube = (int**) malloc(max * sizeof(int*));
   int feld[max][max];

    int k,i,j;
	  
    srand(time(0));
 
        k=1;
        for(i=0;i<max;i++)
        {
            for(j=0;j<max;j++)
            {
                feld[i][j]=rand() % max*max;
               
                printf("%2i\n",k,feld[i][j]);
 
                k++;
            }
        }
}
@Jennesta
klingt logisch ist aber noch nicht für mich umsetzbar
 
1. IMMER einen Pointer, auf den man per malloc() Speicher geladen hat, auch wieder mit free() freigeben, da sonst ein Memory Leak entsteht.

2.Wofür genau brauchst du jetzt int** cube?

3. Code gehört in die Code-Tags, nicht ins quote.

4.
C:
int feld[max][max];
Geht das bei dir? Ich dachte immer, die Werte hier müssten Konstanten sein?

Gruss
cwriter
 
Ergänzend:
cube soll wohl feld sein.
feld gehört weg, beide brauchst du nicht.
Und außerdem hast du jetzt nur eine Dimension allokiert.
Die zweite fehlt.

Man findet doch hier im Forum und auch sonst wo sehr viel zu malloc...

@cwriter: Das mit feld geht natürlich nicht, dazu hat er oben schon Fehlermeldungen.
 
C:
int feld[max][max];
Geht das bei dir? Ich dachte immer, die Werte hier müssten Konstanten sein?
Ja, in C99 geht das. In diesem Standard gibt es Arrays variabler Länge.

Man darf diese dann allerdings nicht initialisieren.

Also, falls du einen C99 Compiler verwendest / verwenden darfst, kannst du die ganze malloc / free Geschichte auch weglassen.

Gruß
 

Neue Beiträge

Zurück