Fehler, Irrtümer, Fragen - Seite 744

 
IgorM:
Ja, ich weiß, und ich habe Code zitiert, der keinen Ausführungsfehler verursacht, sondern das Skript in einer Schleife laufen lässt

wird der letzte Ausdruck nicht ausgegeben?

Oder die vorletzte?

Und der letzte Exponentenaufruf friert nicht ein?

Welche Linie erreicht der Algorithmus?

haben Sie die Abdrücke überall angebracht?

 
sergeev: wird der letzte Ausdruck nicht ausgegeben?

Nein, ist es nicht.

2012.05.27 23:44:15	34 (EURUSD,M15)	Abnormal termination
2012.05.27 23:44:14     34 (EURUSD,M15) out[0][1071644672][7] = 0.5
2012.05.27 23:44:14     34 (EURUSD,M15) out[2][5][7] = 0.5
2012.05.27 23:44:14     34 (EURUSD,M15) out[2][4][7] = 0.5
2012.05.27 23:44:14     34 (EURUSD,M15) out[2][3][7] = 0.5
2012.05.27 23:44:14     34 (EURUSD,M15) out[2][2][7] = 0.5
2012.05.27 23:44:14     34 (EURUSD,M15) out[2][1][7] = 0.5
2012.05.27 23:44:14     34 (EURUSD,M15) out[2][0][7] = 0.02401042497265053
2012.05.27 23:44:14     34 (EURUSD,M15) out[1][6][7] = 0.6115035058049522
2012.05.27 23:44:14     34 (EURUSD,M15) out[1][5][7] = 0.6315711056280579
2012.05.27 23:44:14     34 (EURUSD,M15) out[1][4][7] = 0.2054980719299829
2012.05.27 23:44:14     34 (EURUSD,M15) out[1][3][7] = 0.5596305561874292
2012.05.27 23:44:14     34 (EURUSD,M15) out[1][2][7] = 0.3623413658485376
2012.05.27 23:44:14     34 (EURUSD,M15) out[1][1][7] = 0.8933844140595046
2012.05.27 23:44:14     34 (EURUSD,M15) out[1][0][7] = 0.9005057454076223
2012.05.27 23:44:14     34 (EURUSD,M15) out[0][1071644672][7] = 0.5
2012.05.27 23:44:14     34 (EURUSD,M15) out[2][5][7] = 0.5
2012.05.27 23:44:14     34 (EURUSD,M15) out[2][4][7] = 0.5
2012.05.27 23:44:14     34 (EURUSD,M15) out[2][3][7] = 0.5
2012.05.27 23:44:14     34 (EURUSD,M15) out[2][2][7] = 0.5
2012.05.27 23:44:14     34 (EURUSD,M15) out[2][1][7] = 0.5
2012.05.27 23:44:14     34 (EURUSD,M15) out[2][0][7] = 0.02401042497265053
2012.05.27 23:44:14     34 (EURUSD,M15) out[1][6][7] = 0.6115035058049522
2012.05.27 23:44:14     34 (EURUSD,M15) out[1][5][7] = 0.6315711056280579
2012.05.27 23:44:14     34 (EURUSD,M15) out[1][4][7] = 0.2054980719299829
2012.05.27 23:44:14     34 (EURUSD,M15) out[1][3][7] = 0.5596305561874292
2012.05.27 23:44:14     34 (EURUSD,M15) out[1][2][7] = 0.3623413658485376
2012.05.27 23:44:14     34 (EURUSD,M15) out[1][1][7] = 0.8933844140595046
2012.05.27 23:44:14     34 (EURUSD,M15) out[1][0][7] = 0.9005057454076223
2012.05.27 23:44:14     34 (EURUSD,M15) out[0][1071644672][7] = 0.5
2012.05.27 23:44:14     34 (EURUSD,M15) out[2][5][7] = 0.5
2012.05.27 23:44:14     34 (EURUSD,M15) out[2][4][7] = 0.5
2012.05.27 23:44:14     34 (EURUSD,M15) out[2][3][7] = 0.5
2012.05.27 23:44:14     34 (EURUSD,M15) out[2][2][7] = 0.5
2012.05.27 23:44:14     34 (EURUSD,M15) out[2][1][7] = 0.5
2012.05.27 23:44:14     34 (EURUSD,M15) out[2][0][7] = 0.02401042497265053
2012.05.27 23:44:14     34 (EURUSD,M15) out[1][6][7] = 0.6115035058049522
2012.05.27 23:44:14     34 (EURUSD,M15) out[1][5][7] = 0.6315711056280579
2012.05.27 23:44:14     34 (EURUSD,M15) out[1][4][7] = 0.2054980719299829
2012.05.27 23:44:14     34 (EURUSD,M15) out[1][3][7] = 0.5596305561874292
2012.05.27 23:44:14     34 (EURUSD,M15) out[1][2][7] = 0.3623413658485376
2012.05.27 23:44:14     34 (EURUSD,M15) out[1][1][7] = 0.8933844140595046
2012.05.27 23:44:14     34 (EURUSD,M15) out[1][0][7] = 0.9005057454076223
2012.05.27 23:44:14     34 (EURUSD,M15) out[0][1071644672][7] = 0.5
2012.05.27 23:44:14     34 (EURUSD,M15) out[2][5][7] = 0.5
2012.05.27 23:44:14     34 (EURUSD,M15) out[2][4][7] = 0.5
2012.05.27 23:44:14     34 (EURUSD,M15) out[2][3][7] = 0.5
2012.05.27 23:44:14     34 (EURUSD,M15) out[2][2][7] = 0.5
2012.05.27 23:44:14     34 (EURUSD,M15) out[2][1][7] = 0.5
2012.05.27 23:44:14     34 (EURUSD,M15) out[2][0][7] = 0.02401042497265053
2012.05.27 23:44:14     34 (EURUSD,M15) out[1][6][7] = 0.6115035058049522
2012.05.27 23:44:14     34 (EURUSD,M15) out[1][5][7] = 0.6315711056280579
2012.05.27 23:44:10     34 (EURUSD,M15) out[1][3][7] = 0.5596305561874292
2012.05.27 23:44:10     34 (EURUSD,M15) out[1][2][7] = 0.3623413658485376
2012.05.27 23:44:10     34 (EURUSD,M15) out[1][1][7] = 0.8933844140595046
2012.05.27 23:44:10     34 (EURUSD,M15) out[1][0][7] = 0.9005057454076223
2012.05.27 23:44:10     34 (EURUSD,M15) out[0][1071644672][7] = 0.5
2012.05.27 23:44:10     34 (EURUSD,M15) out[2][5][7] = 0.5
2012.05.27 23:44:10     34 (EURUSD,M15) out[2][4][7] = 0.5
2012.05.27 23:44:10     34 (EURUSD,M15) out[2][3][7] = 0.5
2012.05.27 23:44:10     34 (EURUSD,M15) out[2][2][7] = 0.5
2012.05.27 23:44:09     34 (EURUSD,M15) out[0][1071644672][7] = 0.5
2012.05.27 23:44:09     34 (EURUSD,M15) out[2][5][7] = 0.5
2012.05.27 23:44:09     34 (EURUSD,M15) out[2][4][7] = 0.5
2012.05.27 23:44:09     34 (EURUSD,M15) out[2][3][7] = 0.5
 
