Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17
  1. #1
    DateMake Dialer
    Registriert seit
    10.10.2008
    Beiträge
    99

    Standard Zufällige Werte in 50x50 matrix?

    hi ich hab folgenden cCode aus einem Buch abgeschrieben.
    Es hieß er soll "die größte und kleinste Komponente einer (50x50)-matrix herausfinden.
    Ich dachte, dass alle Werte einer nich definierten Matrix (array, feld) gleich 0 sind und daher diese Anwendung keinen Sinn ergeben würde.

    #include <iostream>
    #include <math.h>
    using namespace std;

    int main() {
    int mat[50][50];

    int max = mat[0][0], min = max;

    for (int i = 0; i < 50 ; i++)
    for (int j = 0; j < 50 ; j++)
    {
    int aij = mat[i][j];

    cout <<aij <<endl; //Diese Zeile habe ich eingefügt um die Zwischenwerte zu sehen.

    if (aij > max)
    max = aij;
    else if (aij < min)
    min = aij;
    }
    cout << "\nMin:"<< min <<"\nMax:" <<max <<endl;
    return 0;
    Ich habe keine ahnung woher diese werte kommen. Und warum sind immer so große negative und kleine positive werte dabei?

    Bitte um Aufklärung[/quote]

  2. #2
    Coding Contest Winner
    Registriert seit
    21.03.2008
    Beiträge
    273

    Standard

    Soweit ich das seh machst Du ne 50*50 Matrix, die Du aber mit den Werten leer lässt. Das ist der Fehler. Du hast sie zwar erzeugt, musst sie aber dann auch mit Nullen befüllen, da der Speicherbereich sonst die Zahlen die da noch drinstehen nimmt. (ist nen bisschen schwer zu erklären, ich versuchs aber mal). BSP: Du erzeugst per Int eine Variable: int i; jetzt hat i aber den Wert des Speicherbereiches auf dem sie Steht, d.h. i kann -321437 sein oder auch 6 oder so, je nachdem was zuvor darauf stand. Also musst Du indem Fall int i = 0 schreiben, das auch der Wert richtig Initialisiert ist. Mit der Matrix machst Du das so:
    Code:
    for (int i = 0; i < 50 ; i++)
    for (int j = 0; j < 50 ; j++)
    {
    mat[i][j] = 0;
    cout<<"Hier noch die Ausgabe: "<<mat[i][j]<<endl;
    }
    }
    danach kannnst Du die MAtrix erst befüllen, mit Rand() oder weis ich was...

  3. #3
    CIH-Virus Avatar von -[RiDER]-
    Registriert seit
    05.01.2007
    Beiträge
    496

    Standard

    Hi

    Mit memset() kannste den Kram mit Nullen füllen:
    Code:
    memset(mat, 0, 50 * 50);
    Is natürlich Schwachsinn, wenn Du hinterher Zufallswerte reinschreiben willst

    GreetZ RiDER

  4. #4
    DateMake Dialer
    Registriert seit
    10.10.2008
    Beiträge
    99

    Standard

    aber wenn man z.B. ein andere variable deklariert.
    int i;
    dann ist sie automatisch 0, warum ist das nicht beier matrix so?
    d.h. also, das der speicher nicht gelöscht wird bzw. mit nullen initialisiert wird, wenn eine variable nichtmehr gebracuht wird?

  5. #5
    Der mit Anatidaephobie Avatar von blackberry
    Registriert seit
    11.07.2008
    Beiträge
    2.350

    Standard

    Zitat Zitat von Darkthief
    dann ist sie automatisch 0, warum ist das nicht beier matrix so?
    d.h. also, das der speicher nicht gelöscht wird bzw. mit nullen initialisiert wird, wenn eine variable nichtmehr gebracuht wird?
    Bei einem Integer alle Bits auf null zu setzen ist kein großer Aufwand.
    Wenn du einen char-Array mit 99999 Elementen anlegst kann das dauern.
    Unter 32-Bit Windows ist ein Adressraum von 4 GB pro Programm adressierbar (das heißt nicht, dass Windows so eine Menge Speicher an ein Programm vergeben würde, es wäre aber möglich).
    Schonmal 4 GB mit nullen überschrieben??? xD

    Bei Standartdatentypen kannst du also von einer Initialisierung mit 0 ausgehen, bei abgeleiteten nicht!


    mfG. BlackBerry

    PDFTT cr3w a.E. — ReiDC0Re, lindor, Sera, berry
    please do feed the trolls crew and elk
    Ehrenwerte Mitglieder im Ruhestand: OpCodez, SFX.
    "Was sich blackberry gerade denkt" — Vorsicht! Frei laufender Wahnsinn!
    Zitat von fuckinghot19: "PS: Blackberry ist auf FH der Trollkönig ^^."
    An dieser Stelle danke ich all meinen Fans und Hatern gleichermaßen ^.^

  6. #6
    has one Avatar von noctem
    Registriert seit
    08.06.2008
    Beiträge
    392

    Standard

    Code:
    #include <iostream>
    using namespace std;
    int main()
    {
    int i;
    cout << i << endl;
    
    return 0;
    }
    Ich erhalte da immer Zufallswerte. Stimmt schon, was oben geschrieben wurde.
    noctem{aet}jabber.ccc.de

  7. #7
    DateMake Dialer
    Registriert seit
    10.10.2008
    Beiträge
    99

    Standard

    @noctem:
    bist du dir sicher?
    Im c++ buch stand was von standart initialisiernung…

    Bei Standartdatentypen kannst du also von einer Initialisierung mit 0 ausgehen, bei abgeleiteten nicht!
    Danke!!! das hat mir sehr geholfen!

    @all:
    hab grat rausgefunden, dass
    int mat[10][10] = {};

    auch alle feldkomponenen auf 0 setzt :-P

  8. #8
    has one Avatar von noctem
    Registriert seit
    08.06.2008
    Beiträge
    392

    Standard

    Hier noch meine Ausgabe:
    Code:
     01:20:20 noctem@lappi $ ./test 
    -1208603216
     01:20:23 noctem@lappi $ ./test 
    -1208877648
     01:20:25 noctem@lappi $ ./test 
    -1208451664
     01:20:25 noctem@lappi $ ./test 
    -1208906320
     01:20:26 noctem@lappi $ ./test 
    -1208795728
     01:20:26 noctem@lappi $ ./test 
    -1208734288
     01:20:27 noctem@lappi $ ./test 
    -1208046160
     01:20:27 noctem@lappi $ ./test 
    -1208427088
     01:20:28 noctem@lappi $ ./test 
    -1208672848
     01:20:29 noctem@lappi $ ./test 
    -1208926800
    Also durchaus immer andere Werte. (Linux, g++)
    noctem{aet}jabber.ccc.de

  9. #9
    CIH-Virus Avatar von -[RiDER]-
    Registriert seit
    05.01.2007
    Beiträge
    496

    Standard

    Hi
    Bei Standartdatentypen kannst du also von einer Initialisierung mit 0 ausgehen, bei abgeleiteten nicht!
    Ich bin mir nicht ganz sicher und habs jetzt auch nicht ausprobiert, aber mich dünkt, dass das nur auf statische und globale Variablen zutrifft.

    D.h. bei
    Code:
    int i;
    int main(void)
    {
      printf("%d", i);
    }
    wird i IIRC mit 0 initialisiert.
    Bei
    Code:
    int main(void)
    {
      int i;
      printf("%d", i);
    }
    nicht unbedingt.
    Wohl aber wiederum bei
    Code:
    int main(void)
    {
      static int i;
      printf("%d", i);
    }
    noctem, probier doch mal i statisch oder global zu deklarieren. Mal sehen was passiert.

    GreetZ RiDER
    • der noch immer im Urlaub ist und nur eingeschränkten Zugriff auf Computer hat, was zu starken Entzugserscheinungen, wie dem Singen von Sourcecodes oder einem unkontrollierten mit den Fingern auf die Tischplatte Hacken führt.

  10. #10
    DateMake Dialer
    Registriert seit
    10.10.2008
    Beiträge
    99

    Standard

    hm stimmt, dann ist das was BlackBerry gesagt hat wohl doch nicht richtig…

    also, ersma kann man keine const Variable deklarieren ohne sie zu initialisieren, es sei denn, sie ist extern.
    Und ja, extern bzw. globale Variablen werden immer mit 0 initialisiert, auch Felder (habs getestet).

    jetzt hab ich noch ne Frage, nämlich wie im folgenden Code, die selbe Variable, die constant ist, immer wieder mit anderen Werten initialisiert werden kann.

    for (int i = 0; i < 50 ; i++)
    for (int j = 0; j < 50 ; j++)
    {
    const int aij = mat[i][j];

    cout <<aij <<endl;
    }
    is der selbe Code wie in meinem ersten Post, nur mit const Variable, wies auch eigentlich im Buch stand.

Seite 1 von 2 12 LetzteLetzte

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •