Ergebnis 1 bis 7 von 7

Thema: [C++] Alle Elemente eines Arrays mit -2 füllen.

  1. #1
    Shogun Avatar von DarkSyranus
    Registriert seit
    28.03.2006
    Ort
    ::1/128
    Alter
    25
    Beiträge
    3.446
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings
    Blog-Einträge
    1

    Standard [C++] Alle Elemente eines Arrays mit -2 füllen.

    Also, ich habe ein Array, das wie folgt aufgebaut ist.
    Code:
    signed short tMap[11][11]
    Nun würde ich gerne jede Stelle des Array mit -2 füllen.
    Wenn dies nur beim erstellen des Arrays sein sollte, wäre das ja kein Problem, aber ich muss das Array leider sehr oft wieder auf den Ursprungszustand zurücksetzen.

    Da gibt es ja diese schöne Funktion void * memset(void * ptr, int value, size_t num).
    Ok, dann versuchen wir es mal.
    Code:
    		// delete old (and maybe wrong) map information
    		memset(this->map, -2, sizeof(this->map));
    Kompiliereb lässt es sich auch noch sehr gut.

    >> Set new map information ...
    Segmentation fault (core dumped)
    Ok, dann war ich ein wenig irritiert.
    Habe mir mal die Beschreibung von memset() genau durchgelesen.

    value
    Value to be set. The value is passed as an int, but the function fills the block of memory using the unsigned char conversion of this value.
    Interessant, scheint also, als ob man nur chars benutzen könnte ??
    Hat da Jemand eine Erfahrung / Idee wie man das lösen könnte ??
    Und bitte nicht mit Schleifen kommen, da auch später einige 5-6 dimensionale Arrays kommen ...

    Edit: fill_n() bringst auch nicht, das kann keine mehrdimensionalen Arrays füllen ...
    Achtung: Dies ist ein alter Thread im HTML und Webmaster Forum
    Diese Diskussion ist älter als 90 Tage. Die darin enthaltenen Informationen sind möglicherweise nicht mehr aktuell. Erstelle bitte zu deiner Frage ein neues Thema im Forum !!!!!

  2. #2
    Fortgeschrittene/r
    Registriert seit
    26.09.2005
    Ort
    Nürnberg
    Beiträge
    169
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard

    Interessante Frage. Auch wenn ich mich noch nie damit beschäftigen musste (und ich grad im Prüfungsstress bin), dachte ich mir ich nehm mir mal ein paar Minuten um drüber nach zu denken.

    memset() nimmt die Zahl die ihr übergeben wird als unsigned char. Auf gut Deutsch: da unsigned char immer 1 Byte groß ist (bzw. sein sollte), werden die ersten 8 Bits der übergebenen Zahl (oder eben 1 Byte) genommen, und überall in jede Speicheradresse geschrieben.

    Ein short sollte üblicherweise 2 Byte groß sein.

    Wenn du jetzt beispielsweise als value 2 übergibst (was 00000010 Binär ist), wird das in beide Speicherzellen für dein short geschrieben. Ergibt 00000010.00000010.
    Ein cout auf irgendeine Stelle der map wird 514 ergeben (das ist die Zahl da oben Binär).

    [-Anmerkung: Unterschied zw. Little Endian & Big Endian gibts hier nicht-]

    Damit wäre geklärt was genau in die Speicherzellen geschrieben wird. Nur du willst eine negative Zahl speichern. Das ist jetzt doch um einiges schwieriger.

    Bei Intel Maschinen werden negative Zahlen als Zweierkomplement abgelegt.

    [-Zweierkomplement: Bits negieren und + 1 / erstes Bit gibt Vorzeichen an-]

    Übergibt man nun -2 an memset, was das Zweierkomplement von 2 ist (also 11111110), werden diese Bits in beide Speicheradressen geschrieben. Ergibt 11111110.11111110.

    Ein cout auf irgendeine Stelle der map ergibt jetzt -258, da das erste Bit die negative Zahl einleitet, und vom Rest das Zweierkomplement (hier x0000001.00000010) den Wert angibt = 258.

    Jetzt zu deiner -2 die überall stehen soll: dafür müsste 11111111.111111110 in den Speicherzellen stehen. Das schaffst du aber nicht, da das unterschiedliche Bytes sind, und memset immer die gleichen in die Speicheradressen schreibt. Ich bin mir daher ziemlich sicher, dass das mit memset unmöglich zu bewerkstelligen ist.

    Getestet hab ich das mit

    Code:
    short map[11][11];
    
    memset(map, 1, sizeof(map));
    // cout ergibt 257
    
    memset(map, 2, sizeof(map));
    // cout ergibt 514
    
    memset(map, -2, sizeof(map));
    // cout ergibt -258
    Das bestätigt meine Überlegungen. Hatte nie Zugriffsverletzungen...
    (Getestet: 32 Bit Intel System (= Little Endian) mit msvc2005 Compiler)

    Wichtig: bitte schlagt mich nicht, falls irgendwo ein Denkfehler drin ist...

  3. #3
    Shogun
    Themenstarter
    Avatar von DarkSyranus
    Registriert seit
    28.03.2006
    Ort
    ::1/128
    Alter
    25
    Beiträge
    3.446
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings
    Blog-Einträge
    1

    Standard

    Hm, so weit bin ich auch schon ...
    Werde wohl um Schleifen doch nicht drum rumkommen.
    Code:
    for&#40;short i = 0; i < 11; i ++&#41;
    		&#123;
        	for&#40;short j = 0; j < 11; j ++&#41;
    			&#123;
          	this->mapField&#91;i&#93;&#91;j&#93; = -2;
    			&#125;
    		&#125;
    Davon ging ich dann aus, das es geht.

    Segmentation fault (core dumped)
    Wo zum Geier kann da jetzt eine Zugriffsverletzung auftreten ???

  4. #4
    Fortgeschrittene/r
    Registriert seit
    26.09.2005
    Ort
    Nürnberg
    Beiträge
    169
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard

    Keine Ahnung, sollte einwandfrei funktionieren. Natürlich vorausgesetzt deine Map ist wirklich 11x11 groß.

  5. #5
    Shogun
    Themenstarter
    Avatar von DarkSyranus
    Registriert seit
    28.03.2006
    Ort
    ::1/128
    Alter
    25
    Beiträge
    3.446
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings
    Blog-Einträge
    1

    Standard

    Soweit ich weis, stimmt das.
    Hab mal was rausgefunden.
    Immer wenn ich in map (neuer version: mapField) schreiben möchte gibt es den Fehler.
    Lesen kann ich jedoch da raus.

    Code:
    	typedef short tMapField&#91;11&#93;&#91;11&#93;;
    Code:
    class cMap
    	&#123;
    		private&#58;
        	tMapField mapField;
    
    		public&#58;
    			cCore *oCore;
          
    			bool CalculateMapPositions&#40;&#41;;
        	bool SetMap&#40;string mapInformation&#41;;
    	&#125;;
    Edit: Ich bin so was von doof -.-''
    Ich hab einfach nur vergessen eine Referenz auf die Klasse zu setzen.
    Folglich hatte ich keine Schreibrechte ...

  6. #6
    Fortgeschrittene/r
    Registriert seit
    26.09.2005
    Ort
    Nürnberg
    Beiträge
    169
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard

    Und wie hast du jetzt das Zurücksetzen auf -2 gelöst? Mit for-Schleifen oder hast du eine schnellere / elegantere Methode gefunden?

  7. #7
    Shogun
    Themenstarter
    Avatar von DarkSyranus
    Registriert seit
    28.03.2006
    Ort
    ::1/128
    Alter
    25
    Beiträge
    3.446
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings
    Blog-Einträge
    1

    Standard

    Nein, musste leider bei den Schleifen bleiben ...

Ähnliche Themen

  1. php und arrays
    Von synaptic im Forum PHP Forum - Apache - CGI - Perl - JavaScript und Co.
    Antworten: 5
    Letzter Beitrag: 07.08.2008, 12:04
  2. Ersten Wert eines arrays in eine Variable übergeben
    Von Whesley im Forum PHP Forum - Apache - CGI - Perl - JavaScript und Co.
    Antworten: 2
    Letzter Beitrag: 05.05.2008, 14:15
  3. PHP-alle Dateien eines Verzeichnisses includieren?
    Von Alienx im Forum HTML & CSS Forum
    Antworten: 7
    Letzter Beitrag: 23.01.2008, 20:36
  4. Sortieren von Arrays A // a
    Von ::RMB:: im Forum PHP Forum - Apache - CGI - Perl - JavaScript und Co.
    Antworten: 4
    Letzter Beitrag: 16.03.2006, 17:56
  5. dynamisches füllen eines drop-down-formulars!!!
    Von gast im Forum HTML & CSS Forum
    Antworten: 16
    Letzter Beitrag: 25.10.2005, 10:56

Stichworte

Berechtigungen

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