und wieder dll und Markt - Seite 31

 
Andrei Trukhanovich:

Ich will damit sagen, dass es keine Rolle spielt.

Ihr Code funktioniert (fast) für Russisch).

Die Aufmerksamkeitsspanne ist anscheinend eingeschlafen ))

 
Реter Konow:

Bitte sehr!

Übrigens, ich muss TC sagen, dass dieser:

Ein sehr seltsamer Eintrag. Warum wird die Größe des Post-Arrays auf so seltsame Weise angegeben? Die FunktionStringToCharArray setzt die richtige Größe für das dynamische Array selbst.ArrayResize scheint hier überflüssig zu sein.

Das ist genau das, was ich verstehe.

MQL5 Referenz / Datenumwandlung / StringToCharArray

Die Klemme 0 wird ebenfalls in das Ziel-Array kopiert, und die Größe des dynamischen Arrays kann nach Bedarf erhöht werden, um die Größe der Zeichenkette anzupassen.

 
Nikolai Karetnikov:

das ist genau das, was klar ist.

MQL5 Referenz / Datenumwandlung / StringToCharArray

Das Terminal 0 wird ebenfalls in das Empfänger-Array kopiert, und die Größe des dynamischen Arrays kann bei Bedarf an die Größe der Zeichenkette angepasst werden.

Ich bin sicherlich kein Programmier-Pedant, aber ändern Sie die Größe des Arrays durch wiederholtes Aufrufen der Funktion, die Zeichenfolge-zu-Zeichen-Konvertierung durchführt?)))

Das könnten Sie tun:

  int q = StringToCharArray(jsonbody,post,0,-1,CP_UTF8);
  ArrayResize(post, q - 1);

Andernfalls rufen wir die Umwandlung derselben Zeichenkette zweimal auf. Außerdem hebt das zweite Mal das erste Mal auf.

 

Beachten Sie auch das Wort "oder" in der Dokumentation:

[in] Anzahl der zu kopierenden Array-Elemente. Bestimmt die Länge der Ergebniszeichenkette. Die Voreinstellung ist -1, was bedeutet, dass bis zum Ende des Arrays kopiert wird oder die Klemme 0 getroffen wird. Die Klemme 0 wird auch in das Zielarray kopiert und die Größe des dynamischen Arrays kann bei Bedarf erhöht werden, um der Stringgröße zu entsprechen. Wenn die Größe des dynamischen Arrays größer ist als die Länge der Zeichenkette, wird die Größe des Arrays nicht verringert.

Wir wissen nicht, ob diese Terminalnull vorhanden ist oder nicht, aber wir reduzieren die Größe des Arrays post, so dass wir die schließende Klammer verlieren können, wenn keine Terminalnull vorhanden ist.

Es lohnt sich, die Integrität der in Zeichen umgewandelten Zeichenfolge durch Rückumwandlung zu überprüfen.

 
Ich habe es geschafft! Sagte "eins, zwei"))
 
#include <JAson.mqh>
void OnStart()
  {

   char    result[];
   char    post[];
   string  url="https://texttospeech.googleapis.com/v1/text:synthesize?key=AIzaSyCaLxPh84wXpLkT-zOE04MlvHj3JhLXU0w";
   string  headers;
   string  result_headers;
   int     status;
   
   
   string jsonbody;
   headers = "Content-Type: application/json";


  jsonbody = "{\"input\":{\"text\":\"one, two\"},\"voice\":{\"languageCode\":\"en-gb\",\"name\":\"en-GB-Wavenet-B\"},\"audioConfig\":{\"audioEncoding\":\"LINEAR16\"}}";  
  jsonbody = "{\"input\":{\"text\":\"раз, два, три, четыре, пять, вышел зайчик погулять\"},\"voice\":{\"languageCode\":\"ru-RU\",\"name\":\"ru-RU-Wavenet-B\"},\"audioConfig\":{\"audioEncoding\":\"LINEAR16\"}}";

 
   
  int q = StringToCharArray(jsonbody,post,0,-1,CP_UTF8);
  ArrayResize(post, q - 1);
  status=WebRequest("POST",url,headers,100000,post,result,result_headers);

   
   if(status==-1)
     {
      Print("Ошибка в WebRequest. Код ошибки  =",GetLastError());
      //---
      StringSetLength(url,StringFind(url,"/",8));
      MessageBox("Необходимо добавить адрес '"+url+"' в список разрешенных URL во вкладке 'Советники'","Ошибка",MB_ICONINFORMATION);
     }
   else
     {
      if(status==200)
        {
        CJAVal  CJasonResult;
        string lBase64String;
        char lBase64ResultArray[];
        char lBinaryDataArray[];
        char lkey[1];


        CJasonResult.Deserialize(result);
        lkey[0]=0;
        lBase64String = CJasonResult["audioContent"].ToStr();
        StringToCharArray(lBase64String,lBase64ResultArray,0,StringLen(lBase64String));
        CryptDecode(CRYPT_BASE64,lBase64ResultArray,lkey,lBinaryDataArray);
         //--- успешная загрузка
         PrintFormat("Файл успешно загружен, размер %d байт.",ArraySize(result));
         PrintFormat("Заголовки сервера: %s",result_headers);
         //--- сохраняем данные в файл
         int filehandle=FileOpen("result.wav",FILE_WRITE|FILE_BIN);
         if(filehandle!=INVALID_HANDLE)
           {
           
            //--- сохраняем содержимое массива result[] в файл
            FileWriteArray(filehandle,lBinaryDataArray,0,ArraySize(result));

            //--- закрываем файл
            FileClose(filehandle);
            PlaySound("\\Files\\result.wav");
           }
         else
            Print("Ошибка в FileOpen. Код ошибки =",GetLastError());
        }
      else
         PrintFormat("Ошибка загрузки '%s', код %d",url,status,result_headers);
     }
  }
 
