Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Pisanie własnej funkcji


Rekomendowane odpowiedzi

Opublikowano

Czy jest możliwe aby zawarty w pliku tekstowym kod był dołączony do skryptu i wykonywany jako funkcja o nazwie tego pliku tekstowego?

Opublikowano

Nie, no chyba że osoba która to uruchomi ma AutoiT

Mózg to nie mydło; nie ubędzie Ci go, gdy go użyjesz.

Opublikowano

jest.

Można użyć execute()

 

execute() wykonuje kod.

np jesli w pliku tekstowym będzie tresc

 

func lol()
mouseclick("left")
endfunc

to zstanie dodana funkcja lol()

Opublikowano

@UP był szybszy....

 

 

 

Myślę, że chodzi mu o to, że np. ma plik testowa.txt:

 

MsgBox(0,"","Testowa.txt")

 

I Kod, który ma wyczytać ten plik tekstowy (Czyli MsgBox(...)) i ma uruchomić tego oto MsgBox'a.

 

#EDIT

 

Takie cuś:

 

read()

Func Read()
$File = FileOpen("testowa.txt",0)
$funkcja = FileRead($File)
MsgBox(0,"",$funkcja)
Execute($Funkcja)
EndFunc

1352970251-U713459.png

By Maxiu
"Because limits, like fears, are often just an illusion"

Opublikowano

No to teraz logicznie pomyśleć, co za program wykona akcje jeśli nie ma AutoIt ?

 

Exek to gotowy program a nie cała zawartość kompilatora Autoit

 

Chyba że autorowi pytania chodziło o zwykły INCLUDE , czyli funkcje w pliku zewnętrznym

Mózg to nie mydło; nie ubędzie Ci go, gdy go użyjesz.

Opublikowano

Ja zrozumiałem, że on chce wyczytać funkcję z pliku tekstowego (Skrypt jest .exe i odpala to z .txt, osoba odpalające exe nie musi mieć AutoIT na kompie, a może edytować funkcję)

 

Choć według mnie to to samo, co własny UDF czy cuś takiego, tyle że osoba, która będzie odpalać skrypta nie będzie mogłą edytować, tak jak przy pliku .txt (Choć gdyby pomyśleć to .au3 to takie .txt, więc ja już nic nie wiem :P)

1352970251-U713459.png

By Maxiu
"Because limits, like fears, are often just an illusion"

Opublikowano
No to teraz logicznie pomyśleć, co za program wykona akcje jeśli nie ma AutoIt ?

Autoit jest językiem interpretowanym. Interpreter jest pakowany do exeka razem z kodem.

 

Chyba że autorowi pytania chodziło o zwykły INCLUDE , czyli funkcje w pliku zewnętrznym

Nie o to chodzi.

 

Możesz też w pliku zawrzeć samą treść. A do execute dodać na początku func nazwapliku() .... endfunc

Opublikowano

No tak, ale by zostały wykonane funkcje należy dodać wszystkie potrzebne pliki include jakie zawierają funkcje które zostaną użyte we wczytywanym pliku tekstowym

 

Na poziomie tworzenia skryptu ( np w Scite ) jeśli dodaje się zewnętrzne funkcje z innych plików to tylko dopisując odnośnik do tego pliku ( include ) zostanie on dodany do zawartości exeka w czasie kompilacji

Mózg to nie mydło; nie ubędzie Ci go, gdy go użyjesz.

Opublikowano

@up.

Niekoniecznie. Po części nie miałem racji, bo nie można zawrzeć całej definicji funkcji w pliku i użyć execute.

 

jednak można tak

 

MsgBox(64, '', fileread("lols.txt"))
func lol()
execute(FileRead("lols.txt"))
endfunc
lol()

w pliku lols.txt jest

send("AAAAAA")

Opublikowano

Nie, no chyba że osoba która to uruchomi ma AutoiT

Osoba, która to uruchamia ma AutoIt, ponieważ to uruchamia.

jest.

Można użyć execute()

 

execute() wykonuje kod.

Execute parsuje wyłącznie jedną linię (instrukcję).

Wszystko, co wykona execute, zostanie wykonane we we własnym scope (nie będziesz miał dostępu do przeparsowanej funkcji [a raczej zmiennej, bo funkcja nie jest jednolinijkowa] z głównego skryptu)

I Kod, który ma wyczytać ten plik tekstowy (Czyli MsgBox(...)) i ma uruchomić tego oto MsgBox'a.

Myślę, że nie masz pojęcia o czym mówisz.

No to teraz logicznie pomyśleć, co za program wykona akcje jeśli nie ma AutoIt ?

 

Exek to gotowy program a nie cała zawartość kompilatora Autoit

 

Chyba że autorowi pytania chodziło o zwykły INCLUDE , czyli funkcje w pliku zewnętrznym

Już po prostu zamilknij.

 

 

 

- - - - - - - -

 

Odpowiedź na pytanie autora tematu:

Istnieje na to jeden sposób.

 

Zacznij poszukiwania tutaj:

http://www.autoitscript.com/autoit3/docs/intro/running.htm

 

Form3: Compiled.exe [/ErrorStdOut] [/AutoIt3ExecuteScript file] [params ...]

