Werte für Laufzeit abspeichern und kontrollieren

son gohan

Erfahrenes Mitglied
Hallo Leute,

ich möchte gerne möglichst Speicherplatz schonend, Werte für die Laufzeit eines Scripts ab Aktivierung durch Kompilierung abspeichern und frage mich wie ich das am besten machen soll.


Zur Zeit habe ich es mir flgendermaßen zusammengedacht:

PHP:
int versuche = 8;
int ergebnis = 0;
int pruf_array[8];
int erste_wert, zweite_wert;

for(int xy=0; xy<=versuche; xy++)
{

erste_wert = function_1();
zweite_wert = function_2();

if(erste_wert > zweite_wert) ergebnis = 1;
if(erste_wert < zweite_wert) ergebnis = 2;
pruf_array[xy] = ergebnis;

}

Also ich frage erst mal zwei Funktionen etwas ab und speicher die Rückgabe in die Variablen erste_wert und zweite_wert

Nun überprüfe ich nur die Ergebnisse der Funktionsabfragen und verteile dementsprechend Punkte an die Variable ergebnis

Die Ergebnisse der Variable ergebnis speicher ich in ein Array pruf_array.

Nachdem die for Schleife durchgelaufen ist müssten nun im Array pruf_array 8 Werte stehen, ich will nun später einfach nur kontrollieren können ob die 8 Werte im Array pruf_array alle gleich sind oder nicht, also ob alle Werte dort 1 oder 2 sind oder ob es auch gemischte Zahlen da drine gibt.

Den nur wenn im Array pruf_array alle Inhalte 1 oder 2 sind möchte ich später ein weiteres OK für andere Programmabläufe geben.

Ob es so funktioniert weiß ich noch nicht, ich würde gerne mal wissen von euch ob es noch Speicherplatz schonendere Lösungen gibt für mein vorhaben, wenn noch nicht genau klar ist was ich will fragt bitte nach, ich muss sagen das ich noch ganz am Anfang bin mit C/C++.
 
Zuletzt bearbeitet:
Hi.

son gohan hat gesagt.:
ich möchte gerne möglichst Speicherplatz schonend, Werte für die Laufzeit eines Scripts ab Aktivierung durch Kompilierung abspeichern
Also den Satz hab ich irgendwie nicht verstanden. Du willst was? Bitte nochmal der Reihe nach.

son gohan hat gesagt.:
C:
int pruf_array[8];
...
for(int xy=0; xy<=versuche; xy++)
Die Bedingung in der Schleife ist falsch. Du hast ein Array von 8 Elementen, die von 0 bis 7 durchnumeriert sind.

son gohan hat gesagt.:
C:
if(erste_wert > zweite_wert) ergebnis = 1;
if(erste_wert < zweite_wert) ergebnis = 2;
pruf_array[xy] = ergebnis;
Was ist wenn die Werte gleich sind? Dann steht dort ein zufälliger Wert im Array.

Wenn dich nur interessiert ob die Funktionswerte der einen Funktion immer größer bzw. kleiner waren, dann ist das natürlich noch nicht wirklich speichersparend.

C:
int groesser = 0, kleiner = 0;

for (int i = 0; i < 8; ++i) {
  int a = funktion1();
  int b = funktion2();

  if (a > b) groesser++;
  else if (a < b) kleiner++;
}
if (groesser == 0) { 
  /* Werte waren immer nur kleiner */
} else if (kleiner == 0) {
  /* Werte waren immer groesser */
} else {
  /* Werte waren mal groesser, mal kleiner */
}
Gruß
 
Hallo deepthroat,

erst mal herzlichen Dank für deine Hilfe, ich konnte schon einiges nützliches daraus entnehmen.

Also beim ersten Satz weis ich schon fast selbst nicht mehr was ich da so kompliziert sagen wollte, ha,ha, nein war nur ein Schertz, ich wollte damit nur sagen während des Programmablaufs soll so wenig Speicherplatz wie möglich verbraucht werden.


Das die Zahl 8 wohl zu hoch war für die for Schleife habe ich glaub ich jetzt auch verstanden, es muss also ein 7 da stehen, stimmts?


Nun zum Hauptteil meines Vorhaben:
1. Was machen wenn die beiden Werte die von den Funktionen zurückgegeben werden immer gleich sind, nun dann soll einfach eine andere Zahl in das pruft_array geschrieben werden.

2. Mein Ziel ist es ja 8 mal die Schleife durchlaufen zu lassen und bei jedem Durchlauf sollen die Rückgaben der Funktionen verglichen werden und in das pruf_array geschrieben werden.

3. Nachdem nun die for Schleife ihre 8 mal durchgelaufen ist, will ich das pruf_array untersuchen darauf ob es 8 identische Zahlen drine hat, im Idealfall also wären das 8 mal die 1 oder 2, nur wenn das der Fall ist will ich mit return() etwas weitergeben, dazu brauche ich aber dieses Ergebniss.

