Perilaku String Aneh
Results 1 to 8 of 8

Thread: Perilaku String Aneh

  1. #1
    Adakah yang menemukan yang berikutnya

    Saya punya naskah dengan deklarasi berikut

    simbol string = XXXXXX;
    string open = Mulai; string stop = stop; string takeP = take;
    dua kali lipat [3];
    Data int [1];

    Saya kemudian memanggil DLL Diumumkan sebagai berikut

    Kekosongan Dapatkan Param Query (simbol string, string terbuka, string stop, string takeP,
    dua kali lipat [], int Data []);

    Nilai-nilai yang dikembalikan dalam DLL Diantisipasi yaitu nilai-nilai default untuk simbol, terbuka, berhenti dan takeP Apakah berubah Tapi jika saya kemudian melakukan Evaluasi berikutnya

    if (buka! = mulai)
    Printing (NE);
    lain
    Percetakan (EQ);

    tes gagal dan saya dapat mencetak EQ

    Setiap ide apa yang terjadi dan dapat diperbaiki tanpa kerja yang berantakan

    Terima kasih

  2. #2

    Quote Originally Posted by ;
    Jika saya mengerti dengan benar saya menyalin informasi ke memori yang dialokasikan dengan skrip
    Anda tidak bisa yakin bagaimana metatrader menangani string secara internal. Mungkin DLL Anda hanya akan mendapatkan pointer ke beberapa C compliant (diakhiri) salinan string yang akan dibuang setelah panggilan dan menyimpan string dengan cara yang sama sekali berbeda. Ini manajer tumpukan membuat klon untuk operasi dan akan mengelola referensi, mungkin mereka string Pascal dan bukan string C, atau mereka menggunakan perpustakaan string yang beroperasi sepenuhnya dengan unicode atau sesuatu seperti ini. Siapa tahu? Itu tidak didokumentasikan di mana saja! Anda mencoba untuk memanipulasi struktur data metatrader sendiri melalui antarmuka yang tidak terdokumentasi! Yang Anda benar-benar ingin melakukan ini tidak dapat dilakukan dengan cara tradisional?
    Quote Originally Posted by ;
    agak membingungkan saya setuju tapi saya menggunakan deret Derajat untuk melewatkan nilai sebenarnya. Senar adalah untuk tujuan lain sepenuhnya
    Tidak dapat dikodekan dalam nilai integer? Jika string ini mewakili sejumlah perintah atau status yang terbatas, maka encode mereka. Buat konstanta untuk masing-masing dan setiap kemungkinan kontrol atau mode atau status atau apa pun untuk pembacaan yang jauh lebih baik, seperti yang dilakukan di metatrader juga: (OP_BUY, OP_SELL, MODE_FOO, MODE_BAR, dll.). Memanfaatkan string untuk hal-hal seperti itu tampaknya aneh. Ada alasan mengapa hal ini tidak dilakukan seperti itu. (kecuali PHP mungkin, karena kiddies PHP tidak tahu apa itu konstanta)

  3. #3

    Quote Originally Posted by ;
    if (open!) = start) Print (NE); Cetak lain (EQ); tes gagal dan saya menerima EQ yang diterbitkan
    Mengapa Anda tidak memberi tahu kami apa yang termasuk dalam faktor terbuka setelah panggilan? Apakah Anda yakin Anda bisa lulus string sebagai pointer (karena Anda jelas mengambil tindakan), apakah mereka diubah dalam DLL Anda dan masih bekerja di MT4 tanpa menghasilkan pelanggaran akses? Bisakah Anda mengalokasikan memori baru untuk seri baru di DLL Anda? Mengapa Anda tidak menggunakan string melainkan dapat mengembalikan pointer baru itu? Siapa yang bertanggung jawab untuk membebaskan memori yang baru dialokasikan ini? Dan pertanyaannya: Mengapa Anda melakukan ini dengan string?

  4. #4

    Quote Originally Posted by ;
    Mengapa Anda tidak memberi tahu kami apa yang ditemukan dalam variabel terbuka setelah panggilan?
    Pada dasarnya mungkin apa pun misalnya serangkaian 4 karakter abcd
    Quote Originally Posted by ;
    Apakah Anda yakin bahwa Anda dapat lulus string sebagai pointer (karena Anda jelas mengambil tindakan), apakah mereka diubah dalam DLL Anda dan kemudian masih bekerja di MT4 tanpa membuat pelanggaran akses?
    Yah saya tidak punya AV. Dan semua berfungsi dengan baik karena saya memberikan memori yang cukup untuk faktor-faktor dalam skrip saya (yaitu itulah alasan mengapa saya mengatur nilai default) setidaknya sejauh nilai yang dikembalikan khawatir Ini adalah fungsi perbandingan yang gagal Namun ada sesuatu yang jelas salah dalam asumsi saya dan mungkin ingin tahu apakah saya bisa lewat string dengan cara ini seperti yang saya lakukan dengan ganda dan bilangan bulat (seperti array bagaimanapun)
    Quote Originally Posted by ;
    Apakah Anda mengalokasikan memori baru ke seri baru pada DLL Anda?
    Jika saya mengerti dengan benar saya menyalin informasi ke memori yang dialokasikan oleh skrip
    Quote Originally Posted by ;
    Mengapa Anda tidak menggunakan string melainkan dapat mengembalikan pointer baru itu? Siapa yang bertanggung jawab untuk membebaskan memori yang baru dialokasikan ini?
    Memanfaatkan seri tidak memberikan AV dan seperti saya mengerti semua memori dikelola oleh skrip
    Quote Originally Posted by ;
    Dan pertanyaan utamanya: Mengapa di dunia ini Anda melakukannya dengan string sama sekali?
    Sedikit membingungkan, saya setuju tetapi saya menggunakan larik Levels untuk memberikan nilai yang sebenarnya. String adalah untuk tujuan berikut

  5. #5

    Quote Originally Posted by ;
    Apa yang Anda ingin lakukan ini tidak dapat dilakukan dengan cara konvensional?
    Jadi apa cara konvensional untuk melewati beberapa nilai seri kembali dari DLL (saya menggunakan Delphi7 dari jalan) saya mengambil saya bisa melakukan pekerjaan di sekitar saat Anda menjelaskan menggunakan bilangan bulat tetapi saya telah memahami bahwa urutan dapat dilewatkan sebagai pointer ke dalam memori cekal
    http://docs.mql4.com/basis/variables/extfunctionsTerima kasih

  6. #6

    Quote Originally Posted by ;
    Jadi apa cara tradisional untuk melewati beberapa nilai seri kembali dari DLL (saya menggunakan Delphi7 dari jalan) saya ambil saya bisa melakukan pekerjaan di sekitar seperti yang Anda gambarkan menggunakan bilangan bulat tetapi saya tahu bahwa string mungkin dilewatkan sebagai pointer ke jam blok memori
    http://docs.mql4.com/basis/variables/extfunctionsJatuh tempo
    ada sesuatu yang ditulis tentang pointer ke blok memori dan sesuatu yang terdengar seperti string pascal, itu tidak masuk akal (mungkin lebih masuk akal dari rusia asli) ditambah mereka tidak membahas mengubah seri untuk digunakan nanti oleh script mql4 sama sekali. Apa yang bisa saya katakan dari pengalaman saya sendiri adalah bahwa string yang dilewatkan ke DLL hanya akan menjadi pointer ke string yang dihentikan. Untuk ini, Anda akan menggunakan formulir PChar di Pascal. Saya sudah punya satu kasus di mana saya merasa perlu untuk mengembalikan seri dari dll ke dalam skrip dan saat itulah saya menulis pengikat python saya sendiri. Fungsi mengembalikan nilai objek string python ke skrip mql4 panggilan tampak seperti ini: Fungsi Kode Tersemat PyGetString (item: PPyObject): # 91; color = Red # 93; PChar # 91;color # 93 ;; stdcall; var gs: TGILState; begin gs: = PyGILState_Ensure (); PyGetString: = PyString_AsString (item); PyGILState_Release (gs); akhir; (Anda dapat menemukan kode sumber lengkap (LazarusFPC) yang dilampirkan sebagai file .rar di bagian akhir situs:
    http://sites.google.com/site/prof/me...on-integration) Di atas akan mengembalikan pointer ke seri (terbuat dari python DLL), hanya menggunakan nilai kembalian. MT4 akan menyalin string ke dalam memori itu sendiri dari pointer. Setelah saya merekomendasikan cara tradisional saya berbicara dengan cara tradisional untuk memecahkan masalah, bukan cara tradisional mengembalikan string. Cara tradisional untuk memecahkan masalah (apa pun itu) mungkin tidak akan termasuk penggunaan string yang dikembalikan ke skrip. Karena itu di sini pertanyaannya lagi?

  7. #7
    Sebagai 7Bit menyatakan Anda memanipulasi memori yang Anda (DLL) havent dialokasikan dan Anda juga tidak tahu bagaimana menangani MQL dengan mengalokasikan memori ke dalam string atau cara itu menyimpan ukuran hidup (rentang) String MQL tstr; tstr = DLLreturnNullString (); Ini berfungsi karena MQL telah diberikan pointer ke string Term (yang dialokasikan memori DLL Anda untuk mendapatkan) MQL kemudian berurusan dengan mengalokasikan sendiri memori dan daftar alokasi internaldaftar ukuran string dan menyalin data ke memori MQL baru. Setiap hal baik karena Anda mengizinkan MQL membuat salinan string sendiri. MQL String tstr; DLLchangethisString (tstr); Ini berbahaya karena beberapa alasan: A) Anda tidak tahu berapa banyak memori (jika ada) MQL telah dialokasikan ke penunjuk yang Anda terima DLL. B) Jika Anda mengubah string maka MQL tidak akan mengetahuinya dan jika Anda mengubah jaraknya maka MQL tidak akan memperbarui sendiri 'knowlegde' dari panjang string C) jika Anda mencoba untuk mengubah atau membaca string dan ukuran di atas memori yang MQL dialokasikan untuk itu maka Anda memiliki kesalahan perlindungan D) Dalam pengalaman saya, sementara MQL memungkinkan string untuk upto 64KB dalam ukuran Im yakin memori tidak selalu dialokasikan sebagai satu blok memori yang berdekatan. Jika Anda tetap berada di jalur ini (dan saran id untuk tidak) cara terbaik adalah MQL int len; String tstr =;/pad upto 255 karakter dalam waktu definisi sehingga memori telah dialokasikan DLLchangethisString (len, tstr); Print (StringSubstr (tstr, 0, len)); Dengan cara ini, DLL Anda mengembalikan panjang string ini sehingga Anda memiliki pengetahuan tentang rentang barunya. Saya telah melihat sebuah header C yang merinci struktur rantai MQL (tetapi tidak pernah menggunakannya) yang menyinggung bagaimana panjang string disimpan dalam INT (4 Bytes) sebelum awal string. Jadi dalam DLL Anda, Anda dapat mencoba mengurangi pointer String yang disediakan oleh MQL (oleh 4 byte) dan juga menulis sebuah integer untuk lokasi memori untuk menentukan panjang baru BAGAIMANA Ive tidak pernah mencobanyatidak tahu ketika im benar dengan ini dan itu saya tidak akan menyarankan melakukannya karena Anda mengotak-atik pengetahuan MQL tentang apa yang dilakukan dengan String ini jika Anda mengubah rentangnya dari 255 menjadi 10, maka MQL mungkin akan membocorkan memori yang sudah tidak diketahui oleh DLL Anda.

  8. #8
    OK Guys terima kasih atas bantuan itu tampaknya dokumen MQL tidak jelas. Saya sekarang akan Berkonsentrasi untuk mengembalikan string baru di DLL (sebagai panggilan Fungsi di Delphi) daripada mengubah yang sudah ada dan saya akan melihat membatasi penggunaan string selama 7Bit menyarankan