Execute another script file from a compiled AutoIt3 Script File. Then you don't need to fileinstall another copy of AutoIT3.exe in your compiled file.

 

Oczywiście, jak pisałem wyżej, każdy skrypt odpala się w innym scope.

Musisz więc stworzyć plik (główny program)

main.au3, w którm wywołasz funkcję napisana()

 

Następnie plik

 

compile.au3 (wszystko poniżej tyczy się właśnie tego pliku, cała reszta zawsze była i będzie tekstem )

 

będzie pobierał zawartość pliku main.au3, escape'ował ze wszystkich znaków przerwania linii ( @CR, @LF, @CRLF ), owijał w cudzysłowy, zapisywał do pliku

temp.au3

jako zmienną

$string_zawartosc_pliku_main_au3

 

Następnie dodasz do pliku temp.au3 następujące instrukcje (PSEUDOKOD)

 

$sFunkcjaUzytkownika = "Func napisana()" & @CRLF & FileRead ( "uzytkownika.txt" ) & @CRLF & "EndFunc" ;
$sFinalnyKod = $sFunkcjaUzytkownika & _
  @CRLF & _  
  ___zamien_escaped_charachters_na_znaki_przerwania_linii ( $string_zawartosc_pliku_main_au3 )

FileCreate ( "tymczasowy_stworzony_przez_exe.txt " ) 
FileWrite ( $sFinalnyKod ) 

Run ( @AutoitEXE & " -tymczasowy_stworzony_przez_exe.txt" ) ; albo coś takiego

 

Na sam koniec compile.au3 skompilujesz plik temp.au3 jako .exe - GOTOWE!

Ta sygnatura jest pusta.

Opublikowano

zobacz jak to wygląda, przenieś kod

asm do notatnika a c do autoita

filereadline stringbeetwen i case _filecountlines stringstr(znajduje nazwe w tekscie)

najłatwiejszy sposób

 

 

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

 

class VM {

public:

unsigned int r[4];

unsigned int ram[0x1000];

unsigned char bytecode[0x1010];

bool exit_now;

 

bool LoadBytecode(const char *fname) {

memset(bytecode, 0xff, sizeof(bytecode)); // gexit

FILE *f = fopen(fname, "rb");

if(!f) return false;

fread(bytecode, 1, 0x1000, f);

fclose(f);

return true;

}

 

void Run() {

memset(ram, 0, sizeof(ram));

memset(r, 0, sizeof?);

 

unsigned int ip = 0;

exit_now = false;

while(!exit_now && ip < 0x1000) {

ip ++;

switch(bytecode[ip - 1]) {

case 0xff: exit_now = true; break;

case 0x00: r[bytecode[ip]] +=

r[bytecode[ip+1]]; ip += 2; break;

case 0x01: r[bytecode[ip]] -=

r[bytecode[ip+1]]; ip += 2; break;

case 0x10: scanf("%i", &r[bytecode[ip]]); ip++; break;

case 0x20: printf("%.8x\n", r[bytecode[ip]]); ip++; break;

case 0x30: ram[r[0]] = r[bytecode[ip]]; ip++; break;

case 0x31: r[bytecode[ip]] = ram[r[0]]; ip++; break;

case 0x32: r[bytecode[ip]] =

*(unsigned int*)&bytecode[ip+1];

break;

 

}

}

 

}

};

 

int

main(int argc, char **argv) {

VM vm;

vm.LoadBytecode("asdf");

vm.Run();

return 0;

}

 

 

 

 

; nasm (netwide assembler)

; 4 rejestry r0, r1, r2, r3 == 32-bit

; 00 01 02 03

; RAM -- 0x1000, per byte

; 00 gadd rA, rB ; A += B

; 01 gsub rA, rB ; A -= B

; 10 gin rA ; A <--- load from user

; 20 gout rA ; A -----> show user

; 30 gst rA ; *r0 = rA

; 31 gld rA ; rA = *r0

; 32 gconst rA, imm ; rA = imm32

; ff gexit

; <opcode> [arg1] [arg2]

; arg1 == r

; arg2 == r | imm

 

%define gexit db 0xff

%define gadd(a, B) db 0, a, b

%define gsub(a, B) db 1, a, b

%define gin(a) db 0x10, a

%define gout(a) db 0x20, a

%define gst(a) db 0x30, a

%define gld(a) db 0x31, a

 

%macro gconst 2

db 0x32, %1

dd %2

%endmacro

 

gin(1)

gin(2)

gadd(1,2)

gconst 3, 0x33333333

gadd(1,3)

gout(1)

gexit

 

np. notatnik

jazda(0,"","")

 

kod

tablica (podajesz tutaj nazwy funkcji które masz)

zmienna = _filecountlines(nazwa pliku)

for i = 1 to zmienna

ble = filereadline(handle,i<nie pamietam kolejnosci F1>)

for z = 0 to unbound(tablica) -1

if stringstr(ble,tablica[z]) then

słicz tablica[z]

case jazda

aha = strinbeetwen(ble,"(",")")

msgbox(aha)

endsłicz

 

oczywiście kod nie jest poprawny więc musisz sam go poprawić xD takak podpowiedź : niektóre funkcje zwracają wartość w tablicach ;d

możesz też zmieniać sobie kolejność flag stringbeetwenem

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...