Ich weis nicht genau aber ich glaube dein Scriptbeispiel war nicht in meine gedachte Richtung.


Ich versuche es nochmal mit meinem ersten Beispiel.

PHP:
int versuche = 7; /*soll die Schleife 8 mal durchlaufen lassen*/ 
int ergebnis = 0; /*soll die Werte für das pruf_array beinhalten*/
int pruf_array[8]; /*soll die Ergebnisse der if Abfragen beinhalten*/
int erste, zweite; 

for(int xy=0; xy<=versuche; xy++) 
{ 

erste = function_1(); /*die Funktion soll eine int Zahl zurückgeben*/
zweite = function_2(); /*die Funktion soll eine int Zahl zurückgeben*/

/*
die Zahlen sollen verglichen werden und dementsprechend sollen der Variable ergebnis Wert 1 oder 2 zugeschrieben werden
*/

if(erste > zweite) ergebnis = 1; 
if(erste < zweite) ergebnis = 2; 
if(erste == zweite) ergebnis = 3;
 

/*in das Array pruf_array sollen dann die Ergebnisse der Abfragen oben je Durchlauf gespeichert werden*/

pruf_array[xy] = ergebnis; 

} 
/* 
die erste for Schleife geht hier zu ende und die Ergebnisse sollten alle im Array pruf_array gespeichert sein für die Weiterbearbeitung.
*/  

/*
Nun muss noch irgendwie geschaut werden ob alle Werte gleich sind im Array pruf_array.
*/
int a,b;

/*
Das Array hat 8 Werte also muss ich die for Schleife nur 7 mal durchlaufen lassen stimmts?
*/
for(int yz=0; yz<=7; yz++)
{
if(pruf_array[yz]==1) a++;
if(pruf_array[yz]==2) b++;
}

/*
Nachdem die Schleife abgelaufen ist müsste ein der beiden VAriablen a oder b auf 8 hochgerechnet worden sein wenn alle Arrayinhalte gleich waren, stimmts?
Wenn ich richtig liege müsste ich nun mein Ergebnis haben und kann meine Rückgabe mit return() machen.
*/

if(a==8) return(ja);
if(b==8) return(auch ja);

/*
Nun sollen noch alle Inhalte des Array pruf_array gelöscht werden, mir fällt jetzt aber keine Möglichkeit dazu ein.
*/

Ich bin mir nicht ganz sicher ob ich irgendwo auch static Variablen hätte benutzen müssen da ich halt noch totaler C/C++ Anfänger bin, aber normal denke ich mir das es sparsammer ist ohne Variablen vom Typ static.
 
Zuletzt bearbeitet:
Hi.
Das die Zahl 8 wohl zu hoch war für die for Schleife habe ich glaub ich jetzt auch verstanden, es muss also ein 7 da stehen, stimmts?
In dem Fall ja. Üblicherweise vegleicht man einfach ob die Schleifenvariable kleiner als die Anzahl der Elemente des Arrays ist.
Nun zum Hauptteil meines Vorhaben:
1. Was machen wenn die beiden Werte die von den Funktionen zurückgegeben werden immer gleich sind, nun dann soll einfach eine andere Zahl in das pruft_array geschrieben werden.

2. Mein Ziel ist es ja 8 mal die Schleife durchlaufen zu lassen und bei jedem Durchlauf sollen die Rückgaben der Funktionen verglichen werden und in das pruf_array geschrieben werden.

3. Nachdem nun die for Schleife ihre 8 mal durchgelaufen ist, will ich das pruf_array untersuchen darauf ob es 8 identische Zahlen drine hat, im Idealfall also wären das 8 mal die 1 oder 2, nur wenn das der Fall ist will ich mit return() etwas weitergeben, dazu brauche ich aber dieses Ergebniss.

Ich weis nicht genau aber ich glaube dein Scriptbeispiel war nicht in meine gedachte Richtung.
Richtig. Wozu soll denn das pruf_array gut sein? Wenn du wirklich nur wissen willst ob alle Werte immer in der gleichen Relation zueinander standen brauchst du dieses Array doch gar nicht. Das was du in der zweiten Schleife berechnest, kannst du doch genauso gut gleich in der ersten Schleife tun.

Gruß
 
Hallo :-),

wenn ich unter Zeitdruck stehe, dann übersehe ich echt die einfachsten Sachen, gut dass du mich drauf hingewiesen hast das die zweite Schleife unnötig ist, ich habe es mir nochmal angesehen und denke so könnte es gehen:

