initialisieren ein array von ints
Kennt jemand eine Möglichkeit haben, initialisieren Sie ein array von int
s (multi-byte-Typ ist in Ordnung wirklich), eine non-null and non -1 Wert einfach? Ich meine, gibt es eine Möglichkeit, dies zu tun in einem one-liner, ohne dass man jedes element einzeln:
int arr[30] = {1, 1, 1, 1, ...}; //that works, but takes too long to type
int arr[30] = {1}; //nope, that gives 1, 0, 0, 0, ...
int arr[30];
memset(arr, 1, sizeof(arr)); //That doesn't work correctly for arrays with multi-byte
// types such as int
Nur zur info, mit memset()
in dieser Weise auf statische arrays gibt:
arr[0] = 0x01010101
arr[1] = 0x01010101
arr[2] = 0x01010101
Die andere option:
for(count = 0; count < 30; count++)
arr[count] = 1; //Yup, that does it, but it's two lines.
Jemand andere Ideen? Solange es C-code, keine Grenzen der Lösung. (andere libs sind in Ordnung)
- es gibt wmemset() für "wide" char-arrays
- würden nicht andere libs benötigen >1 Zeile?
#include libother
- Nicht schlecht... zwei kleine Fragen, Erstens ich verstehe
wchar_t is compiler-specific and can be as small as 8 bits
damit können einzelne byte. Zweitens, ich hatte gehofft, für etwas, das könnte funktionieren auf verschiedene Arten. Aber kein schlechter Vorschlag. Danke. - Mac OS X hat
memset_pattern4()
,memset_pattern8()
undmemset_pattern16()
seit version 10.5. - Touché. Ok, wie wärs mit "1 liner pro Einstellung" wir werden nicht gezählt
#includes
oder mehrere Optionen zugcc
- memset () ", Die funktioniert nicht korrekt für multi-byte-arrays". Wo hast du diese Idee aus? Haben Sie nicht etwas lernen aus dieses (sehr gute) Frage? Ich selbst beantwortet Sie in einem Kommentar dort: "please don' T verwenden Sie die Zeiger-auf-Zeiger-syntax, erstellt segmentiert, multi-dim. arrays, die nicht kompatibel mit... "memcpy, memset".
- Siehe mein edit, Das ist, was ich meine über die Verwendung
memset()
nicht richtig funktioniert. Ich will1
, dh00000001
, das ist nicht das, was ich immer bin. Ich bin sicher, es gibt einen offensichtlichen Grund, aber es scheint nur ein setbyte
Wert - in diesem Fall schreiben Sie eine for-Schleife in eine Methode, die eine 'arraySize' int in einer anderen Klasse, und eben auch, dass
- Ich denke du meinst multi-byte-Werte
- wenn nur ich hatte einen Mac! Ich habe nur Windows und Linux, gebe ich zu versuchen, meine Frau ein macbook, wenn ich nach Hause komme. Vielen Dank für den input!
- Irgendwie... aber siehe mein Kommentar zu MarcB die Kette, ich bin auf der Suche nach einer generischen Lösung,
memset32
odermemset64
Kräfte meine hand, basierend auf der zugrunde liegenden Architektur. - Ein bisschen Modifikation könnte diese Funktion mehr Generika. Würden Sie müssen nur übergeben Sie die Größe Ihrer Daten geben. Oder es könnte möglicherweise herausfinden, auf Ihre eigenen mit so etwas wie
sizeof(arr[0])
. Ich würde spielen, um mit, um zu sehen, wie schwer das wäre, aber ich denke, es könnte funktionieren. - Okay, jetzt verstehe ich das Problem 🙂 Es hat nichts zu tun mit fragmentierten arrays als ich dachte, aber mit der Ausgabe von memset() funktioniert nur auf byte-Ebene. Sowieso, die Schnellste und die meisten generischen Lösung ist die Verwendung einer Reihe von vordefinierten Makros für den Aufbau Ihrer eigenen Initialisierer-Liste. Siehe meine Antwort unten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist eine GCC-Erweiterung:
...
was wichtig isttypedef struct { int x; int y} type;
danntype t = { .x=1, .y=2 };
ich noch nie gesehen .. notation noch gehört, es bezeichnet als designierten Initialisierer. Ich glaube, dies ist eine GCC-Erweiterung über den standard hinaus C bezeichnet Initialisierungen.Einer Zeile. 🙂
One line. :)
sehr wahr... die Buchstaben des Gesetzes gefolgt wurde, mit dieser LösungSie sagte etwas über 2 Linien, aber Sie können es tun, in einer Zeile mit Komma
,
Betreiber.,
operator ist also unbenutzt.for(count = 0; count < 30; arr[count++] = 1);
Der einzige sinnvolle Weg, dies zu tun während der Initialisierung (anstatt Spielzeit) zu sein scheint:
Und im nächsten
#define ONE2 2
und so weiter. Sie bekommen die Idee.BEARBEITEN :
Der Grund, warum ich schrieb so viele Makros war es, zu zeigen, wie flexibel diese Lösung ist. Für diesen Fall brauchen Sie nicht alle von Ihnen. Aber mit Makros wie diese können Sie schreiben, jede Art von Initialisierungsliste in eine schnelle und flexible Art und Weise:
#define ONE(n) 1
, dann#define FIVE(n) ONE(n), ONE(n), ONE(n), ONE(n), ONE(n)
etc, so dass Sie nicht brauchen einen separaten Satz von Makros für jede Zahl?#define REPEAT(symbol, count)
, wenn ich zu müde bin, um herauszufinden, wie das funktionieren würde, im moment 🙂#define FIVE(n)
tatsächlich besser Aussehen alsFIVE1
.In C entwickeln Sie in der Regel Ihre eigenen "support library" mit Makros wie
dann verwenden Sie in Ihrem code als
Einer Linie mit Zeigern!
Oder wenn Sie vorzeitig Angst vor performance-Einbußen verursacht, indem Sie wiederholt die Berechnung
(a + 30)
:a + 30
werden nur einmal berechnet hätte, würde ichfor (int *p = a, *pEnd = a + 30; p < pEnd; p++) *p = 1;
. Deine zweite for-Schleife ruft Undefiniertes Verhalten, denn es berechneta - 1
, die ist out of bounds.p
nicht auf den arraya
, sop >= a
ist nicht definiert.Für die Initialisierung einer statischen Wert, ich habe im Allgemeinen als Eingabe aus, um bevorzugt werden, wie in:
In diesem Fall, der compiler kann (und meistens tut), dann ausspucken optimierte Initialisierung in der Präambel-code.
Manchmal die Initialisierung dynamischer, wie in diesem Beispiel:
In diesen Fällen müssen Sie code und die Allgemeine Regel ist, um zu maximieren die Lesbarkeit, nicht minimieren eingeben. Dieser code wird einmal geschrieben und Lesen eine Vielzahl von Zeiten.