Anfängerprobleme unter C++

Liebe Experten,

ich habe ein paar doofe Fragen zu stellen, da ich noch Neuling unter C++ bin, aber gerne und dringend ein kleines Programm beenden möchte.

Frage N°1)
Wie kann ich ein Array während des Programmablaufs dimensionieren?
Bsp.: Ich errechne während des Programms, daß mein Array genau 2500 Felder hat. Wie weise ich sie ihm dann zu?
Konkret:
Ich habe es so versucht, aber das funktioniert nicht:
double Rmoeg[AnzRmoeg];
beziehungsweise
double R[10][AnzRmoeg];

Frage N°2)
Warum funktioniert folgender Quelltext nicht und wie kann ich ihn funktionierend machen?

for(i=0; i’=’ : ‚double‘ kann nicht in ‚double [1]‘ konvertiert werden. Es gibt keine Konvertierungen von Feldtypen, obwohl es Konvertierungen von Verweisen oder Zeigern in Felder gibt

So, jetzt ist mein Fragenkontingent für’s erste erschöpft. Ich wäre Euch sehr dankbar, wenn Ihr mir helfen könntet.

Viele Grüße

Bernhard Krämer

P.S: Falls jemand an meinem billigen Programm interessiert sein sollte, hier der gesamte, bisher geschriebe Quelltext. Der Sinn des Programms ist eine (noch zu programmierende) Iteration. Darüber habe ich im VB-Brett bereits etwas geschrieben, als ich das Programm noch unter VB programmieren wollte.

#include
#include
using namespace std;

double Rmin, Rmax, Cmin, Cmax;
double b[4];
int ER, EC;
int AnzRmoeg, AnzCmoeg;
double Minimum, Maximum;

void Init(void);
void Wertezuweisung(void);
void Rechnung(void);

void Init(void) {
Rmin = 50; Rmax = pow(10,6);
Cmin = 50; Cmax = 100;
ER = 24; EC = 12;
b[3] = -1.21354*pow(10,-18);
b[2] = -2.62549*pow(10,-13);
b[1] = -8.81737*pow(10,-8);
b[0] = -0.01;
Minimum = pow(10,20); Maximum = pow(10,-20);
}
void Wertezuweisung(void) {
double Hilfe1;
bool Hilfe2;
int i, j;
int Anzahl;
Hilfe1 = pow(10,floor(log10(Rmin))); //Hilfe1 entspricht dem Anfangswert der Dekade, in der sich Rmin befindet. Z.B. Rmin = 123 -> Hilfe1=100, Rmin = 0,05 -> Hilfe1 = 0,01
AnzRmoeg = ceil((log10(Rmax+1)-log10(Rmin))*ER); //detektiert die exakte Anzahl der möglichen Widerstandswerte
i = 0;
Hilfe2 = false;
double Rmoeg[AnzRmoeg];
while(Hilfe2 = false) {
Rmoeg[i] = pow(10, i/ER)*Hilfe1; //weist Rmoeg[i] einen Widerstandswert zu
//WICHTIG! HIER AUF max. 2 NACHKOMMASTELLEN RUNDEN!!
if(Rmoeg[i] >= Rmin) i++; //Wenn Rmoeg[i] unterhalb des gewünschten Bereiches liegt, wird die Variable i nicht inkrementiert -> Rmoeg[i] wird beim nächsten Schleifendurchgang mit dem nächsthöheren Widerstandswert überschrieben.
if(Rmoeg[i] > Rmax) Hilfe2 = true; //Wenn Rmoeg[i] überhalb des gewünschten Bereiches liegt, wird die Schleife beendet. Achtung: i ist 1 zu groß, weil hier der Widerstand schon überm Rmax steht.
}
Hilfe1 = pow(10,floor(log10(Cmin))); //Hilfe1 entspricht dem Anfangswert der Dekade, in der sich Rmin befindet. Z.B. Rmin = 123 -> Hilfe1=100, Rmin = 0,05 -> Hilfe1 = 0,01
AnzCmoeg = ceil((log10(Cmax+1)-log10(Cmin))*EC); //detektiert die exakte Anzahl der möglichen Kapazitätswerte
i = 0;
Hilfe2 = false;
double Cmoeg[AnzCmoeg];
while(Hilfe2 = false) {
Cmoeg[i] = pow(10, i/EC)*Hilfe1; //weist Cmoeg[i] einen Kapazitätswert zu
if(Cmoeg[i] >= Cmin) i++; //Wenn Cmoeg[i] unterhalb des gewünschten Bereiches liegt, wird die Variable i nicht inkrementiert -> Rmoeg[i] wird beim nächsten Schleifendurchgang mit dem nächsthöheren Widerstandswert überschrieben.
if(Cmoeg[i] > Cmax) Hilfe2 = true; //Wenn Cmoeg[i] überhalb des gewünschten Bereiches liegt, wird die Schleife beendet. Achtung: i ist 1 zu groß, weil hier der Widerstand schon überm Rmax steht.
}
double R[10][AnzRmoeg];
for(i=0; i

Liebe Experten,

ich habe ein paar doofe Fragen zu stellen, da ich noch Neuling
unter C++ bin, aber gerne und dringend ein kleines Programm
beenden möchte.

Frage N°1)
Wie kann ich ein Array während des Programmablaufs
dimensionieren?
Bsp.: Ich errechne während des Programms, daß mein Array genau
2500 Felder hat. Wie weise ich sie ihm dann zu?
Konkret:
Ich habe es so versucht, aber das funktioniert nicht:
double Rmoeg[AnzRmoeg];
beziehungsweise
double R[10][AnzRmoeg];

Wärend der Laufzeit muss du das über dynamische Speicherzuweisung machen:

typedef double \*tR[10];

double \*Rmoeg;
tR \*R;

void f(int AnzRmoeg)
{
 Rmoeg = (double \*) calloc(sizeof(\*Rmoeg), AnzRmoeg);
 if (Rmoeg == NULL)
 { //Fehler: kein Speicher
 }
 R = (tR \*) calloc(sizeof(tR), AnzRmoeg);
 if (R == NULL)
 { //Fehler: kein Speicher
 }
 R[1][25] = 0;
}

Frage N°2)
Warum funktioniert folgender Quelltext nicht und wie kann ich
ihn funktionierend machen?

for(i=0; i][i] = Rmoeg[i];

R[3**][i] = Rmoeg[i];
R[4
][i] = Rmoeg[i];
R[6
][i] = Rmoeg[i];
R[9
][**i] = Rmoeg[i];

Die Indexe werden in C nicht mit Kommas getrennt sonder jeder für sich in eine eckige Klammer gesezt.

MfG Peter(TOO)

Wärend der Laufzeit muss du das über dynamische
Speicherzuweisung machen:

typedef double *tR[10];

double *Rmoeg;
tR *R;

void f(int AnzRmoeg)
{
Rmoeg = (double *) calloc(sizeof(*Rmoeg), AnzRmoeg);
if (Rmoeg == NULL)
{ //Fehler: kein Speicher
}
R = (tR *) calloc(sizeof(tR), AnzRmoeg);
if (R == NULL)
{ //Fehler: kein Speicher
}
R[1][25] = 0;
}

in C++ macht man das aber mit new :smile:

double *Rmoeg;
Rmoeg = new double[Anz];

und loeschen dann mit
delete Rmoeg;

Gruss
Mip

PS: Ich bin mir nicht ganz sicher mit dem Syntax,aber eigentlich sollte es so gehen.

Hi Mip,

der Syntax ist fast richtig, aber nicht ganz:

double *Rmoeg;
Rmoeg = new double[Anz];

delete [] Rmoeg;
=> Wenn mit new der Speicher für ein Array reserviert wurde, muß für die Freigabe „delete []“ verwendet werden. Warum? Keine Ahnung :wink:

Gruß
Uwe

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

1 Like

Vielen Dank für die Info :smile:

Gruss
Mip