Eins, zwei, drei, vier, fünf, der Hase ging spazieren! ))))
 
TC, du hast es geschafft. Das ist Ihr Erfolg! Nur ein kleiner Fehler im Code wurde übersehen. Ich habe es repariert und es funktioniert! ))))
 
Jetzt schlage ich vor, STT (Speach to Text) zu beherrschen, um eine Sprachsteuerung für den EA zu erstellen. Das Schema ist dasselbe: Wir stellen eine Verbindung zu einem Cloud-Dienst (z. B. Google) her und verwenden WebRequest, um einen "Live"-Textstrom aus der konvertierten Sprache anzufordern, den wir dann analysieren und an die Funktionalität senden. Das Ergebnis ist sehr innovativ.
 
Реter Konow:
Eins, zwei, drei, vier, fünf, der Hase ging spazieren! ))))

Ja! Es funktioniert!!! cool

Wir brauchen einfach mehr davonJasop.mqh

JP      0       05:05:49.668    22WebRequest (GBPNZD,H2)        Файл успешно загружен, размер 264457 байт.
MQ      0       05:05:49.668    22WebRequest (GBPNZD,H2)        Заголовки сервера: Content-Type: application/json; charset=UTF-8
DH      0       05:05:49.668    22WebRequest (GBPNZD,H2)        Vary: Origin
EN      0       05:05:49.668    22WebRequest (GBPNZD,H2)        Vary: X-Origin
OD      0       05:05:49.668    22WebRequest (GBPNZD,H2)        Vary: Referer
IO      0       05:05:49.668    22WebRequest (GBPNZD,H2)        Content-Encoding: gzip
ID      0       05:05:49.668    22WebRequest (GBPNZD,H2)        Date: Wed, 03 Jun 2020 02:05:48 GMT
MO      0       05:05:49.668    22WebRequest (GBPNZD,H2)        Server: ESF
GE      0       05:05:49.668    22WebRequest (GBPNZD,H2)        Cache-Control: private
EP      0       05:05:49.668    22WebRequest (GBPNZD,H2)        X-XSS-Protection: 0
MD      0       05:05:49.668    22WebRequest (GBPNZD,H2)        X-Frame-Options: SAMEORIGIN
CR      0       05:05:49.668    22WebRequest (GBPNZD,H2)        X-Content-Type-Options: nosniff
PP      0       05:05:49.668    22WebRequest (GBPNZD,H2)        Alt-Svc: h3-27=":443"; ma=2592000,h3-25=":443"; ma=2592000,h3-T050=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
QL      0       05:05:49.668    22WebRequest (GBPNZD,H2)        Transfer-Encoding: chunked
LI      0       05:05:49.668    22WebRequest (GBPNZD,H2)
JSON Serialization and Deserialization (native MQL)
JSON Serialization and Deserialization (native MQL)
  • www.mql5.com
ForecastOscilator_HTF The ForecastOscilator indicator with the timeframe selection option available in the input parameters. Flat_HTF The Flat indicator with the timeframe selection option available in the input parameters. FX5_SelfAdjustingRSI_HTF The...
Dateien:
result.zip  126 kb