Similar Threads

  1. Mengubah string menjadi datetime
    By Ahybehtcgehwz in forum Pembicaran Bitcoin dan Mata Uang Kripto
    Balasan: 8
    Postingan Terakhir: 10-05-2022 10:38, 10:38 AM
  2. Perilaku tester MT4Strategi yang aneh diamati
    By jesusmt55 in forum Pembicaran Bitcoin dan Mata Uang Kripto
    Balasan: 18
    Postingan Terakhir: 11-23-2021 16:48, 04:48 PM
  3. Perilaku Pasar Sesi Perdagangan Asia
    By Cegoox04 in forum Diskus Forex Umum
    Balasan: 0
    Postingan Terakhir: 08-06-2019 09:44, 09:44 AM
  4. Membaca string dalam DLL
    By Wewunde in forum Pembicaran Bitcoin dan Mata Uang Kripto
    Balasan: 0
    Postingan Terakhir: 11-01-2012 03:48, 03:48 AM
  5. Perilaku String Aneh
    By gahys in forum Pembicaran Bitcoin dan Mata Uang Kripto
    Balasan: 7
    Postingan Terakhir: 11-27-2009 06:08, 06:08 AM

Izin Posting

  • Anda tidak boleh memposting thread baru
  • Anda tidak boleh memposting balasan
  • Anda tidak boleh memposting lampiran
  • Anda tidak boleh menyunting postingan Anda
  •  
  • Kode BB Aktif
  • Smilies Aktif
  • Kode [IMG] Aktif
  • Kode [VIDEO] Aktif
  • Kode HTML tidak aktif
This website uses cookies
We use cookies to store session information to facilitate remembering your login information, to allow you to save website preferences, to personalise content and ads, to provide social media features and to analyse our traffic. We also share information about your use of our site with our social media, advertising and analytics partners.