PHP:
int Prufung() {
1.    int versuche = 7; /*soll die Schleife 8 mal laufen lassen*/  
2.    int a,b; 
3.    int erste, zweite;  

4.    for(int xy=0; xy<=versuche; xy++)  
5.    {  
6.    /*beide Funktionen geben die int Zahl 1 oder 2 zurück*/
7.    erste = function_1(); 
8.    zweite = function_2(); 


9.    if(erste > zweite) a++;  /*Prüfung ergibt immer das selbe für die Bedingung*/  
10.   if(erste < zweite) b++;  /*Prüfung ergibt immer das selbe für die Bedingung*/   
11.   if(erste == zweite) return(0);  /*Bei ungleichen Wert abbrechen*/ 
 
12.   }  

13.   if(a==8) return(1); 
14.   if(b==8) return(2); 
15.   return(0);
}

Frage, wenn ich jetzt nach Beendigung der for Schleife den Wert von int Variable a oder b abfrage, würde das dann auch funktionieren, oder wären die Werte der beiden Variablen a und b nach Ende der Schleife wieder 0, ich bin mir da so unsicher weil ich irgendetwas von static Variablen gelesen hatte und irgendwie denke das a und b auch welche sein müssten, oder?

Noch eine Frage, wenn ich die Funktion Prufung() nun erneut aufrufe, müssten die beiden Werte der int Variablen a und b doch 0 sein und nicht etwas 8 wie vorher ne, ich glaube hier stoße ich auch schon wieder an mein kleines Verständnißproblem in Hinbezug auf static Variablen mit der Frage?

Und noch eine Frage, die beiden Abfragen in Zeile 13 und 14 mit if(a==8) return(1); usw. müssten doch erst ausgeführt werden nachdem die for Schleife alle Durchläufe gemacht hat ne?
 
Zuletzt bearbeitet:
Hi.
Frage, wenn ich jetzt nach Beendigung der for Schleife den Wert von int Variable a oder b abfrage, würde das dann auch funktionieren, oder wären die Werte der beiden Variablen a und b nach Ende der Schleife wieder 0, ich bin mir da so unsicher weil ich irgendetwas von static Variablen gelesen hatte und irgendwie denke das a und b auch welche sein müssten, oder?

Noch eine Frage, wenn ich die Funktion Prufung() nun erneut aufrufe, müssten die beiden Werte der int Variablen a und b doch 0 sein und nicht etwas 8 wie vorher ne, ich glaube hier stoße ich auch schon wieder an mein kleines Verständnißproblem in Hinbezug auf static Variablen mit der Frage?
Variablen sind immer in dem umschließenden Block sichtbar/zugreifbar in dem sie auch definiert werden. Außerdem behalten sie natürlich ihren zugewiesenen Wert innerhalb des Blocks. In diesem Fall sind die Variablen in der gesamten Funktion verfügbar da sie auch in diesem Block definiert sind.

Allerdings hast du einen entscheidenden Fehler gemacht, du hast die Variablen a und b nicht initialisiert. D.h. man kann gar nicht sagen was für einen Wert die Variablen überhaupt haben. Falls der Wert der Variablen 0 ist, ist das Zufall.

Statische Variablen dahingegen behalten ihren Wert zwischen Funktionsaufrufen. Damit arbeitet man nur in Ausnahmefällen. Im Normalfall sind die normalen ("automatischen") Variablen die bei Bedarf auf dem Stack angelegt werden völlig ausreichend.

Und noch eine Frage, die beiden Abfragen in Zeile 13 und 14 mit if(a==8) return(1); usw. müssten doch erst ausgeführt werden nachdem die for Schleife alle Durchläufe gemacht hat ne?
Ja. Das würde man auch auf einen Blick sehen, wenn du ordentlich einrücken würdest.

Gruß
 
Hi,

ich weiß deine Hilfe zu schätzen ;-).

Ich werde dann den Variablen a und b vorher Sicherheitshalber immer eine 0 zuweisen, ich dachte nur eigentlich da sie vom Typ int sind könnten die gar nicht anderes enthalten und das wenn ich a++ schreibe von 0 auf 1 erhöt werden müsste :-).
 
Hi.
Ich werde dann den Variablen a und b vorher Sicherheitshalber immer eine 0 zuweisen, ich dachte nur eigentlich da sie vom Typ int sind könnten die gar nicht anderes enthalten und das wenn ich a++ schreibe von 0 auf 1 erhöt werden müsste :-).
Nein, in C/C++ werden Variablen nicht automatisch mit 0 initialisiert und können wenn sie nicht explizit initialisiert wurden jeden möglichen Wert enthalten.

Gruß
 
Hi,
vielen Dank noch mal, das ist gut zu wissen ich habe die Grundlagen von C nur so überflogen im Schnellkurs, lernen tut man dann wohl wie immer erst nach einer Hand voll Fehler.
 
Hi,
danke noch mal für die Hilfe, ich habe für C bisher nur die Grundlagen überflogen und lerne jetzt erst wohl aus Fehlern wie das immer so ist.
 
Zurück