Konstante Variable anlegen

  • Themenstarter Themenstarter C152778
  • Beginndatum Beginndatum
C

C152778

Hallo :)

Ich würde gerne eine konstante Variable anlegen, die sich aus einer anderen konstanten Variablen berechnet, also folgendes:
Code:
const int a = 5;
const in b = <funktionsname>(a);
Jedoch klappt das leider nicht, selbst, wenn ich die Funktion so definieren, dass ihr Rückgabewert "const int" lautet.

Weiß jemand einen guten Tipp dazu?

Schöne Grüße, Cyraid
 
Ich hoffe, die Funktion ist als static deklariert.
Du kannst die Funktion aber auch als inline deklarieren, dann wird sie vom Compiler 'ausgewertet'. Das ist wahrscheinlich die beste Vorgehensweise.
 
Hi.
Ich würde gerne eine konstante Variable anlegen, die sich aus einer anderen konstanten Variablen berechnet, also folgendes:
Code:
const int a = 5;
const in b = <funktionsname>(a);
Jedoch klappt das leider nicht, selbst, wenn ich die Funktion so definieren, dass ihr Rückgabewert "const int" lautet.
Der Rückgabewert ist völlig irrelevant. (und ein Rückgabewert vom Typ "const <integraler Typ>" ist auch generell ziemlich sinnfrei)
Weiß jemand einen guten Tipp dazu?
const Variablen müssen mit konstanten Werten initialisiert werden. Ein Wert, der erst zur Laufzeit durch einen Funktionsaufruf berechnet wird, ist nicht konstant.

\edit: Mir fällt gerade ein, das dies Unsinn ist. :-( (das kommt davon wenn man den Text nur so schnell überfliegt und gedanklich schon längst einen bestimmten Weg eingeschlagen hat) Zeig deinen konkreten Code und die Fehlermeldung des Compilers.

Du könntest Makros verwenden.

Du könntest Template Meta Programmierung verwenden.

Du könntest einen Compiler verwenden der bereits den kommenden C++ Standard unterstützt und die Funktion als constexpr definieren:
C++:
constexpr int func(int x ) {return ...;}
Gruß
 
Zuletzt bearbeitet:
Erst einmal danke für die Antworten !

Hier ein Stück Code, der mein Problem vereinfacht:
Code:
int doubleValue(const int& a);

const int a = 5;
const int b = doubleValue(a);

int doubleValue(const int& a) {
	return 2 * a;
}

int main() {
	int ar[b];

	return 0;
}

Wie man sieht möchte ich gerne einen Array anlegen, der die Länge von b hat, hier meldet mir der Compiler aber einen Fehler "Konstanter Wert erwartet". Heißt das, mein b ist nicht konstant ?

(Statt doubleValue verwende ich eine rekursive Funktion, so dass es mir nicht möglich ist, einfach nur const int b = a * a zu schreiben)

Schöne Grüße, Cyraid
 
Nein, das geht auf jeden Fall nicht, der Stack ist bereits im Assemblercode nach dem Kompilieren festgelegt, daher ist das nicht möglich, erst zu Laufzeit die Grösse des Stacks zu kennen. Aber das ist ja auch kein Problem, dafür gibts ja den Heap.
 
Ich habe das Problem nun mit einer dynamischen Speichererweiterung gelöst
Code:
int *a = new int[b];

Damit benötige ich kein konstantes Element b mehr.

Schöne Grüße, Cyraid
 
Nicht vergessen den Speicher dann wieder freizugeben, wenn du ihn nicht mehr brauchst.

Jepp, danke für den Hinweis !

Leider ergab sich eben ein neues Problem. Ich würde gerne eine Matrix dynamisch anlegen nach dem Prinzip:
Code:
int mat[][] = new int[b][b];
Dies wird jedoch mit einer Fehlermeldung wegen einer Castingverletzung quittiert. Auch andere Varianten wie
Code:
int *math[] = new int[b][b];
etc. scheitern.
Wie macht man es richtig ?

Schöne Grüße, Cyraid
 
Das kannst du folgendermassen machen:
Code:
int** matrix = new int*[3];
for(uint32 i = 0; i < 3; ++i)
	matrix[i] = new int[3];
 
@Cromon : Klasse, vielen Dank ! :)

Aus Interesse würde mich interessieren, ob die Verwendung eines mehrdimensionalen integer Arrays gegenüber einem vector<vector<int>> Objekt wesentliche Geschwindigkeitsvorteile hat. Sollte man das eine dem anderen vorziehen oder ist der Unterschied kaum spürbar (sofern man "gewöhnliche" Programme schreibt, bei denen es nicht auf jede Sekunde ankommt) ?

Schöne Grüße, Cyraid
 
Zurück