IgorM:

Nein, ist es nicht.

Wiederholungsfrage - haben Sie einen Exponenten für 2/3/8 berechnet?

und außerdem sieht es seltsam aus.

1071644672
Woher kommt das Geld?
 
sergeev: Ich wiederhole meine Frage - haben Sie einen Exponenten für 2/3/8 berechnet?

hat es so gemacht:

int i1,i2,i3;
double out[3][7][7];
for(i1=0;i1<7;i1++) out[0][0][i1] = inp[i1];
double sum;
sum = 0.0;
for(i3=0;i3<3;i3++){
   for(i2=0;i2<7;i2++){
      for(i1=1;i1<7;i1++)  sum += W[i3][i2][i1] * out[i3][i2][i1-1];
      if(i3==2 && i2==3 && i1==8) Print("неправильный вызов exp!!!!");
      out[i3][i2][i1] = f(sum + WT[i3][i2]);
      sum = 0.0;
      Print("out[",i3,"][",i2,"][",i1,"] = ",out[i3][i2][i1]);
   }
}
Print("sum = ",sum);

im Protokoll:

2012.05.27 23:55:30     34 (EURUSD,M15) array out of range in '34.mq5' (180,7)

wenn auskommentiert: // if(i3==2 && i2==3 && i1==8) Print("falscher exp!!!! Aufruf");

wird wieder eine Endlosschleife entstehen :)

 
IgorM:

wenn ausgeblendet:// if(i3==2 && i2==3 && i1==8) Print("falscher exp!!!! Aufruf");

wird es wieder eine Endlosschleife sein :)

i1 ist am Ende der Schleife gleich 7, obwohl der maximale Index der dritten Dimension 6 ist. Sie sollte eigentlich außerhalb des Bereichs liegen, aber wenn nicht, ist es durchaus möglich, dass die Zeichenfolge

out[i3][i2][i1] = f(sum + WT[i3][i2]);

kann z.B. den Wert von i2 überschreiben. Aber in diesem Fall ist es ein Fehler im mql-Compiler.

Sie können z.B. die Array-Definition in globale Variablen verschieben - dann sollte sich das Verhalten des obigen Codes ändern.

Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Основы языка / Переменные / Глобальные переменные - Документация по MQL5
 
IgorM:

wird es wieder eine Endlosschleife sein :)

Ich denke, der Fehler liegt im Drucker selbst.

Finden Sie heraus, was in den Zeilen davor steht. da der letzte Exponent nicht ausgeführt werden soll. der Index überschreitet

Ich glaube, das Problem liegt in Ihrem Code.

Документация по MQL5: Математические функции / MathExp
Документация по MQL5: Математические функции / MathExp
  • www.mql5.com
Математические функции / MathExp - Документация по MQL5
 
sergeev: Ich glaube, das Problem liegt in Ihrem Code.
Ich habe es angehängt, das Skript geht in eine Endlosschleife wie diese
Dateien:
34.mq5  7 kb
 
sergeev:

und es sieht auch seltsam aus.

1071644672
Woher kommt sie?
Ich denke, wir kommen der Sache etwas näher, wenn wir diese Zahl im Binärformat umschreiben.
 
IgorM:
Ich habe es beigefügt, in dieser Form geht das Skript in eine Endlosschleife.

Ich habe Zero Devide mit oder ohne Druck, auf

double f(double x){return(1/(1+MathExp(-1*x)));}
Im Allgemeinen nimmt i1 einen falschen Wert an. Obwohl sie bei out[][][7] außerhalb des Bereichs liegen sollte. Der Compiler muss Einschränkungen berücksichtigen, die auf der Multiplikation aller Dimensionen beruhen (3 * 7 * 7 = 147) und nicht auf jeder einzelnen. Wenn i1 beispielsweise 8 zugewiesen wird, druckt Print trotzdem einige Werte. Offensichtlich handelt es sich um einen Compilerfehler bei der Überprüfung von Array-Grenzen.
 
notused:
Offensichtlich berechnet der Compiler Beschränkungen, die sich aus der Multiplikation aller Dimensionen ergeben (3 * 7 * 7 = 147) und nicht aus jeder einzelnen. Wenn beispielsweise i1 die Zahl 8 zugewiesen wird, erzeugt Print dennoch einige Werte. Offensichtlich handelt es sich um einen Compilerfehler bei der Überprüfung von Array-Grenzen.

Die Bereichsüberschreitung stammt nicht vom Compiler. Dies ist ein Laufzeitfehler.

Das Laufzeitsystem hat dummerweise den Offset berechnet und es wird nichts passieren, wenn falsche Indizes in die Berechnung einbezogen wurden, aber Sie haben die Grenzen des Arrays nicht überschritten. Wenn Sie jedoch die Indizes auf intelligente Weise prüfen, und zwar jeden einzelnen, erhalten Sie konkrete Verzögerungen bei der Ausführung.

Документация по MQL5: Стандартные константы, перечисления и структуры / Коды ошибок и предупреждений / Ошибки времени выполнения
Документация по MQL5: Стандартные константы, перечисления и структуры / Коды ошибок и предупреждений / Ошибки времени выполнения
  • www.mql5.com
Стандартные константы, перечисления и структуры / Коды ошибок и предупреждений / Ошибки времени выполнения - Документация по MQL5